メインコンテンツまでスキップ
  • Created:
  • Updated:
  • Author:
    Takeshi Takatsudo

Object Fit と Object Position

問題

画像や動画を固定サイズのコンテナに配置すると、置換要素(replaced elements)のデフォルトが object-fit: fill であるため、引き伸ばされたり歪んだりします。開発者はしばしば <div>background-image に切り替えることで回避しますが、これによりセマンティクス、アクセシビリティ(alt テキスト)、ネイティブの遅延読み込み、SEOのインデックス対象としての認識が失われます。<img><video> 要素に対する正しい解決策は object-fit です。HTMLを放棄せずにコンテンツのフィル方法を制御できます。

解決方法

object-fit は、置換要素のコンテンツがコンテナに合わせてどのようにリサイズされるかを制御します。背景画像に対する background-size と同じように動作しますが、実際の <img><video> などの置換要素に適用されます。object-position はコンテンツの要素ボックス内での配置を制御し、焦点を選択できます。

基本原則

object-fit の値

  • fill(デフォルト)— ボックスにぴったり合うようにコンテンツを引き伸ばします。アスペクト比を無視します。写真にはほぼ不適切です。
  • contain — アスペクト比を維持しつつ、コンテンツがボックス内に完全に収まるようにスケーリングします。余白(レターボックス)が生じることがあります。
  • cover — アスペクト比を維持しつつ、コンテンツがボックス全体をカバーするようにスケーリングします。画像の一部がクリップされることがあります。
  • none — リサイズなし。コンテンツは固有のサイズで表示されます。はみ出した部分はクリップされます。
  • scale-downnone または contain のうち、より小さい結果を生むものとして動作します。拡大を防ぎます。

object-position

background-position とまったく同じように動作します。キーワード値(topcenterright)、パーセンテージ、または長さの値を受け付けます。デフォルトは 50% 50%(中央揃え)です。object-fit: cover で画像がクリップされる際に、どの部分を表示するかを制御するのに使います。

aspect-ratio との関係

aspect-ratio プロパティはボックスの比率を定義し、object-fit はコンテンツがそのボックスをどう埋めるかを制御します。両者は連携して動作します:要素に aspect-ratio を設定してコンテナの形状を定義し、object-fit で画像コンテンツの適応方法を制御します。

img {
width: 100%;
aspect-ratio: 16 / 9;
object-fit: cover;
}

これにより、常に16:9のフレームを維持しつつ、内部の写真がエッジまで埋まるレスポンシブな画像が得られます。

ライブプレビュー

object-fit の比較
object-fit: cover を使ったアバターグリッド
object-position による焦点制御
サムネイルカードパターン
object-fit vs background-image

クイックリファレンス

シナリオCSS
画像がコンテナを埋め、比率を維持、端をクリップobject-fit: cover
画像がコンテナ内に収まり、レターボックスありobject-fit: contain
画像を固有サイズのまま、リサイズなしobject-fit: none
固有サイズ以上に拡大しないobject-fit: scale-down
cover でクリップされる際の焦点を制御object-position: top または object-position: 25% 75%
cover を使ったレスポンシブ16:9フレームaspect-ratio: 16/9; object-fit: cover
任意のアスペクト比からの円形アバターborder-radius: 50%; object-fit: cover

AIがよくやるミス

  • object-fit の代わりに background-image を使う。 コンテンツが意味のある画像(装飾ではない)である場合は、<img>object-fit を使いましょう。background-image は純粋に装飾的な背景にのみ使います。
  • 画像に明示的なサイズを設定し忘れる。 object-fit は、要素のボックスサイズがコンテンツの固有サイズと異なる場合にのみ効果があります。<img>widthheight(または aspect-ratio)を設定しましょう。
  • カード内の画像に display: block を設定しない。 インライン画像はベースライン揃えにより下部に小さな隙間が生じます。display: block を追加して解消しましょう。
  • 意図的に object-fit: fill を使う。 fill はデフォルトで画像を引き伸ばします。明示的に object-fit: fill を設定している場合、画像が歪みます。cover または contain を使いましょう。
  • cover を使う際に object-position を無視する。 デフォルトの中央揃えは画像の間違った部分をクリップする可能性があります。object-position で表示する部分を制御しましょう。
  • aspect-ratioobject-fit を組み合わせない。 width: 100% のみを設定し、aspect-ratio や固定の height を指定しないと、画像ボックスは固有の比率に従うため、object-fit が不要になります。

参考リンク