🖼️

まだabsoluteで画像トリミングしてるの?object-fitで5秒で解決

に公開

はじめに

「固定サイズのボックスに画像をトリミング+中央配置したい」

これ、Web制作でめちゃくちゃよくある要件ですよね。

実は私も最近までposition: absolutetransform を駆使した複雑な方法でやっていました。
でも、object-fit というCSSプロパティを知ってからは、たった3行でこれが実現できるようになりました。

この記事では、object-fit の全パターンと実用例、そして従来の方法との比較まで、実際に動くデモを交えて解説します!


🎯 object-fitとは?

object-fit は、<img><video>要素をボックス内にどうフィットさせるかを指定するCSSプロパティです。

基本の書き方

.box {
  width: 300px;
  height: 200px;
}

.box img {
  width: 100%;
  height: 100%;
  object-fit: cover; /* ← ここがポイント! */
}

たったこれだけで、画像がボックスサイズに合わせてトリミング+中央配置されます!


🎨 5つのパターンを完全理解

object-fit には5つの値があります。それぞれの挙動を見ていきましょう。

実際に動くデモで確認

まずは全パターンの違いを体感してください!

👆 画像の表示され方の違いを確認できます


cover(★一番使う)

object-fit: cover;
  • ボックスを埋め尽くすように拡大・縮小
  • はみ出た部分はトリミングされる
  • アスペクト比は保持される
  • 中央配置される(デフォルト)

使いどころ:ブログカードの画像、プロフィール写真、ヒーローイメージなど

実務での使用率:90%はこれ!


contain

object-fit: contain;
  • ボックス内に画像全体を収める
  • はみ出さない範囲で最大化
  • 余白ができることがある
  • アスペクト比は保持される

使いどころ:商品画像、ロゴ、アイコンなど「全体を見せたい」場合


fill(デフォルト)

object-fit: fill;
  • ボックスを完全に埋める
  • アスペクト比が変わる(歪む)
  • 基本的に使わない

注意:アスペクト比が崩れるため、実務ではほぼ使いません


none

object-fit: none;
  • 画像を元のサイズのまま表示
  • 中央配置される
  • はみ出た部分はトリミング

使いどころ:限定的。背景的に使いたい場合など


scale-down

object-fit: scale-down;
  • containnone のうち、小さい方を採用
  • 画像が小さい場合は元サイズ、大きい場合は contain と同じ

使いどころ:アイコンやロゴで「大きくなりすぎない」ようにしたい場合


😤 従来の方法との比較

❌ Before:absoluteを使った複雑な方法

私も以前はこうやってました…

<div class="box">
  <img src="image.jpg" alt="">
</div>
.box {
  position: relative;
  width: 300px;
  height: 200px;
  overflow: hidden; /* はみ出しを隠す */
}

.box img {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%); /* 中央配置 */
  min-width: 100%;
  min-height: 100%;
  width: auto;
  height: auto;
}

問題点

  • コードが長い(7行以上)
  • transform が新たなスタッキングコンテキストを作る
  • position: absolute で要素が浮いてしまう
  • レスポンシブ対応が複雑
  • メンテナンス性が低い

✅ After:object-fitでスッキリ!

.box {
  width: 300px;
  height: 200px;
}

.box img {
  width: 100%;
  height: 100%;
  object-fit: cover; /* たったこれだけ! */
}

メリット

  • たった3行でOK
  • 直感的でわかりやすい
  • 副作用なし
  • レスポンシブ対応も簡単
  • メンテナンス性◎

📐 object-positionで位置を調整

デフォルトでは中央配置ですが、object-position を使えば表示位置を調整できます。

上寄せにする

img {
  object-fit: cover;
  object-position: top; /* 上寄せ */
}

顔を中心に配置(人物写真など)

img {
  object-fit: cover;
  object-position: 80% 20%; /* 横80%、縦20%の位置を中心に */
}

左寄せ

img {
  object-fit: cover;
  object-position: left center;
}

実際の動作をデモで確認してみましょう!

👆 位置調整のパターンを確認できます


💼 実用パターン3選

1) ブログカードの画像

<article class="blog-card">
  <img src="thumbnail.jpg" alt="" class="blog-card__image">
  <div class="blog-card__content">
    <h2>記事タイトル</h2>
    <p>記事の説明文...</p>
  </div>
</article>
.blog-card {
  display: grid;
  grid-template-columns: 200px 1fr;
  gap: 1rem;
}

.blog-card__image {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

2) プロフィール画像(正方形トリミング)

<div class="profile">
  <img src="profile.jpg" alt="プロフィール画像" class="profile__image">
  <p class="profile__name">山田太郎</p>
</div>
.profile__image {
  width: 120px;
  height: 120px;
  border-radius: 50%; /* 円形にする */
  object-fit: cover;
}

3) ヒーローイメージ

<section class="hero">
  <img src="hero.jpg" alt="" class="hero__image">
  <div class="hero__content">
    <h1>Welcome</h1>
  </div>
</section>
.hero {
  position: relative;
  height: 60vh;
}

.hero__image {
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: center 30%; /* 空の部分を多く見せる */
}

.hero__content {
  position: absolute;
  inset: 0;
  display: grid;
  place-items: center;
}

実用パターンをまとめて確認できるデモを用意しました!

👆 3つの実用例を確認できます


🎥 動画にも使える!

object-fit<img> だけでなく、<video> 要素にも使えるのが便利です!

<video class="hero-video" autoplay muted loop>
  <source src="hero.mp4" type="video/mp4">
</video>
.hero-video {
  width: 100%;
  height: 60vh;
  object-fit: cover;
}

背景動画のレイアウトがこれだけで完結します!


🌍 ブラウザ対応状況

  • ✅ Chrome / Edge / Safari / Firefox すべて対応済み
  • ❌ IE11は非対応(もう気にしなくてOK)

2025年時点では、実務で安心して使えるレベルです。

Can I use: object-fit


⚠️ よくあるハマりポイント

1. widthheightを指定していない

object-fit を使う場合、親または画像自体に明示的なサイズ指定が必須です。

/* ❌ これだと効かない */
img {
  object-fit: cover;
}

/* ✅ サイズ指定が必要 */
img {
  width: 100%;
  height: 300px;
  object-fit: cover;
}

2. アスペクト比が極端に違う画像

元画像が極端に縦長・横長だと、cover でも大部分がトリミングされてしまいます。

対策

  • object-position で表示位置を調整
  • または画像を事前にトリミング

✅ まとめ

項目 absolute方式 object-fit方式
コード量 7行以上 3行
可読性
副作用 あり(transform) なし
レスポンシブ 複雑 簡単
メンテナンス性

使い分けガイド

  • トリミング+中央配置cover(実務の9割はこれ)
  • 全体を見せたいcontain
  • 位置調整したいobject-position を併用
  • 動画にも使える<video> でも同じ書き方

🎯 最後に

object-fit: cover を知っているだけで、画像レイアウトのコードが劇的にシンプルになります。

「まだabsoluteで複雑に書いている」という方は、ぜひ今日から object-fit に置き換えてみてください!

コードがスッキリして、メンテナンスも楽になりますよ 💪


🔗 参考リンク

Discussion