Usando el modelo de caja flexible CSS, ¿cómo puedo forzar una imagen a mantener su relación de aspecto?
JS Fiddle: http://jsfiddle.net/xLc2Le0k/2/
Observe que las imágenes se estiran o encogen para llenar el ancho del contenedor. Está bien, pero ¿podemos hacer que también se estire o encoja la altura para mantener las proporciones de la imagen?
HTML
<div class="slider">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
<img src="http://www.placebacon.net/400/300" alt="Bacn">
</div>
CSS
.slider {
display: flex;
}
.slider img {
margin: 0 5px;
}
<div>
con CSSbackground-image: url(...);background-size:contain; background-repeat:no-repeat
Respuestas:
Para las etiquetas img, si define un lado, el otro lado cambia de tamaño para mantener la relación de aspecto y, por defecto, las imágenes se expanden a su tamaño original.
Usando este hecho, si envuelve cada etiqueta img en la etiqueta div y establece su ancho al 100% del div principal, la altura estará de acuerdo con la relación de aspecto que desee.
http://jsfiddle.net/0o5tpbxg/
fuente
Para evitar que las imágenes se estiren en cualquiera de los ejes dentro de un padre flexible, he encontrado un par de soluciones.
Puede intentar usar el ajuste de objeto en la imagen que, por ejemplo,
http://jsfiddle.net/ykw3sfjd/
O puede agregar reglas específicas de flexibilidad que pueden funcionar mejor en algunos casos.
fuente
object-fit: contain;
hizo el truco para mí, cuando solo tuve el problema en Chrome, ff estaba bien.No es necesario agregar un div contenedor.
El valor predeterminado de la propiedad css "align-items" es "stretch", que es lo que hace que las imágenes se estiren a su altura original completa. Establecer la propiedad css "align-items" en "flex-start" soluciona el problema.
fuente
Pero eso no funciona como se esperaba si las imágenes que se configuran como elementos de flexión directa con el módulo de diseño de caja flexible actual Nivel 1 , hasta donde yo sé.
Vea estas discusiones y los informes de errores pueden estar relacionados:
Como solución alternativa, puede envolver cada uno
<img>
con a<div>
o a<span>
, o así.jsFiddle
Alternativamente, puede usar el
table
diseño CSS en su lugar, que obtendrá resultados similares yaflexbox
que funcionará en más navegadores, incluso para IE8.jsFiddle
fuente
.slider > div{min-width:0}
compatible con los nuevos navegadoresmin-width: auto
.auto
valor como valor predeterminado paramin-width
ymin-height
(anteriormente lo era0
). Chrome aún no lo implementa, por lo que su primer fragmento funciona. Pero los nuevos navegadores lo necesitan para permitir que los elementos flexibles se encojan más pequeño que el ancho predeterminado de las imágenes.He estado jugando con flexbox últimamente y llegué a la solución a través de la experimentación y el siguiente razonamiento. Sin embargo, en realidad no estoy seguro de si esto es exactamente lo que sucede.
Si el ancho real se ve afectado por el sistema flexible. Entonces, después de que el ancho de los elementos alcanza el ancho máximo del padre, se ignora el ancho adicional establecido en css. Entonces es seguro establecer el ancho al 100%.
Dado que la altura de la etiqueta img se deriva de la propia imagen, establecer la altura en 0% podría hacer algo. (aquí es donde no tengo claro qué ... pero tenía sentido para mí que debería arreglarlo)
MANIFESTACIÓN
(¡recuerda que lo vi aquí primero!)
Funciona solo en Chrome todavía
fuente
auto
". Eso es lo que sucede en Firefox.Se espera este comportamiento. flex container estirará todos sus hijos de forma predeterminada. La imagen no tiene excepción. (es decir, el padre tendrá
align-items: stretch
propiedad)Para mantener la relación de aspecto, tenemos dos soluciones:
align-items: stretch
propiedad predeterminada enalign-items: flex-start
oalign-self: center
etc, http://jsfiddle.net/e394Lqnt/3/o
align-self: center
oalign-self: flex-start
etc. http://jsfiddle.net/e394Lqnt/2/fuente
En realidad, descubrí que el contenedor de la etiqueta de la imagen debe tener una altura para mantener la proporción de la imagen. por ejemplo>
luego en su html su contenedor envolverá la imagen de la etiqueta
este trabajo para IE y otros navegadores
fuente
Solo tuve el mismo problema. Utilice la alineación flexible para centrar sus elementos. Necesita usar en
align-items: center
lugar dealign-content: center
. Esto mantendrá la relación de aspecto, mientras que align-content no mantendrá la relación de aspecto.fuente