見出し画像

レスポンシブで縦横比を維持するCSSと理由解説

レスポンシブ対応で使う機会が多い「要素の縦横比を維持(正方形等)」。よく使われるCSSテクニックですが、理屈が図解されているものが多くなかったので、残しておきます。少しでもお役に立てれば幸いです。

(追記)aspect-ratioというプロパティが浸透してきています。興味ある方はこちらからどうぞ。

やりたいこと:widthを%指定にして、縦横比を維持したい。

中に画像が入っている場合は、その画像の縦横比が維持されるので難なくいけますが、高さが決まっていないブロック要素だと意外にめんどくさいです。

画像1

heightの%指定は親要素のheightに準拠するので、親要素の高さが固定値でない場合や可変する場合、親要素の縦横比も維持されないと困ります。
%指定の場合、子要素の縦横比が維持されて初めて親要素の縦横比も維持される、だけど子要素の幅と高さは親要素に準拠…というジレンマ。

解決策:疑似要素でpadding-topを使う

まずはこちら。たとえば全体30%の幅の正方形の場合。

コード解説

①まず全体を囲む要素に幅を%で指定。

②それに疑似要素を設けて、この疑似要素にpadding-top:100%を指定。

画像2

ここでpadding-topを使う理由は、marginとpaddingの上下を%指定した場合、親要素のwidthに準拠する仕様があるためです。要素の中に存在する疑似要素にpadding-topだけを設けると、親要素のwidth分だけ高さを確保してくれるという仕組み。

これで大枠の横幅に対する縦幅の比率が指定できました。(長方形の場合はこの値を100%から変更します)

③子要素にposition:absoluteをかけ、位置を戻す

画像3

中に何も入らない場合はこのままでいいですが、子要素が存在する場合は疑似要素の高さ分(padding-top:100%)下にずれてしまいます。
そこで親要素にposition:relative、子要素にposition:absoluteをかけ、topとleftの値で親要素の位置まで子要素を戻します。

あとはwidth:100%とheight100%にすることで親要素いっぱいまで縦横広がり、レスポンシブでも縦横比が維持されますね。

まとめ

以上です!paddingとmarginの上下の%指定の特性を知っていると理屈がわかると思いますが、この図解が理解に役に立つと嬉しいです。下記参考もご確認ください。



この記事が気に入ったらサポートをしてみませんか?