Estirar y escalar fondo CSS

653

¿Hay alguna manera de obtener un fondo en CSS para estirar o escalar para llenar su contenedor?

Lawrence Dol
fuente

Respuestas:

267

Para los navegadores modernos, puede lograr esto usando background-size:

body {
    background-image: url(bg.jpg);
    background-size: cover;
}

cover significa estirar la imagen vertical u horizontalmente para que nunca se repita.

Eso funcionaría para Safari 3 (o posterior), Chrome, Opera 10+, Firefox 3.6+ e Internet Explorer 9 (o posterior).

Para que funcione con versiones inferiores de Internet Explorer, pruebe estos CSS:

filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
-ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
Clemente
fuente
2
Para aclarar: lo que sugiere para los filtros para IE anteriores funciona solo en parte. Escala bien el ancho de la imagen, pero el escalado de altura sale mal al no restringirlo a nada. Cuanto más alta es la página, también lo es la imagen de fondo. problema, pero no podía ser de possibke para escalar la ventana a toda la pantalla de una forma que de fondo se escala aquí ?? Gracias por las respuestas!
3
Los filtros específicos de IE no son soluciones ideales, así que siéntete libre de condicionar para IE con alternativas CSS. Yo personalmente uso la "cubierta" CSS3 en mi propio sitio y funciona bien en dispositivos iOS, solo asegúrese de definir el ancho del dispositivo.
Clemente
99
La cubierta no estira el bg. 100% 100% sí.
neoswf
Estas soluciones funcionaron mejor para mí cuando no quería estirar la imagen ni horizontal ni verticalmente más de lo que es su resolución real. Gracias..!!
Sr. Noddy
1
NB: a partir de Chromium 78.0.3904.97, no es posible escalar imágenes svg de forma independiente a lo largo de cada eje. Puede que tenga que escalarlo y convertirlo en una imagen ráster.
Mike
567

Use la propiedad CSS 3background-size :

#my_container {
    background-size: 100% auto; /* width and height, can be %, px or whatever. */
}

Está disponible para navegadores modernos, desde 2012.

vinil
fuente
93
Para preservar la relación de aspecto de la imagen, debe usar "background-size: cover;" o "tamaño de fondo: contener;". He creado un polyfill que implementa esos valores en IE8: github.com/louisremi/background-size-polyfill
Louis-Rémi
66
Sé que esto tiene un año pero tengo que (reír y) estar de acuerdo con la parte de 'navegadores decentes'. Verifique todos sus navegadores, pero he tenido más problemas con IE que cualquiera de ellos.
ErocM
36
Tuve que configurar background-size: 100% 100%;para obtener el efecto deseado que buscaba, si eso ayuda a alguien más.
guanome
1
explicación de covery contain en MDN
mohas
2
Esto en realidad no funciona. La pregunta es llenar el contenedor, lo que significa que queremos que se estire para que no se repita. Esta respuesta, por otro lado, se repetirá en la dirección de la altura si la altura no cubre el área. "Estirar para llenar" significa estirar como sea necesario para que no se repita. La respuesta correcta es "cubrir" desde abajo. Eso realmente maneja el caso de que esto no lo haga.
gman
171

No es posible escalar una imagen con CSS, pero se puede lograr un efecto similar de la siguiente manera.

Use este marcado:

<div id="background">
    <img src="img.jpg" class="stretch" alt="" />
</div>

con el siguiente CSS:

#background {
    width: 100%; 
    height: 100%; 
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:100%;
}

y deberías haber terminado!

Para escalar la imagen para que tenga "sangrado completo" y mantener la relación de aspecto, puede hacer esto en su lugar:

.stretch { min-width:100%; min-height:100%; width:auto; height:auto; }

¡Funciona bastante bien! Sin embargo, si se recorta una dimensión, se recortará en un solo lado de la imagen, en lugar de recortarse de manera uniforme en ambos lados (y centrada). Lo probé en Firefox, Webkit e Internet Explorer 8.

SolidSmile
fuente
2
Esto funciona bien ... pero estaba buscando algo un poco más robusto (probablemente con JavaScript) que también lo centraba y ajustaba en función de si la imagen era horizontal o vertical. Si alguien tiene una solución en ese sentido, le encantaría un enlace ... ¡gracias!
Brian Armstrong
44
En caso de que alguien más esté interesado, esto pareció funcionar bien: buildinternet.com/project/supersized
Brian Armstrong
1
El centrado horizontal se puede hacer con margin: 0 autoactivado .stretch. Solo configurando widtho height, la relación de aspecto permanece igual. Intente usar max-widthy max-heightpara limitar el factor de zoom ...
Ronald
1
Esto no funciona para mí en ie8 / ie9, pero funciona en ie6 / ie7 (y, por supuesto, en todos los demás navegadores). En ie8 / ie9, la imagen solo se muestra durante aproximadamente 3/4 del div. ¿Alguien tiene el mismo problema?
3
Una falla con SO: no hay forma de marcar las respuestas que ya no son correctas, lo que lleva a personas como @Ullas a ser desviadas. Es fácil escalar fondos en todos los navegadores modernos. developer.mozilla.org/en/CSS/background-size
Glenn Maynard
161

Utilice el atributo de tamaño de fondo en CSS3:

.class {
     background-image: url(bg.gif);
     background-size: 100%;
}

EDITAR: Modernizr admite la detección de soporte de tamaño de fondo . Puede usar una solución de JavaScript escrita para trabajar, sin embargo, la necesita y cargarla dinámicamente cuando no hay soporte. Esto mantendrá el código mantenible sin recurrir a intrusivos hacks CSS para ciertos navegadores.

Personalmente utilizo un script para tratarlo usando jQuery, es una adaptación de imgsizer . Como la mayoría de los diseños que uso ahora usan ancho% 's para diseños de fluidos a través de dispositivos, hay una ligera adaptación a uno de los bucles (teniendo en cuenta los tamaños que no siempre son del 100%):

for (var i = 0; i < images.length; i++) {
    var image = images[i],
        width = String(image.currentStyle.width);

    if (width.indexOf('%') == -1) {
        continue;
    }

    image.origWidth = image.offsetWidth;
    image.origHeight = image.offsetHeight;

    imgCache.push(image);
    c.ieAlpha(image);
    image.style.width = width;
}

EDITAR: También te puede interesar jQuery CSS3 Finaliz [s] e .

Metalshark
fuente
3
Solo para enfatizar, Modernizr NO habilita la compatibilidad con el tamaño de fondo en los navegadores que no lo admiten de forma nativa. Simplemente tiene una práctica prueba de navegador cruzado para ello. Depende de usted fingir cuando la prueba devuelve falso.
Chris Moschini
34

Prueba el tamaño de fondo del artículo . Si usa todo lo siguiente, funcionará en la mayoría de los navegadores, excepto Internet Explorer.

.foo {
    background-image: url(bg-image.png);
    -moz-background-size: 100% 100%;
    -o-background-size: 100% 100%;
    -webkit-background-size: 100% 100%; 
    background-size: 100% 100%;
} 
alekwisnia
fuente
1
¡Gracias! Esto difiere de "background-size: cover"
Pavel Vlasov
1
esto se estiró para mí en el ipad, pero no escaló. Gracias por publicar.
Don Cote
1
Esto es ideal para hacer que el fondo se reduzca también. ¡Gracias!
beingalex
1
Si la imagen de fondo es un SVG, también es necesario especificar preserveAspectRatio="none"dentro del SVG. Más información sobre esto aquí . Demostración aquí .
Mentalista
puedes usar background-size: cover; adjunto de fondo: fijo; puedes escalarlo
Siraj Ahmed
15

No actualmente. Estará disponible en CSS 3 , pero llevará algún tiempo hasta que se implemente en la mayoría de los navegadores.

Eran Galperin
fuente
2
Gran artículo disponible en A List Apart: Supersize that Background, Please!
jensgram
3
-1 No creo que esta respuesta sea muy relevante ... y no ofrece una solución de ningún tipo.
Potherca
1
@Potherca esta respuesta era correcta en ese momento (hace casi 3 años).
Eran Galperin
44
Hay una razón por la que se muestra la fecha. Debe mantenerse para referencias históricas. ¿Vas a repasar todas las respuestas antiguas en el sitio y las rechazas? la respuesta sigue siendo correcta incluso si se ha agregado más información desde entonces. También tenga en cuenta que otras respuestas aquí básicamente dicen lo mismo (y algunas son incorrectas, dicen que es imposible). Tengo la sensación de que elegiste este porque tiene algunos votos.
Eran Galperin
3
No, elegí este ya que todo lo que hace es decir "La computadora dice que no" a pesar de que hay varias soluciones a este problema incluso en 2008 ;-)
Potherca
15
.style1 {
        background: url(images/bg.jpg) no-repeat center center fixed;
        -webkit-background-size: cover;
        -moz-background-size: cover;
        -o-background-size: cover;
        background-size: cover;
}

Trabaja en:

  • Safari 3+
  • Chrome lo que sea +
  • IE 9+
  • Opera 10+ (Opera 9.5 admite el tamaño de fondo pero no las palabras clave)
  • Firefox 3.6+ (Firefox 4 es compatible con la versión prefijada de no proveedor)

Además, puede probar esto para una solución ie

    filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='.myBackground.jpg', sizingMethod='scale');
    -ms-filter: "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='myBackground.jpg', sizingMethod='scale')";
    zoom:1;

Crédito a este artículo por Chris Coyier http://css-tricks.com/perfect-full-page-background-image/

Blowsie
fuente
¿Cómo es esto mejor o diferente que solo "background-size: cover"?
PKHunter
@PKHunter, no estoy seguro exactamente a qué se refiere. Se trata de utilizar background-size: cover, excepto con prefixeds navegador y una solución IE
Blowsie
8

En una palabra: no. La única forma de estirar una imagen es con el<img> etiqueta. Tendrás que ser creativo.

Esto solía ser cierto en 2008, cuando se escribió la respuesta. Hoy en día, los navegadores modernos admiten lo background-sizeque resuelve este problema. Tenga en cuenta que IE8 no lo admite.

Vilx-
fuente
66
@Blowsie - Lindo. Verifique la fecha de respuesta. El panorama del navegador ha cambiado un poco en los últimos 5 años.
Vilx-
5

Definir "estirar y escalar" ...

Si tiene un formato de mapa de bits, generalmente no es bueno (gráficamente hablando) estirarlo y tirar de él. Puede usar patrones repetibles para dar la ilusión del mismo efecto. Por ejemplo, si tiene un degradado que se aclara hacia la parte inferior de la página, usaría un gráfico de un solo píxel de ancho y la misma altura que su contenedor (o preferiblemente más grande para tener en cuenta la escala) y luego lo colocará en mosaico página. Del mismo modo, si el gradiente corriera por la página, tendría un píxel de alto y más ancho que su contenedor y se repetiría por la página.

Normalmente, para dar la ilusión de que se estira para llenar el contenedor cuando el contenedor crece o se contrae, hace que la imagen sea más grande que el contenedor. Cualquier superposición no se mostraría fuera de los límites del contenedor.

Si desea un efecto que se base en algo así como una caja con bordes curvos, entonces pegaría el lado izquierdo de su caja al lado izquierdo de su contenedor con suficiente superposición que (dentro de lo razonable) no importa cuán grande sea el contenedor, nunca se queda sin fondo y luego coloca una imagen del lado derecho de la caja con bordes curvos y la coloca a la derecha del contenedor. Por lo tanto, a medida que el contenedor se encoge o crece, el efecto de caja curva parece encogerse o crecer con él, de hecho no lo hace, pero da la ilusión de que es lo que está sucediendo.

En cuanto a hacer que la imagen se reduzca y crezca con el contenedor, necesitará usar algunos trucos de capas para que la imagen parezca funcionar como fondo y algunos JavaScript para cambiar su tamaño con el contenedor. No hay una forma actual de hacer esto con CSS ...

Si está utilizando gráficos vectoriales, me temo que está fuera de mi ámbito de especialización.

BenAlabastro
fuente
Estirar = Cambiar las dimensiones xey cambiando independientemente la relación de aspecto de la imagen, Escala = cambiar las dimensiones xey manteniendo proporcionalmente la relación de aspecto de la imagen.
Lawrence Dol
@SoftwareMonkey: como fondo, entonces no, no puede cambiar el estiramiento y la escala en el verdadero sentido de los términos en CSS directo. Tienes que usar varios trucos CSS para dar la ilusión de que esto es lo que está sucediendo como lo he descrito.
BenAlabaster
4

Esto es lo que he hecho de eso. En la clase de estiramiento, simplemente cambié la altura a auto. De esta manera, la imagen de fondo siempre tiene el mismo tamaño que el ancho de la pantalla y la altura siempre tendrá el tamaño correcto.

#background {
    width: 100%;
    height: 100%;
    position: absolute;
    margin-left: 0px;
    margin-top: 0px;
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}
Eduardo
fuente
2

Agrega una background-attachmentlínea:

#background {
    background-attachment:fixed;
    width: 100%; 
    height: 100%; 
    position: absolute; 
    margin-left: 0px; 
    margin-top: 0px; 
    z-index: 0;
}

.stretch {
    width:100%;
    height:auto;
}
usuario340273
fuente
2

Me gustaría señalar que esto es equivalente a hacer:

html { width: 100%; height: 100%; }
body { width: 100%; height: 100%; /* Add background image or gradient to stretch here. */}
Askani
fuente
2

Otra gran solución para esto es el Backstretch de Srobbin que se puede aplicar al cuerpo o a cualquier elemento de la página: http://srobbin.com/jquery-plugins/backstretch/

nickff
fuente
Nick, generalmente le pedimos que proporcione las partes más destacadas en su respuesta y que proporcione un enlace externo solo para obtener más detalles; esto ayuda a que las respuestas sigan siendo útiles en caso de rotura del enlace.
Lawrence Dol
1
Culpa mía. En términos generales, agregas backstretch al <head> de tu documento y luego lo inicializas así: $ (". Your-element"). Backstretch ("path / to / image.jpg");
nickff
2

Prueba esto

http://jsfiddle.net/5LZ55/4/

body
{ 
    background: url(http://p1.pichost.me/i/40/1639647.jpg) no-repeat fixed; 
    background-size: cover;
    -webkit-background-size: cover;
    -moz-background-size: cover;
    -o-background-size: cover;
}
user3383708
fuente
1

Un consejo adicional para el truco de SolidSmile es escalar (el cambio de tamaño proporcional) estableciendo un ancho y usando auto para la altura.

Ex:

#background {
    width: 500px;
    height: auto;
    position: absolute; 
    left: 0px; 
    top: 0px; 
    z-index: 0;
}

fuente
0

Use la border-image : yourimagepropiedad para configurar su imagen y escalarla a todo el borde de su pantalla o ventana.

Natesh Bhat
fuente