CSS: 100% de ancho o alto manteniendo la relación de aspecto?

174

Actualmente, con ESTILO, puedo usar width: 100%y autoen la altura (o viceversa), pero todavía no puedo restringir la imagen a una posición específica, ya sea demasiado ancha o demasiado alta, respectivamente.

¿Algunas ideas?

Weston Watson
fuente
3
¿Puedes publicar un enlace o una captura de pantalla para mostrar un ejemplo del problema?
Mauro

Respuestas:

138

Si solo define una dimensión en una imagen, la relación de aspecto de la imagen siempre se conservará.

¿El problema es que la imagen es más grande / más alta de lo que prefieres?

Puede ponerlo dentro de un DIV que esté configurado a la altura / anchura máxima que desea para la imagen, y luego configurar el desbordamiento: oculto. Eso recortaría cualquier cosa más allá de lo que quieres.

Si una imagen es 100% ancha y alta: automática y cree que es demasiado alta, eso se debe específicamente a que se conserva la relación de aspecto. Tendrá que recortar o cambiar la relación de aspecto.

¡Proporcione más información sobre lo que está tratando de lograr específicamente y trataré de ayudarlo más!

--- EDICION BASADA EN COMENTARIOS ---

¿Está familiarizado con las propiedades max-width y max-height ? Siempre puedes establecerlos en su lugar. Si no establece ningún mínimo y establece una altura y un ancho máximos, su imagen no se verá distorsionada (se conservará la relación de aspecto) y no será más grande que la dimensión que sea más larga y alcance su máximo.

Andrés
fuente
16
si la imagen es más alta que ancha, usaría height = 100% y width = auto, si la imagen es más ancha que tall, usaría width = 100%, height = auto. simplemente nunca sé cuál es el caso? recortar por altura / ancho máximo funcionaría, pero si hay una manera de no hacerlo, prefiero usar eso ...
Weston Watson
2
Bueno, ¿estás diseñando un diseño fluido o de ancho fijo? Si está en un diseño de ancho fijo, siempre puede establecer su ancho al 100% y la imagen se escalará adecuadamente, pero puede ser muy alta. ¿Está tratando de colocar una imagen en un bloque de texto, o usarla como un banner o como fondo? Si pudieras mostrar la página donde planeas usarla o describir el contexto, podría ayudarte más. Ver ediciones arriba también.
Andrew
El uso de max-height en mi img me permitió restringir las imágenes manteniendo su relación de aspecto
norteamericano
2
object-fit¿es inútil?
LeeGee
77

Algunos años más tarde, buscando el mismo requisito, encontré una opción de CSS usando background-size.

Se supone que funciona en navegadores modernos (IE9 +).

<div id="container" style="background-image:url(myimage.png)">
</div>

Y el estilo:

#container
{
  width:  100px; /*or 70%, or what you want*/
  height: 200px; /*or 70%, or what you want*/
  background-size: cover;
  background-position: center;
  background-repeat: no-repeat;
}

La referencia: http://www.w3schools.com/cssref/css3_pr_background-size.asp

Y la demostración: http://www.w3schools.com/cssref/playit.asp?filename=playcss_background-size

conca
fuente
3
la solución ideal, que lamentablemente no es compatible con IE8 :(
japrescott
Esta es la solución ideal, pero si lo hace en carruseles, hace que las imágenes estén en blanco por un segundo después de cada diapositiva.
kloddant
58

Al establecer la max-widthpropiedad CSS en 100%, una imagen llenará el ancho de su elemento primario, pero no se hará más grande que su tamaño real, preservando así la resolución.

Al establecer la heightpropiedad para automantener la relación de aspecto de la imagen, el uso de esta técnica permite anular la altura estática y permite que la imagen se flexione proporcionalmente en todas las direcciones.

img {
    max-width: 100%;
    height: auto;      
}
Adam Waite
fuente
1
Sin embargo, la configuración heightde autocausa el reflujo cuando la imagen flota
Gregory Pakosz
42

Solución de trabajo simple y elegante:

img {
  width: 600px;  /*width of parent container*/
  height: 350px; /*height of parent container*/
  object-fit: contain;
  position: relative;
  top: 50%;
  transform: translateY(-50%);
}
usuario3334941
fuente
3
Gracias por recordarme object-fit. Exactamente lo que necesitaba.
Ash Clarke
55
Esta es una solución ideal, pero desafortunadamente object-fitno es compatible con ninguna versión de IE ni Edge a partir del 28 de marzo de 2017.
Simon G
2
A partir de marzo de 2019, esta característica tiene un 90% de soporte, por lo que esta realmente debería considerarse la respuesta correcta.
Hampus Ahlgren
Además, tenga en cuenta que object-fit: containy object-fit: coverno le gusta widthal 100%: debe usar unidades de concreto comopx
FlameStorm el
Traté object-fitcon max-widthy max-heightcomo se usa en otras respuestas, pero eso no funcionó. esto funciona perfectamente para tamaños de imagen aleatorios incluso con widthyheight 100%
Halfacht
27

Tuve el mismo problema. El problema para mí fue que la propiedad de altura también ya estaba definida en otra parte, la arreglé así:

.img{
    max-width: 100%;
    max-height: 100%;
    height: inherit !important;
}
Flo
fuente
Exactamente lo que estaba buscando. Un millón de gracias.
London Smith
Perfecto donde el tamaño de la imagen puede ser más pequeño o más grande que el div principal, y se redimensionará al centro perfecto con el ancho máximo O la altura máxima. No tiene que usar la imagen como fondo, ya que solo se sobrecargará al padre si se establece en "cubrir".
Rehmat
9

Solución simple:

min-height: 100%;
min-width: 100%;
width: auto;
height: auto;
margin: 0;
padding: 0;

Por cierto, si desea centrarlo en un contenedor div principal, puede agregar esas propiedades css:

position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);

Realmente debería funcionar como se esperaba :)

Alexis K
fuente
votó por la primera parte. la segunda parte no funcionó para mí ... :(
Vikas Bansal
Solo un problema: si la imagen es más grande que el 100% del contenedor, se derramará y requerirá barras de desplazamiento o recorte. No estoy seguro de cómo lograr lo mismo y seguir limitando el tamaño máximo al contenedor. Si establece max-width y height, ya no conserva la relación de aspecto.
JustAMartin
5

Una de las respuestas incluye el tamaño de fondo: contener declaración css que me gusta mucho porque es una declaración directa de lo que desea hacer y el navegador simplemente lo hace.

Desafortunadamente, tarde o temprano necesitarás aplicar una sombra que desafortunadamente no funcionará bien con las soluciones de imágenes de fondo.

Entonces, digamos que tiene un contenedor que responde pero tiene límites bien definidos para el ancho y la altura mínima y máxima.

.photo {
  max-width: 150px;
  min-width: 75px;
  max-height: 150px;
  min-height: 75px;
}

Y el contenedor tiene una imagen que debe tener en cuenta los píxeles de la altura del contenedor para evitar obtener una imagen muy alta que se desborde o se recorte.

El img también debe definir un ancho máximo del 100% para primero permitir que se representen anchos más pequeños y, en segundo lugar, basarse en un porcentaje, lo que lo hace paramétrico.

.photo > img {
  max-width: 100%;
  max-height: 150px;
  -webkit-box-shadow: 0 0 13px 3px rgba(0,0,0,1);
  -moz-box-shadow:    0 0 13px 3px rgba(0,0,0,1);
  box-shadow:         0 0 13px 3px rgba(0,0,0,1);
}

Tenga en cuenta que tiene una bonita sombra;)

Disfruta de un ejemplo en vivo en este violín: http://jsfiddle.net/pligor/gx8qthqL/2/

George Pligoropoulos
fuente
Saludos, exactamente lo que estaba buscando.
Eli
Gracias por estas soluciones y enlace jsdfiddle. En realidad, esto funcionó para mi galería de imágenes de reacción, donde uso ambas: imágenes con mayor altura e imágenes con mayor ancho. :)
Eugenijus S.
4

Lo uso para un contenedor rectangular con altura y ancho fijos, pero con imágenes de diferentes tamaños.

img {
  max-width: 95%;
  max-height: 15em;
  width: auto !important;
}
Alejandro Salamanca Mazuelo
fuente
3

Es mejor usar auto en la dimensión que debe respetar la relación de aspecto. Si no configura la otra propiedad en auto, la mayoría de los navegadores en la actualidad supondrán que desea respetar la relación de aspecto, pero no todos (IE10 en Windows Phone 8 no lo hace, por ejemplo)

width: 100%;
height: auto;
Davy
fuente
2

Esta es una solución muy sencilla que se me ocurrió después de seguir el enlace de conca y mirar el tamaño del fondo. Explota la imagen y luego la coloca centrada en el contenedor exterior sin escalarla.

<style>
#cropcontainer
{
  width:  100%; 
  height: 100%; 
  background-size: 140%;
  background-position: center;
  background-repeat: no-repeat;
}
</style>

<div id="cropcontainer" style="background-image: url(yoururl); />
Bill Davis
fuente
¡Buena e inteligente solución! Con el 40% adicional, se compensa la relación de aspecto. ¡Gracias!
Sascha
También puede usar background-size: contain;para ajustar la imagen en un fondo.
Simon G
1

No para saltar a un viejo problema, pero ...

#container img {
      max-width:100%;
      height:auto !important;
}

Aunque esto no es correcto, ya que utiliza la anulación importante en la altura, si está utilizando un CMS como WordPress que establece la altura y el ancho para usted, esto funciona bien.

Levi G
fuente
1

Hoy en día se puede utilizar vwy vhunidades, que representan 1% del v iewport es w idth y h ocho respectivamente.

https://css-tricks.com/fun-viewport-units/

Así por ejemplo:

img {
  max-width: 100vw;
  max-height: 100vh;
}

... hará que la imagen sea lo más ancha posible, manteniendo la relación de aspecto, pero sin ser más ancha o superior al 100% de la ventana gráfica.

Jonas Berlin
fuente
0

Use JQuery más o menos, ya que CSS es un concepto erróneo general (las innumerables preguntas y discusiones aquí sobre objetivos de diseño simples lo demuestran).

Con CSS no es posible hacer lo que parece desear: la imagen tendrá un ancho del 100%, pero si este ancho resulta en una altura que es demasiado grande, se aplicará una altura máxima, y ​​por supuesto, las proporciones correctas serán Preservado.

Ungesund
fuente
-2

Creo que esto es lo que estabas buscando, lo estaba buscando yo mismo, pero luego lo recordé nuevamente porque encontré el código.

background-repeat: repeat-x;
background-position: top;
background-size:auto;
background-attachment: fixed;

La evolución digital está en camino.

Peter Gruppelaar
fuente