¿Cómo ajusto una imagen (img) dentro de un div y mantengo la relación de aspecto?

136

Tengo un div 48x48 y dentro de él hay un elemento img, quiero encajarlo en el div sin perder ninguna parte, mientras tanto se mantiene la relación, ¿se puede lograr con html y css?

Bin Chen
fuente

Respuestas:

70

Necesitará JavaScript para evitar recortes si no conoce la dimensión de la imagen en el momento en que escribe el CSS.

HTML y JavaScript

<div id="container">
    <img src="something.jpg" alt="" />
</div>

<script type="text/javascript">
(function() {

var img = document.getElementById('container').firstChild;
img.onload = function() {
    if(img.height > img.width) {
        img.height = '100%';
        img.width = 'auto';
    }
};

}());
</script>

CSS

#container {
   width: 48px;
   height: 48px;
}

#container img {
   width: 100%;
}

Si utiliza una biblioteca de JavaScript, puede aprovecharla.

Thomas
fuente
2
La respuesta de Michael es mucho más simple y no usa Javascript. Sin embargo, no sé acerca de la compatibilidad del navegador.
weberc2
3
No, la respuesta de Michael funciona siempre que la imagen sea más grande que la div. Si desea que la imagen llene el div con respecto al tamaño de la imagen (y, si no conoce el tamaño de la imagen de antemano, sí), este es el camino a seguir.
Rémy DAVID
2
¿No podría usar max-height: 100%; ancho máximo: 100%; ancho min: 100%; min-height: 100% y obtener el mismo resultado entonces? Pregunta honesta
Daniel Casserly
No, al hacerlo, fuerza que el ancho y la altura sean del 100%, por lo que cambia la relación de aspecto de la imagen.
gztomas
No se llamará a onload cuando la imagen se almacena en caché en el navegador, por lo que esto solo funcionará cuando la imagen se cargue por primera vez.
Redtopia
314

Úselo max-height:100%; max-width:100%;para la imagen dentro del div.

Miguel
fuente
44
@ZoveGames Navegadores no habilitados para JS? Las estadísticas de Yahoo de 2010 muestran un promedio de 1.3%. Creo que es seguro asumir que a. Probablemente hoy sea más bajo y b. programmers.stackexchange.com/questions/26179/…
EasyCo
55
No me funciona ... Hace que la imagen sea 100% de su propio tamaño (p. Ej .: 300px de ancho para una imagen que en realidad tiene 300px de ancho).
Tomáš Zato - Restablece a Mónica el
1
Hay un horrible error específico de Chrome en Windows que esto causa. Potencialmente alguna mala interacción con ciertos plugins de desplazamiento suave que tengo. Termina tratando de desplazar el cuerpo a pesar de que el mouse está sobre un overflow:scrolldiv con una imagen grande en él. Curioso. Aún más extraño: la solución de Max en realidad lo arregla. Estoy bastante harto de CSS, de verdad. Solía ​​ser poderoso y genial. Ahora las implementaciones solo producen inconsistencia con errores después de la inconsistencia con errores.
Steven Lu
21
solo funciona cuando se reduce una imagen. si quieres colocar una imagen pequeña en un contenedor más grande, esto no funcionará
Yossi Shasho
2
No conserva la relación de aspecto original de la imagen.
Ĭsααc t ի ε βöss
78

Desafortunadamente max-width + max-height no cubren completamente mi tarea ... Así que he encontrado otra solución:

Para guardar la relación de imagen mientras se escala, también puede usar la object-fitpropiedad CSS3.

Artículo útil: Controle las relaciones de aspecto de la imagen con CSS3

img {
    width: 100%; /* or any custom size */
    height: 100%; 
    object-fit: contain;
}

Malas noticias: IE no es compatible ( ¿Puedo usarlo? )

Andrii Verbytskyi
fuente
66
Esto debe ser marcado como la respuesta .. "object-fit" funcionó perfectamente.
Ĭsααc t ի ε βöss
Curiosamente, parece que el soporte para esto se introdujo en iOS 8.1, no 8.0.
rayo
2
object-fit: cover; trabajó para mi. Aquí: stackoverflow.com/questions/9071830/…
Deke
1
Si desea que la imagen esté en la parte superior izquierda en lugar de centrada, también debe usar la posición de objeto 0 0.
Chris Rae
Esta es la única respuesta que me funcionó para crear un fondo de imagen receptivo que llenó la pantalla manteniendo la relación de aspecto de la imagen.
Ray Li
39

Usando solo CSS:

div > img {
  width: auto;
  height : auto;
  max-height: 100%;
  max-width: 100%;
}
Max
fuente
no escala
JFFIGK
17

HTML

<div>
    <img src="something.jpg" alt="" />
</div>

CSS

div {
   width: 48px;
   height: 48px;
}

div img {
   display: block;
   width: 100%;
}

Esto hará que la imagen se expanda para llenar su padre, cuyo tamaño se establece en el divCSS.

alex
fuente
2
No agregue height: 100%, eso sesgará la relación de la imagen: el OP quiere mantener la relación.
casablanca
No estoy seguro de lo que significaba el OP, pero allí no mantendría la relación, ¿verdad?
Trufa
¿Qué puedo hacer para mantener la proporción? Si elimino la altura: 100%, la imagen se recortará.
Bin Chen
7

Estaba teniendo muchos problemas para que esto funcionara, cada solución que encontré no parecía funcionar.

Me di cuenta de que tenía que configurar la pantalla div para flexionar, así que básicamente este es mi CSS:

div{
display: flex;
}

div img{ 
max-height: 100%;
max-width: 100%;
}
Bartho Bernsmann
fuente
Mis imágenes están distorsionadas con esta solución en Chrome Versión 61
Yevgeniy Afanasyev
Tal vez su div tiene un conjunto de altura máxima / altura o ancho, y eso está causando la distorsión de su imagen.
Bartho Bernsmann
Exactamente mi punto .. La imagen está distorsionada porque está configurando el ancho y la altura en su <div class = "w">
Bartho Bernsmann
Para su ejemplo ... Creo que está buscando algo como en su imagen CSS: height: auto; ancho: 100%;
Bartho Bernsmann
la tarea consistía en encajar la imagen en un div, implica que div tiene las dimensiones y que la imagen solo tiene una relación de aspecto. Necesito establecer la altura en algún valor, de lo contrario las condiciones de la pregunta se distorsionarán, así como mi imagen. Eche un vistazo a JS Fiddle y cambie lo que cree que es necesario para que funcione. Gracias.
Yevgeniy Afanasyev
6

Prueba CSS:

img {
  object-fit: cover;
  height: 48px;
}
Faisal
fuente
3

Para mí, el siguiente CSS funcionó (probado en Chrome, Firefox y Safari).

Hay varias cosas trabajando juntas:

  • max-height: 100%;, max-width: 100%;y height: auto;, width: auto;haga la escala img a la dimensión que primero llegue al 100% manteniendo la relación de aspecto
  • position: relative;en el contenedor y position: absolute;en el niño junto con top: 50%;y left: 50%;centrar la esquina superior izquierda de la img en el contenedor
  • transform: translate(-50%, -50%); mueve el img hacia la izquierda y hacia arriba a la mitad de su tamaño, centrando así el img en el contenedor

CSS:

.container {
    height: 48px;
    width: 48px;

    position: relative;
}

.container > img {
    max-height: 100%;
    max-width: 100%;
    height: auto;
    width: auto;

    position: absolute;
    top: 50%;
    left: 50%;

    transform: translate(-50%, -50%);
}
VSchlattinger
fuente
1

Establecer la foto como imagen de fondo nos dará más control sobre el tamaño y la ubicación, dejando que la etiqueta img tenga un propósito diferente ...

A continuación, si queremos que el div tenga la misma relación de aspecto que la foto, placeholder.png es una pequeña imagen transparente con la misma relación de aspecto que photo.jpg. Si la foto es un cuadrado, es un marcador de posición de 1px x 1px, si la foto es una miniatura de video, es un marcador de posición de 16x9, etc.

Específico para la pregunta, use un marcador de posición 1x1 para mantener la relación cuadrada del div, con una imagen de fondo background-sizepara mantener la relación de aspecto de la foto.

Utilicé background-position: center center;para que la foto se centre en el div. (Alinear la foto en el centro vertical o inferior se pondría feo con la foto en la etiqueta img)

div {
    background: url(photo.jpg) center center no-repeat;
    background-size: contain;
    width: 48px; // or a % in responsive layout
}
img {
    width: 100%;
}

<div><img src="placeholder.png"/></div>

Para evitar una solicitud http adicional, convierta la imagen del marcador de posición a datos: URL .

<img src="data:image/png;base64,..."/>
Desarrollador web
fuente
0

puede usar la clase "img-fluid" para la versión más reciente, es decir, Bootstrap v4 .

y puede usar la clase "img-responsive" para versiones anteriores como Bootstrap v3 .

Uso : -

etiqueta img con: -

clase = "img-fluid"

src = "..."

Saurabh Sheorain
fuente
0

Aquí hay un enfoque basado en JavaScript. Escala una imagen gradualmente hacia abajo hasta que encaje correctamente. Usted elige cuánto reducirlo cada vez que falla. Este ejemplo lo reduce un 10% cada vez que falla:

let fit = function (el, w, h, percentage, step)
{
    let newH = h;
    let newW = w;

    // fail safe
    if (percentage < 0 || step < 0) return { h: h, w: w };
    if (h > w)
    {
        newH = el.height() * percentage;
        newW = (w / h) * newH;
        if (newW > el.width())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }
    else
    {
        newW = el.width() * percentage;
        newH = (h / w) * newW;
        if (newH > el.height())
        {
            return fit(el, w, h, percentage - step, step);
        }
    }

    return { h: newH, w: newW };
};

img.bind('load', function ()
{
    let h = img.height();
    let w = img.width();
    let newFit = fit($('<img-wrapper-selector>'), w, h, 1, 0.1);

    img.width(newFit.w);
    img.height(newFit.h);
});

Siéntase libre de copiar y pegar directamente.

Playa Jared
fuente
0

Lo que funcionó para mí fue:

<div style='display: inline-flex; width: 80px; height: 80px;'>
<img style='max-width: 100%; max-height: 100%' src='image file'>
</div>

Inline-flex fue necesario para evitar que las imágenes salgan del div.

Nomad77
fuente