まだ重たいCMSをお使いですか?
毎秒1000リクエスト を捌く超高速CMS「adiary

2022/09/30(金)[CSS] div で aspect-ratio を維持したまま object-fit 的なことがしたい

はてブ数 CSS

画像ファイルは、縦横比を維持して、枠の中で最大サイズに表示することが容易にできます。

object-fit_01.png

<!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」指定が無意味のため、うまくいきません。

そこでちょっと工夫して実現してみました。

object-fit_02.png

<!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">&emsp;</span>
		</div>
	</div>
</div>
<div id="frame2">
	<div class="box"><div class="box2">あいうえお<span class="dummy">&emsp;</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 がきちんと広がらず、以下のように意図しない配置となります。

object-fit_03.png

もっと良い方法(簡単な方法)がありましたら、教えてください。