Estirar y escalar fondo CSS


653

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

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')";

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.


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.


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 .


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%;
} 

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.


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/


¿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.


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.


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;
}

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;
}

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. */}

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/


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;
}

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;
}

0

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.