¿Existe una solución de solo CSS para escalar una imagen en un cuadro delimitador (manteniendo la relación de aspecto)? Esto funciona si la imagen es más grande que el contenedor:
img {
max-width: 100%;
max-height: 100%;
}
Ejemplo:
- Caso de uso 1 (funciona): http://jsfiddle.net/Jp5AQ/2/
- Caso de uso 2 (funciona): http://jsfiddle.net/Jp5AQ/3/
Pero quiero escalar la imagen hasta que una dimensión sea el 100% del contenedor.
- Caso de uso 3 (no funciona): http://jsfiddle.net/Jp5AQ/4/
Respuestas:
Nota: aunque esta es la respuesta aceptada, la respuesta a continuación es más precisa y actualmente es compatible con todos los navegadores si tiene la opción de usar una imagen de fondo.
No, no existe una única forma de CSS para hacer esto en ambas direcciones. Podrías agregar
Para que un elemento tenga siempre un ancho del 100% y escale automáticamente la altura a la relación de aspecto, o a la inversa:
para escalar siempre a la altura máxima y al ancho relativo. Para hacer ambas cosas, deberá determinar si la relación de aspecto es mayor o menor que su contenedor, y CSS no puede hacer esto.
La razón es que CSS no sabe cómo se ve la página. Establece reglas de antemano, pero solo después de eso, los elementos se renderizan y usted sabe exactamente con qué tamaños y proporciones está tratando. La única forma de detectarlo es con JavaScript.
Aunque no está buscando una solución JS, agregaré una de todos modos si alguien la necesita. La forma más fácil de manejar esto con JavaScript es agregar una clase basada en la diferencia de proporción. Si la relación ancho-alto del cuadro es mayor que la de la imagen, agregue la clase "fillwidth", de lo contrario agregue la clase "fillheight".
Mostrar fragmento de código
fuente
¡Gracias a CSS3 hay una solución!
La solución es poner la imagen como
background-image
a continuación, establecer elbackground-size
acontain
.HTML
CSS
Pruébelo aquí: http://www.w3schools.com/cssref/playit.asp?filename=playcss_background-size&preval=contain
Total compatibilidad con los últimos navegadores: http://caniuse.com/background-img-opts
Para alinear el div en el centro, puede usar esta variación:
fuente
<div class=image style="background-image: url('/images/foo.jpg');"></div>
. Todos los demás estilos deben aplicarse con CSS.Aquí hay una solución pirateada que descubrí:
Esto agrandará la imagen diez veces, pero la restringirá al 10% de su tamaño final, limitándola así al contenedor.
A diferencia de la
background-image
solución, esto también funcionará con<video>
elementos.Ejemplo interactivo:
Mostrar fragmento de código
fuente
transform-origin: top left
para detener el recorte. / ZombieHoy, solo diga object-fit: contener. El soporte lo es todo menos IE: http://caniuse.com/#feat=object-fit
fuente
object-fit
todavía está en desarrollo para ello.object-fit
: stackoverflow.com/a/46456673/474031html:
css:
fuente
Puede lograr esto con CSS puro y soporte completo del navegador, tanto para imágenes de longitud vertical como horizontal al mismo tiempo.
Aquí hay un fragmento que funciona en Chrome, Firefox y Safari (ambos usándolo
object-fit: scale-down
y sin usarlo):fuente
Otra solución sin imagen de fondo y sin la necesidad de un contenedor (aunque se deben conocer los tamaños máximos del cuadro delimitador):
Si se requiere el uso de un contenedor, entonces el ancho máximo y la altura máxima se pueden establecer en 100%:
Para esto tendrías algo como:
fuente
Este ejemplo para estirar la imagen proporcionalmente para que se ajuste a toda la ventana. Una improvisación del código correcto anterior es agregar
$( window ).resize(function(){});
Hay dos condiciones if. El primero sigue comprobando si la altura de la imagen es menor que el div y aplica la
.fillheight
clase, mientras que el siguiente comprueba el ancho y aplica la.fillwidth
clase. En ambos casos, la otra clase se elimina usando.removeClass()
Aquí está el CSS
Puede reemplazar
100vh
por100%
si desea estirar la imagen en un div. Este ejemplo para estirar la imagen proporcionalmente para que se ajuste a toda la ventana.fuente
¿Está buscando escalar hacia arriba pero no hacia abajo?
Sin embargo, esto no bloquea la relación de aspecto.
fuente
He usado una tabla para centrar la imagen dentro de la caja. Mantiene la relación de aspecto y escala la imagen de una manera que está totalmente dentro de la caja. Si la imagen es más pequeña que el cuadro, se muestra como está en el centro. El siguiente código utiliza un cuadro de 40 píxeles de ancho y 40 píxeles de alto. (No estoy muy seguro de qué tan bien funciona porque lo eliminé de otro código más complejo y lo simplifiqué un poco)
CSS:
HTML:
fuente
La forma más limpia y sencilla de hacer esto:
Primero algo de CSS:
El HTML:
¡Esto debería funcionar!
fuente
Esto me ayudó:
Luego, en el elemento (puede usar javascript o consultas de medios para agregar capacidad de respuesta):
¡Espero que esto ayude!
fuente
Estoy editando mi respuesta para explicar más mi solución, ya que tengo un voto en contra.
Con los estilos configurados como se muestra arriba en css, ahora el siguiente div html mostrará que la imagen siempre se ajusta al ancho y ajustará la relación de aspecto alto al ancho. Por lo tanto, la imagen se escalará para ajustarse a un cuadro delimitador como se pide en la pregunta.
fuente