今の書き方
比率をそのまま指定できます。 ラッパー要素も、比率から計算したパーセント値も要りません。
iframe {
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
}以前の書き方
paddingのパーセント値が親要素の幅を基準にする性質を使い、高さ0のボックスに比率ぶんの余白を持たせていました。
中身は絶対配置で重ねるため、ラッパー要素が1つ余計に必要です。
.video {
position: relative;
height: 0;
padding-top: 56.25%; /* 9 ÷ 16 */
}
.video > iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
<div class="video">
<iframe src="https://www.youtube.com/embed/..."></iframe>
</div>置き換えるときの注意点
- 中身が比率より高くなると、ボックスは中身に合わせて伸びます。
比率を崩したくない場合は
min-height: 0かoverflow: autoを併用します。 widthとheightの両方をauto以外にすると、aspect-ratioは効きません。 どちらか一方はautoにしておきます。<img>や<video>は、HTMLにwidth・height属性を書いておけば、ブラウザが読み込み前から比率を確保します。 CSSはheight: autoだけで済み、読み込み時のレイアウトのずれも防げます。
フォールバック
対象の5ブラウザはすべて対応済みなので、通常は古い書き方を残す必要はありません。
古いブラウザも支える必要がある場合だけ、@supportsで分岐して以前の書き方に戻します。
以前の書き方はラッパー要素を前提にするため、HTMLにはiframeを囲む.videoを残しておきます。
@supports not (aspect-ratio: 1) {
.video {
position: relative;
height: 0;
padding-top: 56.25%;
}
.video > iframe {
position: absolute;
top: 0;
left: 0;
height: 100%;
}
}Browser Support
Chrome
v88+2021-01-19Edge
v88+2021-01-21Safari
v15+2021-09-20Safari (iOS)
v15+2021-09-20Firefox
v89+2021-06-01