2022/09/30(金)[CSS] div で aspect-ratio を維持したまま object-fit 的なことがしたい
画像ファイルは、縦横比を維持して、枠の中で最大サイズに表示することが容易にできます。
<!DOCTYPE html> <head><style> body { padding: 10px; } #frame1, #frame2 { display: inline-block; border: red 2px solid; } #frame1 { width: 220px; height: 100px; } #frame2 { width: 120px; height: 100px; } img { width: 100%; height: 100%; object-fit: contain; } </style></head> <body> <div id="frame1"> <img src="img320x180.png"> </div> <div id="frame2"> <img src="img320x180.png"> </div> </body> </html>
これを img タグ画像ではなく div で実現しようとしても、divに対しての「object-fit」指定が無意味のため、うまくいきません。
そこでちょっと工夫して実現してみました。
<!DOCTYPE html> <head><style> body { padding: 10px; } #frame1, #frame2 { display: inline-block; border: red 2px solid; vertical-align: top; } #frame1 { width: 300px; height: 150px; } #frame2 { width: 200px; height: 150px; } .box { width: 100%; height: 100%; display: flex; justify-content:center; align-items: center; } .box2 { max-width: 100%; max-height: 100%; overflow: hidden; aspect-ratio: 16 / 9; box-sizing: border-box; border: blue 1px solid; } .dummy { display: block; font-size: 10000px; visibility: hidden; } </style></head> <body> <div id="frame1"> <div class="box"> <div class="box2"> あいうえお <span class="dummy"> </span> </div> </div> </div> <div id="frame2"> <div class="box"><div class="box2">あいうえお<span class="dummy"> </span></div></div> </div> </body> </html>
- 上下左右センタリングのため div を入れ子にし、.box に「display: flex;」を指定。
- .box2に対しアスペクト比を指定した上で「max-width: 100%; max-height: 100%」を指定する。
- maxなしの width/height の両方を指定すると、アスペクト比の指定が無効になる。
- 「width: 100%; height: auto;」では、外ボックス横長(アスペクト比が16/9より大きい)のときに正しく表示されない。
- 「width: auto; height: 100%;」では、外ボックス縦長(アスペクト比が16/9より小さい)のときに正しく表示されない。
- .box2 の「max-width: 100%; max-height: 100%」を活かすため、非表示.dummy要素として大きな文字を配置する。
ちなみに .dummy 要素がないと .box2 がきちんと広がらず、以下のように意図しない配置となります。
もっと良い方法(簡単な方法)がありましたら、教えてください。