まだabsoluteで画像トリミングしてるの?object-fitで5秒で解決
はじめに
「固定サイズのボックスに画像をトリミング+中央配置したい」
これ、Web制作でめちゃくちゃよくある要件ですよね。
実は私も最近まで、position: absolute と transform を駆使した複雑な方法でやっていました。
でも、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;
-
containとnoneのうち、小さい方を採用 - 画像が小さい場合は元サイズ、大きい場合は 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年時点では、実務で安心して使えるレベルです。
⚠️ よくあるハマりポイント
1. widthとheightを指定していない
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