object-fit:画像や動画などの置換要素をボックスに収める方法を指定する

初期値 fill
適用対象 置換要素
継承 しない
アニメーション 離散値
対応ブラウザ caniuseで確認

object-fitプロパティの説明

object-fitは、画像や動画などの置換要素をボックスに収める方法を指定します。要素は配置されると四角形のボックスを作成しますが、その中に埋め込まれるコンテンツのはめ込み方式を変更できます。

例えば、CSSで定義したコンテナの寸法と画像のサイズが異なる場合に、アスペクト比を維持したまま縮小して配置するのか、それを崩してでもコンテナにフィットさせるのかを選択できます。また、幅と高さのあふれる方の辺をトリミングしてレイアウトを優先させることもできます。

ボックスの中に配置されるオブジェクトの位置を調整する場合は、object-positionを使用します。

object-fitに指定できる値

fill
オブジェクトは、要素のコンテンツ・ボックスを埋めるように表示されます。アスペクト比が合わない場合は、ボックスの長辺に合わせてコンテンツが引き伸ばされます。これが初期値です。
contain
オブジェクトは、アスペクト比を維持したまま要素のコンテンツ・ボックスに収まるように拡大縮小されます。オブジェクト全体がボックスの中に表示され、アスペクト比が合わない場合は余った領域が背景色となりレターボックスの表示形式となります。
cover
オブジェクトは、アスペクト比を維持したまま要素のコンテンツ・ボックスを埋めるように表示されます。アスペクト比が合わない場合は、オブジェクトの長辺が範囲からはみ出すように切り取られます。
none
オブジェクトは、元のサイズのまま表示されます。
scale-down
オブジェクトは、noneまたはcontainのいずれかで、より小さいサイズで配置可能な方を採用します。

object-fitの使い方とサンプル

object-fitプロパティの構文は以下の通りです。

CSS
/* キーワード値 */
object-fit: contain;
object-fit: cover;
object-fit: fill;
object-fit: none;
object-fit: scale-down;

/* グローバル値 */
object-fit: inherit;
object-fit: initial;
object-fit: revert;
object-fit: unset;

object-fitの実例

それでは実際にobject-fitプロパティの書き方を見ていきましょう。以下の例は、CSSで<img>要素のサイズを固定した上で、アスペクト比や寸法の異なる画像を読み込んでいます。

これを見て分かるように、画像のサイズ指定はコンテンツそのもののwidthheightを調整しているわけではなく、あくまでHTML要素によって生成されたボックスにソース元のコンテンツを置換要素として流し込んでいるのです。

これを理解すると、画像や動画をレイアウトに合わせて配置したり、中央寄せやトリミングの指定がしやすくなります。ぜひ習得して行きましょう。

表示確認
CSS
.samp_box {
	overflow: auto;
	padding: 0 1rem 1rem;
	background: #eee;
}
.samp_box h2 {
	margin: 1rem 0 0;
	font-size: 1rem;
}
.samp_box img {
	border: 1px solid #333;
	background: #fff;
}
.samp_box img:nth-of-type(1) {
	width: 100px;
	height: 100px;
}
.samp_box img:nth-of-type(2) {
	width: 200px;
	height: 100px;
	margin-left: 1rem;
}
.of_1 img {
	object-fit: fill;
}
.of_2 img {
	object-fit: contain;
}
.of_3 img {
	object-fit: cover;
}
.of_4 img {
	object-fit: scale-down;
}
.of_5 img {
	object-fit: none;
}
HTML
<div class="samp_box">
	<div class="of_1">
		<h2>object-fit: fill;</h2>
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
	</div>
	<div class="of_2">
		<h2>object-fit: contain;</h2>
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
	</div>
	<div class="of_3">
		<h2>object-fit: cover;</h2>
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
	</div>
	<div class="of_4">
		<h2>object-fit: scale-down;</h2>
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
	</div>
	<div class="of_5">
		<h2>object-fit: none;</h2>
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
		<img src="../images/sample_photo_628x370.png" alt="サンプル画像">
	</div>
</div>

画像を要素の中央に配置する

object-fitobject-positionを利用すると、画像を画面の中央に寄せることが簡単になります。詳しくは、画像要素のボックスと画像の配置位置を切り離して制御できるobject-positionの解説を参照して下さい。

以下の内容は、<img>要素のみで実現しています。ボックスの横幅を可変式にして中央に画像を配置しています。これはボックスのサイズやアスペクト比がいかなるものであっても、画像を中央に配置できることを意味します。実は既定値ではこれと同じ方法で配置されますが、object-fitによる自動調整が働くために画像の寸法が変わってしまうのです。

更に、サンプルでは<img>要素そのものに背景画像を配置しています。このような応用が利くのも、コンテナとオブジェクトを分けて考える時の利点です。resizeに対応しているブラウザであれば、コンテナの横幅を変更できます。画像が中央に寄ったまま移動するので確認してみましょう。

表示確認
CSS
.samp_box {
	overflow: auto;
	padding: 0 1rem 1rem;
	background: #eee;
	resize: horizontal;
}
.samp_box h2 {
	margin: 1rem 0 0;
	font-size: 1rem;
}
.samp_box img {
	width: 100%;
	height: 200px;
	border: 1px solid #333;
	background: url(../images/sample_photo_1200x630.jpg) center no-repeat;
	object-fit: none;
	object-position: center center;
}
HTML
<div class="samp_box">
	<div>
		<h2>object-position: center center;</h2>
		<img src="../images/sample_square_100.png" alt="サンプル画像">
	</div>
</div>

に関連するCSSプロパティ