Establecer tamaño en la imagen de fondo con CSS?

386

¿Es posible establecer el tamaño de la imagen de fondo con CSS?

Quiero hacer algo como:

background: url('bg.gif') top repeat-y;
background-size: 490px;

Pero parece que es totalmente incorrecto hacerlo así ...

Johan
fuente
Quizás sea posible. Vea Cómo: Imagen de fondo redimensionable .
Ricardo de la Vega

Respuestas:

621

CSS2

Si necesita agrandar la imagen, debe editarla en un editor de imágenes.

Si usa la etiqueta img, puede cambiar el tamaño, pero eso no le daría el resultado deseado si necesita que la imagen sea fondo para algún otro contenido (y no se repetirá como parece).

CSS3 desata los poderes

Esto es posible hacer en CSS3 con background-size.

Todos los navegadores modernos admiten esto, por lo que, a menos que necesite admitir navegadores antiguos, esta es la forma de hacerlo.
Navegadores compatibles:
Mozilla Firefox 4.0+ (Gecko 2.0+), Microsoft Internet Explorer 9.0+, Opera 10.0+, Safari 4.1+ (webkit 532) y Chrome 3.0+.

.stretch{
/* Will stretch to specified width/height */
  background-size: 200px 150px;
}
.stretch-content{
/* Will stretch to width/height of element */
  background-size: 100% 100%;
}

.resize-width{
/* width: 150px, height: auto to retain aspect ratio */
  background-size: 150px Auto;
}
.resize-height{
/* height: 150px, width: auto to retain aspect ratio */
  background-size: Auto 150px;
}
.resize-fill-and-clip{ 
  /* Resize to fill and retain aspect ratio.
     Will cause clipping if aspect ratio of box is different from image. */ 
  background-size: cover;
}
.resize-best-fit{
/* Resize to best fit and retain aspect ratio.
   Will cause gap if aspect ratio of box is different from image. */ 
  background-size: contain;
}

En particular, me gustan los valores covery containque nos dan un nuevo poder de control que no teníamos antes.

Redondo

También puede usar background-size: roundque tenga un significado en combinación con repetir:

.resize-best-fit-in-repeat{
/* Resize to best fit in a whole number of times in x-direction */ 
  background-size: round auto; /* Height: auto is to keep aspect ratio */
  background-repeat: repeat;
}

Esto ajustará el ancho de la imagen para que se ajuste varias veces en el área de posicionamiento del fondo.


Nota adicional
Si el tamaño que necesita es un tamaño de píxel estático, sigue siendo inteligente cambiar el tamaño físico de la imagen real. Esto es tanto para mejorar la calidad del cambio de tamaño (dado que su software de imagen hace un mejor trabajo que los navegadores) como para ahorrar ancho de banda si la imagen original es más grande de lo que se muestra.

temor
fuente
77
Tenga en cuenta que también está la cuestión de las pantallas de retina en iPad y iPhone y probablemente otros dispositivos de alta resolución por venir. Esto significa que puede valer la pena cambiar el tamaño de las imágenes más grandes usando CSS y usar múltiples archivos CSS y otros trucos para servir imágenes específicas. Buena introducción aquí: webmonkey.com/2012/03/…
Leo
Esta es la peor solución por ahora, ya que no todas las tiendas de comercio electrónico cambiarán el tamaño de la imagen como se sugiere. En 2009, lo más probable es que estuviera cerca de la mejor opción, ahora solo use los atributos de tamaño como se muestra a continuación.
ShaunOReilly
332

Solo CSS 3 admite eso,

background-size: 200px 50px;

Pero editaría la imagen en sí, para que el usuario necesite cargar menos, y podría verse mejor que una imagen reducida sin antialias.

Maertz
fuente
32
Desafortunadamente, la gente todavía usa ie8
Dean_Wilson
16
Vergüenza en Microsoft por su horrible navegador
Mahmoodvcs
background: url('resized_image.png')\9;
Final de
¡Este es el camino a seguir incluso en 2017!
Francisco Ochoa
También vine de 2017 y así es como lo hacemos.
Ska
23

Si sus usuarios usan solo Opera 9.5+, Safari 3+, Internet Explorer 9+ y Firefox 3.6+, entonces la respuesta es sí. De otra manera no.

La propiedad de tamaño de fondo es parte de CSS 3, pero no funcionará en la mayoría de los navegadores.

Para sus propósitos, solo agrande la imagen real.

Christopher Tokar
fuente
1
tamaño de fondo: 100%; posición de fondo: centro; - esto funciona en IE6 ejecutándose en mi máquina virtual en XP Home.
InnateDev
77
IE 6,7,8 no es 'la mayoría de los navegadores'.
Mahmoodvcs
1
Incluso en 2013, si bien el comentario "IE6,7,8 no es 'la mayoría de los navegadores'" podría ser en parte cierto con respecto a IE6; Desafortunadamente, IE7 e IE8 todavía tienen una participación de mercado bastante dominante. La mejor manera que he encontrado para hacer esto es usar Javascript en combinación con modernizr (u otro medio de etiquetar 'OLDIE').
AndrewPK
19

No es posible . El fondo siempre será tan grande como sea posible, pero puede evitar que se repita background-repeat.

background-repeat: no-repeat;

En segundo lugar, el fondo no entra en el área de margen de un cuadro, por lo que si desea que el fondo solo esté en el contenido real de un cuadro, puede usar margen en lugar de relleno.

En tercer lugar, puede controlar dónde comienza la imagen de fondo. De forma predeterminada, es la esquina superior izquierda de un cuadro, pero puede controlar eso con background-position, de esta manera:

background-position: center top;

o quizás

background-position: 20px -14px;

El posicionamiento negativo se usa mucho con los sprites CSS .

mikl
fuente
No, no es tan grande como puedo ser. Siempre es del mismo tamaño, pero necesito hacerlo más grande.
Johan
Bueno, eso no es posible. Puede haber opciones para hacerlo en futuras versiones de CSS, pero eso está muy lejos.
mikl
Esta respuesta es incorrecta. CSS3 tiene la propiedad de tamaño de fondo que es compatible con IE9 +.
Downpour046
3
Echa un vistazo a la marca de tiempo. En 2009, el tamaño del fondo no era más que un brillo en los ojos de WebKit. Si lo desea, puede actualizarlo, pero ya hay muchas otras respuestas que describen el tamaño del fondo.
mikl
12

No es demasiado difícil, si no tienes miedo de profundizar un poco :)

Hay un argumento olvidado :

background-size: contain;

Esto no estirará su background-imagecomo lo haría con cover. Se estiraría hasta que el lado más largo alcanzara el ancho o la altura del contenedor exterior y, por lo tanto, conservara la imagen.

Editar: También hay -webkit-background-sizey -moz-background-size.

La propiedad de tamaño de fondo es compatible con IE9 +, Firefox 4+, Opera, Chrome y Safari 5+.

- Fuente: Escuelas W3

emperador
fuente
4

En apoyo de la respuesta que dio @tetra, quiero señalar que si la imagen es un SVG, entonces no es necesario cambiar el tamaño de la imagen real.

Dado que un archivo SVG es solo XML, puede especificar el tamaño que desee que aparezca dentro del XML.

Sin embargo, si está utilizando la misma imagen SVG en diferentes lugares y necesita que sea de diferentes tamaños, entonces usar background-sizees muy útil. De todos modos, los archivos SVG son inherentemente más pequeños que las imágenes ráster y cambiar el tamaño sobre la marcha con CSS puede ser muy útil sin ningún costo de rendimiento que conozca, y ciertamente poca o ninguna pérdida de calidad.

Aquí hay un ejemplo rápido:

<div class="hasBackgroundImage">content</div>

.hasBackgroundImage
{
    background: transparent url('/image/background.svg') no-repeat 10px 5px;
    background-size: 1.4em;
}

(Nota: esto funciona para mí en OS X 10.7 con Firefox 8, Safari 5.1 y Chrome 16.0.912.63)

SunSparc
fuente
3

tamaño de fondo: 200px 50px cámbielo a 100% 100% y escalará según las necesidades de la etiqueta de contenido como ul li o div ... lo probé

mihai
fuente
3

Puedes hacerlo totalmente con CSS3:

body {
    background-image: url(images/bg-body.png); 
    background-size: 100%; /* size the background image at 100% like any responsive img tag */
    background-position: top center;
    background-repeat:no-repeat;
 }

Esto ajustará el tamaño de una imagen de fondo al 100% del ancho del elemento del cuerpo y luego cambiará el tamaño del fondo en consecuencia a medida que el elemento del cuerpo cambie el tamaño para resoluciones más pequeñas.

Aquí está el ejemplo: http://www.sccc.premiumdw.com/examples/resize-background-images-with-css/

Mike Sinkula
fuente
2

Solo tengo divs anidados para ser compatibles con el navegador cruzado

   
      <div>
         <div style="background: url('bg.gif') top repeat-y;min-width:490px;">
            Put content here
         </div>
      </div>
   
Cornelio Cordero
fuente
2

Puedes usar dos <div>elementos:

  • Uno es un contenedor (es el que originalmente quería que apareciera la imagen de fondo).

  • El segundo está contenido dentro. Establece su tamaño al tamaño de la imagen de fondo (o el tamaño que desea que aparezca).

El div contenido se configura para ser posicionado absolute. De esta manera, no interfiere con el flujo normal de elementos en el div que contiene.

Le permite usar imágenes de sprites de manera eficiente.

Ben Shomer
fuente
1

No puede establecer el tamaño de su imagen de fondo con la versión actual de CSS (2.1).

Sólo se puede establecer: position, fix, image-url, repeat-mode, y color.

knittl
fuente
1
put the below code in the body of you css file

background-image: URL('../images/wave-green-plain-colour.jpg') ;
-webkit-background-size: cover;
-moz-background-size: cover;
-o-background-size: cover;
background-size: cover;
width:100px;
Shwetha SH
fuente
1

Has escrito

background: url('bg.gif') top repeat-y;    
background-size: 490px;

pero solo verá el fondo según el tamaño del contenedor.

Si tiene un contenedor vacío con la URL de fondo y sea cual sea el tamaño del fondo, no verá el bg.gif.

Si establece el tamaño del continuo en

background: url('bg.gif') top repeat-y;    
background-size: 490px;
height: 490px;
width: 490px;

combinado con el código que escribió anteriormente, podrá ver el archivo bg.gif.

Carlos Calla
fuente
0

background-size funciona en Chrome 4.1, pero hasta ahora no pude hacerlo funcionar en Firefox 3.6.

plateado
fuente
0

Utilizo imágenes de fondo para botones, pero solo muestra la imagen del mismo tamaño que el texto, incluso si configuro el ancho y la altura. En cambio, relleno mi texto con&nbsp; caracteres (espacios que no se rompen). Bofeteé tantas veces como sea necesario, básicamente, hasta que aparece todo el fondo del botón. Entonces podría tener un código como este:

En la hoja de estilo:

#v2menu-home {
    background-image:url(../v2-siteimages/button.png);
    background-repeat:no-repeat;
}

En el documento HTML:

<div id="v2menu">
    <a id="v2menu-home" href="/index.php">home&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</a>
</div><!-- v2menu -->
Martin Thompson
fuente
2
Otra forma es establecer el tamaño del enlace al tamaño de la imagen de fondo. En la hoja de estilo, (bajo # v2menu-home en el ejemplo anterior) use display: block y configure la altura y el ancho allí. Eso realmente funciona. No hay necesidad de caracteres espaciales que no se rompan entonces.
Martin Thompson, el
0

Por ejemplo: la
imagen de fondo siempre se ajustará al tamaño del contenedor (ancho 100% y altura 100px).
CSS de navegador cruzado:

.app-header {
background: url("themes/default/images/background.jpg") no-repeat;
-moz-background-size: 100% 100px;
-webkit-background-size: 100% 100px;
-o-background-size: 100% 100px;
filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src = "themes/default/images/background.jpg", sizingMethod = 'scale');
background-size: 100% 100px;

}

skyrosbit
fuente
0

Esto es posible hacerlo en CSS3 con tamaño de fondo

.backgroungImage {
    background: url('../imageS/background.jpg') no-repeat;
    background-size: 32px 32px;
}
omkar khade
fuente
0

Si desea establecer background-sizela misma backgroundpropiedad, puede usar:

background:url(my-bg.png) no-repeat top center / 50px 50px;
Ratata Tata
fuente
No puedo probar, pero probablemente.
Ratata Tata
Pensé que los ipads no reconocían el fondo abreviado @ orlando-leite
DGRFDSGN