CSSフレックスボックスモデルを使用して、画像の縦横比を維持するにはどうすればよいですか。
JSフィドル: http://jsfiddle.net/xLc2Le0k/2/
コンテナの幅を埋めるために、画像が伸縮することに注意してください。それでいいのですが、画像の縦横比を維持するために高さを伸縮させることもできますか?
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;
}
一方の面を定義した場合のimgタグの場合、もう一方の面は縦横比を維持するようにサイズ変更され、デフォルトでは画像は元のサイズに拡大されます。
この事実を利用して、各imgタグをdivタグにラップし、その幅を親divの100%に設定すると、高さは望みどおりの縦横比になります。
* {
margin: 0;
padding: 0;
}
.slider {
display: flex;
}
.slider .slide img {
width: 100%;
}
フレックスペアレント内で画像がどちらの軸にも伸びないようにするため、いくつかの解決策を見つけました。
あなたは、画像にオブジェクトフィットを使用して試すことができます。
object-fit: contain;
あるいは、場合によってはうまく機能するかもしれないフレックス特有のルールを追加することができます。
align-self: center;
flex: 0 0 auto;
含まれているdivを追加する必要はありません。
Cssの "align-items"プロパティのデフォルトは "stretch"で、これはあなたの画像を元の高さいっぱいまで引き伸ばしている原因です。 cssの「align-items」プロパティを「flex-start」に設定すると問題は解決します。
.slider {
display: flex;
align-items: flex-start; /* ADD THIS! */
}
固有寸法を持つほとんどの画像、つまり
jpeg
画像のように自然サイズです。指定されたサイズが幅と高さの両方を定義している場合、欠損値は固有の比率を使用して決定されます。 - MDN を参照してください。
しかし、私の知る限りでは、現在の Flexible Box Layout Module Level 1 で直接フレックスアイテムとして設定されている画像では、期待通りには機能しません。
これらの議論を見て、バグレポートは関連しているかもしれません:
回避策として、各<img>
を<div>
または<span>
などでラップすることができます。
.slider {
display: flex;
}
.slider>div {
min-width: 0; /* why? see below. */
}
.slider>div>img {
max-width: 100%;
height: auto;
}
<div class="slider">
<div><img src="https://picsum.photos/400/300?image=0" /></div>
<div><img src="https://picsum.photos/400/300?image=1" /></div>
<div><img src="https://picsum.photos/400/300?image=2" /></div>
<div><img src="https://picsum.photos/400/300?image=3" /></div>
</div>
flex items に対してより合理的なデフォルトの最小サイズを提供するために、この仕様では min-width の初期値として新しい auto 値を導入しています。 min-height CSS 2.1で定義されているプロパティ。
代わりに、CSSのtable
レイアウトを代わりに使用することもできます。これはflexbox
と同様の結果が得られます。IE8の場合でも、より多くのブラウザで動作します。
.slider {
display: table;
width: 100%;
table-layout: fixed;
border-collapse: collapse;
}
.slider>div {
display: table-cell;
vertical-align: top;
}
.slider>div>img {
max-width: 100%;
height: auto;
}
<div class="slider">
<div><img src="https://picsum.photos/400/300?image=0" /></div>
<div><img src="https://picsum.photos/400/300?image=1" /></div>
<div><img src="https://picsum.photos/400/300?image=2" /></div>
<div><img src="https://picsum.photos/400/300?image=3" /></div>
</div>
私は最近flexboxの周りで遊んでいます、そして私は実験と以下の推論を通してこれの解決策になりました。しかし、現実には、これがまさに起こるのかどうかはわかりません。
実際の幅がフレックスシステムの影響を受ける場合そのため、要素の幅が親の最大幅に達すると、cssで設定された余分な幅は無視されます。それから幅を100%に設定しても安全です。
Imgタグの高さは画像自体から派生しているので、高さを0%に設定すると何かができます。 (これは私が何に関して不明確なところです...しかしそれはそれを修正する必要があることは私には意味がありました)
(覚えておいてください最初にここでそれを見た!)
.slider {
display: flex;
}
.slider img {
height: 0%;
width: 100%;
margin: 0 5px;
}
まだクロムだけで動作します
これは予想される動作です。 flexコンテナはデフォルトですべての子をstretchします。画像に例外はありません。 (つまり、親にはalign-items: stretch
プロパティがあります)
アスペクト比を維持するために、2つのソリューションがあります。
align-items: stretch
プロパティをalign-items: flex-start
またはalign-self: center
などに置き換えます。 http://jsfiddle.net/e394Lqnt/3/または
align-self: center
またはalign-self: flex-start
など。 http://jsfiddle.net/e394Lqnt/2/