Usando o modelo CSS flex box, como posso forçar uma imagem a manter sua proporção?
JS Fiddle: http://jsfiddle.net/xLc2Le0k/2/
Observe que as imagens aumentam ou diminuem para preencher a largura do contêiner. Tudo bem, mas também podemos esticar ou diminuir a altura para manter as proporções da imagem?
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>
com CSSbackground-image: url(...);background-size:contain; background-repeat:no-repeat
Respostas:
Para tags img, se você definir um lado, o outro lado será redimensionado para manter a proporção e, por padrão, as imagens serão expandidas para seu tamanho original.
Usando esse fato, se você envolver cada tag img na tag div e definir sua largura para 100% do div pai, a altura ficará de acordo com a proporção desejada.
http://jsfiddle.net/0o5tpbxg/
fonte
Para evitar que as imagens se estendam em qualquer um dos eixos dentro de um pai flexível, encontrei algumas soluções.
Você pode tentar usar ajuste de objeto na imagem que, por exemplo
http://jsfiddle.net/ykw3sfjd/
Ou você pode adicionar regras flex-specfic que podem funcionar melhor em alguns casos.
fonte
object-fit: contain;
funcionou para mim, quando eu só tinha o problema no cromo, ff estava bem.Não há necessidade de adicionar um div contendo.
O padrão para a propriedade css "align-items" é "stretch" que é o que está fazendo com que suas imagens sejam esticadas até sua altura original. Definir a propriedade css "align-items" para "flex-start" corrige o problema.
fonte
Mas isso não funciona como esperado se as imagens que estão sendo definidas como itens flexíveis diretos com o Módulo de Layout de Caixa Flexível atual Nível 1 , até onde eu sei.
Veja essas discussões e os relatórios de bugs podem estar relacionados:
Como solução alternativa, você pode envolver cada
<img>
um com um<div>
ou um<span>
ou assim.jsFiddle
Como alternativa, você pode usar o
table
layout CSS , no qual obterá resultados semelhantesflexbox
, pois funcionará em mais navegadores, até mesmo para o IE8.jsFiddle
fonte
.slider > div{min-width:0}
de novos navegadores que suportemmin-width: auto
.auto
valor como o valor padrão paramin-width
emin-height
(anteriormente era0
). O Chrome ainda não o implementa, então seu primeiro snippet funciona. Mas os novos navegadores precisam disso para permitir que os itens flexíveis sejam menores do que a largura padrão das imagens.Tenho brincado com o flexbox ultimamente e cheguei a uma solução para isso através da experimentação e do seguinte raciocínio. No entanto, na realidade, não tenho certeza se isso é exatamente o que acontece.
Se a largura real for afetada pelo sistema flexível. Assim, após a largura dos elementos atingir a largura máxima do pai, a largura extra definida no css é ignorada. Então é seguro definir a largura para 100%.
Como a altura da tag img é derivada da própria imagem, definir a altura como 0% pode fazer algo. (é aqui que eu não estou certo sobre o quê ... mas fazia sentido para mim que deveria consertar)
DEMO
(lembre-se de ter visto aqui primeiro!)
Funciona apenas em cromo ainda
fonte
auto
". Isso é o que acontece no Firefox.Esse comportamento é esperado. flex container estenderá todos os seus filhos por padrão. A imagem não tem exceção. (ou seja, o pai terá
align-items: stretch
propriedade)Para manter a proporção da imagem, temos duas soluções:
align-items: stretch
propriedade padrão poralign-items: flex-start
oualign-self: center
etc, http://jsfiddle.net/e394Lqnt/3/ou
align-self: center
oualign-self: flex-start
etc. http://jsfiddle.net/e394Lqnt/2/fonte
Na verdade descobri que o container da tag da imagem precisa ter uma altura para manter a proporção da imagem. por exemplo>
então, em seu html, seu contêiner envolverá a imagem da tag
isso funciona para o IE e outros navegadores
fonte
Eu simplesmente tive o mesmo problema. Use o alinhamento flexível para centralizar seus elementos. Você precisa usar em
align-items: center
vez dealign-content: center
. Isso manterá a proporção de aspecto, enquanto o alinhamento de conteúdo não manterá a proporção de aspecto.fonte