Cómo mantener la relación de aspecto usando la etiqueta HTML IMG

4 minutos de lectura

avatar de usuario
sunil kumar

Estoy usando una etiqueta img de HTML para mostrar una foto en nuestra aplicación. Establecí su atributo de alto y ancho en 64. Necesito mostrar cualquier resolución de imagen (por ejemplo, 256×256, 1024×768, 500×400, 205×246, etc.) como 64×64. Pero al establecer los atributos de alto y ancho de una etiqueta img en 64, no se mantiene la relación de aspecto, por lo que la imagen se ve distorsionada.

Para su referencia, mi código exacto es:

<img src="https://stackoverflow.com/questions/12912048/Runtime Path to photo" border="1" height="64" width="64">

  • posible duplicado de HTML/IE: estirar la imagen para ajustarla, conservar la relación de aspecto

    – Jonathan Reinhart

    19 de febrero de 2015 a las 5:37

  • En 2022, probablemente desee esta respuesta: stackoverflow.com/a/66618563/8806907 la relación de aspecto es compatible con todo excepto, por ejemplo: desarrollador.mozilla.org/en-US/docs/Web/CSS/…

    – lanzamiento

    23 de febrero a las 17:32

avatar de usuario
Nabo

No establezca la altura Y el ancho. Use uno u otro y se mantendrá la relación de aspecto correcta.

.widthSet {
    max-width: 64px;
}

.heightSet {
    max-height: 64px;
}
<img src="https://picsum.photos/200/250?grayscale" />

<img src="https://picsum.photos/200/250?grayscale" width="64" />

<img src="https://picsum.photos/200/250?grayscale" height="64" />

<img src="https://picsum.photos/200/250?grayscale" class="widthSet" />

<img src="https://picsum.photos/200/250?grayscale" class="heightSet" />

Otra opción que le da más flexibilidad es usar object-fit. Esto permite establecer dimensiones fijas para el img mientras que la imagen en sí se puede presentar de varias maneras diferentes dentro de el área definida.

img {
    width: 64px;
    height: 64px;
    border: 1px solid hotpink;
}

.fill {
  object-fit: fill;
}

.contain {
  object-fit: contain;
}

.cover {
  object-fit: cover;
}

.scale-down {
  object-fit: scale-down;
}
<img src="https://picsum.photos/200/500?grayscale" class="fill" />

<img src="https://picsum.photos/200/500?grayscale" class="contain" />

<img src="https://picsum.photos/200/500?grayscale" class="cover" />

<img src="https://picsum.photos/200/500?grayscale" class="scale-down" />

  • … pero ¿qué sucede si desea corregir tanto la altura como el ancho?

    – fatuhoku

    7 sep 2016 a las 15:41

  • Esto no tiene sentido para aplicaciones dinámicas. No se sabe si el ancho o el alto será de 64 px, ya que depende de la proporción de la imagen. ¿Por qué es esta la respuesta votada?

    – Königsberg

    31 de julio de 2018 a las 8:45

  • @Mär Esta pregunta era sobre imágenes de ancho y/o altura fijos. La capacidad de respuesta no era un requisito de la pregunta.

    – Nabo

    31 de julio de 2018 a las 8:48

  • El tamaño es fijo, la relación de aspecto no lo es, ya que la pregunta era específicamente sobre ningún imagen de ningún resolución. Incluyendo resoluciones inferiores a 64×64.

    – Königsberg

    31 de julio de 2018 a las 8:50

avatar de usuario
AKHIL P

aqui esta el de muestra

div{
   width: 200px;
   height:200px;
   border:solid
 }

img{
    width: 100%;
    height: 100%;
    object-fit: contain;
    }
<div>
  <img src="https://upload.wikimedia.org/wikipedia/meta/0/08/Wikipedia-logo-v2_1x.png">
</div>

  • Solo una nota para las personas que quieran usar esta solución: el ajuste de objetos no es muy compatible con los navegadores. No es compatible con IE o Edge en absoluto. Fuente: caniuse.com/#feat=object-fit

    – Sean Dawson

    2 de marzo de 2016 a las 2:56


  • Ahora compatible con Edge 16+, consulte la tabla: w3schools.com/css/css3_object-fit.asp

    –Eddy R.

    2 de febrero de 2020 a las 7:01

Establecer width y height de las imágenes a autopero limite ambos max-width y max-height:

img {
    max-width:64px;
    max-height:64px;
    width:auto;
    height:auto;
}

Violín

Si desea mostrar imágenes de tamaño arbitrario en los “marcos” de 64x64px, puede usar envoltorios de bloques en línea y posicionamiento para ellos, como en este violín.

  • No se escalará más allá del tamaño original, solo por debajo del tamaño original.

    – Königsberg

    31 de julio de 2018 a las 9:17

  • Esto funcionó DESPUÉS de que cambié el padre a “alinear elementos: centro”. El valor predeterminado de “elementos de alineación: estirar” tenía prioridad sobre “altura máxima”.

    – Trade-Ideas Felipe

    6 de junio de 2021 a las 17:45

avatar de usuario
lucio fonseca

<img src="https://stackoverflow.com/questions/12912048/Runtime Path to photo"
     style="border: 1px solid #000; max-width:64px; max-height:64px;">

avatar de usuario
Ankit Kumar Verma

Usar object-fit: contain en css del elemento html img.

ex:

img {
    ...
    object-fit: contain
    ...
}

avatar de usuario
Cobarde anónimo

Ninguno de los métodos enumerados escala la imagen al tamaño más grande posible que quepa en un cuadro mientras conserva la relación de aspecto deseada.

Esto no se puede hacer con la etiqueta IMG (al menos no sin un poco de JavaScript), pero se puede hacer de la siguiente manera:

 <div style="background:center no-repeat url(...);background-size:contain;width:...;height:..."></div>

Hay una nueva propiedad CSS aspect-ratio. Establece una relación de aspecto preferida para la caja, que se utilizará en el cálculo de tamaños automáticos y algunas otras funciones de diseño.

img {
  width: 100%;
  aspect-ratio: 16/9;
}

Es compatible con todos los navegadores bien distribuidos.
Enlace MDN: https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio

Y https://web.dev/relación-de-aspecto/ contiene buenos ejemplos del uso de esta propiedad

  • Esto es lo que vine a buscar. ¡Bendito CSS moderno!

    – Brad Turek

    14 oct 2021 a las 5:21

  • Esta debería ser la nueva respuesta aceptada.

    – lanzamiento

    23 de febrero a las 17:30

¿Ha sido útil esta solución?