🫠
【CSS・Chrome 124】aspect-ratioを使っているページが何もしていないのに壊れた
はじめに結論
CSS の aspect-ratio
プロパティを使っている場合、Chrome 124 で崩れる場合があります。
aspect-ratio
を設定している要素に min-width: 0;
を設定しておくと安全かも。
以下詳細です。
現象
以前は問題なく表示できていたはずのページで、コンテンツがページ外にはみ出してしまう現象が発生していました。
原因を確認すると、以下のような条件で発生していました。
- 親で
display: grid;
を設定して横並びにしている- おそらく
flex
でも同様
- おそらく
- その中に
aspect-ratio
プロパティを設定している要素がある
同様の状況を再現したのが、冒頭に掲載した CodePen のサンプルです。
原因
Chrome 123.0.6262.0 で表示を確認したところ、問題なく表示されていました。
Chrome 124.0.6367.92 で確認したところ、コンテンツがページ外にはみ出してしまう現象が発生しました。
どうやら Chrome 側の仕様変更もしくはバグのようです。
Chrome 123 での表示:意図通り左半分に画像が配置されている。
Chrome 124 での表示:画像が大きく表示されてしまい、右側のテキストが枠外に追いやられ、ページ外にはみ出している。
バグであればそのうち Chrome 側の更新で修正されるかもしれませんが、治るとしてもいつになるか不明です。
解決策
以下のように min-width: 0;
を設定することで修正できました。
.element {
aspect-ratio: 16 / 9;
+ min-width: 0;
}
grid
や flex
で親要素をはみ出してしまう場合は、だいたい min-width: 0;
を設定すると解決することが多いですね。
Discussion
.image-wrapに対してに対してアスペクト比はかけずに、imgに対してaspect-ratio プロパティをかけてpositionは外すと問題ないのでは。.image-wrapに対してはmin-width: 0;を付ける必要もなければ特に何も記述する必要もないです。以下の書き方をすればChromeのバージョンは関係なく崩れないです。
なにか意図してそうしたならスルーしてください。
コメントありがとうございます!
aspect-ratio
を適用した要素がdisplay: grid;
の直接の子要素(グリッドアイテム)になることを避ける、というアプローチですね。たしかにその方法でも修正できそうです。つまり、CSSを変えずにHTMLに
div
要素を追加することでも修正できますね(無駄は増えてしまいますが、方法の1つとして)。やや冗長な書き方になっていたのは、実際にはNext.js の
next/image
でfill
(layout="fill"
) を使っている箇所で起きた現象をプレーンなHTMLに書き下したためです!(この点記事中で触れても良かったですね)