¿Cómo puedo cambiar el tamaño de una imagen dinámicamente con CSS a medida que cambia el ancho / alto del navegador?

107

Me pregunto cómo podría cambiar el tamaño de una imagen junto con la ventana del navegador, esto es lo que he hecho hasta ahora (o descargar todo el sitio en un ZIP ).

Esto funciona bien en Firefox, pero tiene problemas en Chrome: la imagen no siempre cambia de tamaño, de alguna manera depende del tamaño de la ventana cuando se cargó la página.

Esto también funciona bien en Safari, pero a veces la imagen se carga con su ancho / alto mínimo. Tal vez esto se deba al tamaño de la imagen, no estoy seguro. (Si se carga bien, intente actualizar varias veces para ver el error).

¿Alguna idea sobre cómo podría hacer esto más a prueba de balas? (Si se necesita JavaScript, también puedo vivir con eso, pero es preferible CSS).

depi
fuente
Utilice consultas de medios CSS3 o el controlador de eventos window.onresize de JavaScript. w3schools.com/jsref/event_onresize.asp
Shahid
Si está utilizando bootstrap, agregue una clase como esta class = "img-thumbnail". Eso es todo.
VivekDev

Respuestas:

179

Esto se puede hacer con CSS puro y ni siquiera requiere consultas de medios.

Para hacer que las imágenes sean flexibles, simplemente agregue max-width:100%y height:auto. Imagen max-width:100%y height:autofunciona en IE7, pero no en IE8 (sí, otro error extraño de IE). Para solucionar este problema, debe agregar width:auto\9para IE8.

fuente: http://webdesignerwall.com/tutorials/responsive-design-with-css3-media-queries

CSS:

img {
    max-width: 100%;
    height: auto;
    width: auto\9; /* ie8 */
}

Y si desea aplicar un ancho máximo fijo de la imagen, simplemente colóquelo dentro de un contenedor, por ejemplo:

<div style="max-width:500px;">
    <img src="..." />
</div>

Ejemplo de JSFiddle aquí . No se requiere JavaScript. Funciona en las últimas versiones de Chrome, Firefox e IE (que es todo lo que he probado).

Kurt Schindler
fuente
Probé el enlace jsfiddle tanto con Opera 11 como con un Firefox reciente y, aunque cambia el tamaño de la imagen cuando la ventana se encoge, no lo hace cuando la ventana crece más allá de 650px
GDR
3
@GDR No quisiera que la imagen creciera más allá de su tamaño nativo, simplemente se pixelaría y se vería feo. Si necesita agrandar, comenzaría con una imagen más grande.
Kurt Schindler
Bien, entonces asumí incorrectamente que este es el punto de esta pregunta, lo siento.
RDA
2
Establecer el ancho máximo en 100% y la altura en automático no hizo nada por mí; de hecho, trabajé con un contenedor. Envuelva la imagen en un div, establezca el alto / ancho máximo y deje que la imagen (#div img {}) tenga un ancho del 100% y una altura del 100%.
Mave
1
¡¿Qué clase de brujería es esta?! ¡Esto es asombroso!
Leonardo Wildt
24

2018 y solución posterior:

El uso de unidades relativas a la ventana gráfica debería facilitarle la vida, dado que tenemos la imagen de un gato:

gato

Ahora queremos este gato dentro de nuestro código, respetando las relaciones de aspecto:

img {
  width: 100%;
  height: auto;
}
<img src="https://www.petmd.com/sites/default/files/petmd-cat-happy-10.jpg" alt="cat">

Hasta ahora no es realmente interesante, pero ¿y si quisiéramos cambiar el ancho de los gatos para que sea el máximo del 50% de la ventana gráfica?

img {
  width: 100%;
  height: auto;
  /* Magic! */
  max-width: 50vw;
}
<img src="https://www.petmd.com/sites/default/files/petmd-cat-happy-10.jpg" alt="cat">

La misma imagen, pero ahora restringida a un ancho máximo de 50vw vw (= ancho de la ventana gráfica ) significa que la imagen tendrá el ancho X de la ventana gráfica, según el dígito proporcionado. Esto también funciona para la altura:

img {
  width: auto;
  height: 100%;
  max-height: 20vh;
}
<img src="https://www.petmd.com/sites/default/files/petmd-cat-happy-10.jpg" alt="cat">

Esto restringe la altura de la imagen a un máximo del 20% de la ventana gráfica.

roberrrt-s
fuente
¡Gracias! ¿Cómo determino vh y vw cuando tengo imágenes con diferentes tamaños?
Herman Toothrot
Hola @HermanToothrot, ¿estás diciendo que quieres mantener la relación de aspecto mientras usas unidades de visualización?
roberrrt-s
@Roberrrt dice que tengo algunas imágenes de diferentes tamaños y en un bloque en línea, y quiero mantener la relación de aspecto de todas ellas pero configurándolas a la misma altura o ancho.
Herman Toothrot
O hacer ancho: 100% y altura máxima: 50vh o inversa
roberrrt-s
Ancho de @Roberrrt: el 100% no parece tener mucho efecto. Solo tengo que adivinar vh, en mi caso 50 es demasiado y 40 maximiza la altura de todas las imágenes.
Herman Toothrot
11
window.onresize = function(){
    var img = document.getElementById('fullsize');
    img.style.width = "100%";
};

En IE, el onresizeevento se activa con cada cambio de píxel (ancho o alto), por lo que podría haber problemas de rendimiento. Retrasar el cambio de tamaño de la imagen por unos milisegundos usando window.setTimeout () de JavaScript.

http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html

Shahid
fuente
6

Establezca la propiedad de cambio de tamaño en ambos. Entonces puedes cambiar el ancho y el alto de esta manera:

.classname img{
  resize: both;
  width:50px;
  height:25px;
}
fmoradi9
fuente
5

¿Estás usando jQuery?

Debido a que hice una búsqueda rápida en los conectores de jQuery y parecen tener algún complemento para hacer esto, verifique este, debería funcionar:

http://plugins.jquery.com/project/jquery-afterresize

EDITAR:

Esta es la solución CSS, solo agrego un estilo = "ancho: 100%" , y funciona para mí al menos en Chrome y Safari. No tengo ie, así que solo prueba allí y avísame, aquí está el código:

            <div id="gallery" style="width: 100%">
                <img src="images/fullsize.jpg" alt="" id="fullsize" />
                <a href="#" id="prev">prev</a>
                <a href="#" id="next">next</a>
            </div>
Arthur Neves
fuente
1
jQuery es innecesario para un problema tan simple. ¿Por qué sería beneficioso cargar 50 KB + (biblioteca completa) en unas pocas líneas de JS?
1
Claro, tienes toda la razón, s why Ile pregunto si está usando jQuery porque si lo hace, ¡sería una buena idea agregar el complemento!
Arthur Neves
entonces sin JS no es posible? Encontré una solución simple como esta , unstoppablerobotninja.com/search/… , sin embargo, no pude implementarla completamente en mi plantilla con éxito
depi
4

Inicialmente, estaba usando el siguiente html / css:

img {
  max-width: 100%;
  height: auto;
  width: auto\9; /* ie8 */
}
<div> 
  <img src="..." />
</div>

Luego agregué class="img"a algo <div> así:

<div class="img">
  <img src="..." />
</div>

Y todo empezó a funcionar bien.

Rin
fuente
2

Solo usa este código. Lo que la mayoría está falsificando es especificar el ancho máximo como el ancho máximo de la imagen

img {   
    height: auto;
    width: 100%;
    max-width: 300px;
}

Consulte esta demostración http://shorturl.at/nBKVY

Daniel Nyamasyo
fuente
0

Tratar

.img{
   width:100vw; /* Matches to the Viewport Width */
   height:auto;
   max-width:100% !important;
}

Solo funciona con bloque de visualización y bloque en línea, esto no tiene ningún efecto en los elementos flexibles, ya que acabo de pasar mucho tiempo tratando de averiguarlo.

Ryan Stone
fuente