The CSS object-position property sets where the content of a replaced element (like <img> or <video>) is placed inside its box. It is typically used with object-fit to control cropping and alignment.
object-position は、<img> や <video> のような「置き換え要素」の中身(画像/動画)を、箱の中でどこに寄せるかを決めるプロパティです。
ありがちな困りごと:object-fit: cover にしたら「顔が切れた」「商品が見えない」。このときの主役が object-position です(背景ではなく、画像要素そのものを“狙って見せる”ために使います)。
object-position が「何をどこに合わせる指定か」を言葉で説明できるleft/center/right・top/bottom)と %/px の使い分けが分かるobject-fit と組み合わせて、cover/contain 時の“見せたい部分”を狙えるobject-position って何?直感的には、画像(または動画)を“どこに寄せて見せるか”です。
<img> の表示枠(箱)を決めたうえで、
中の画像を左上へ寄せたり、中央へ寄せたり、少し上へずらしたりできます。
object-position は、要素そのものを動かすのではなく、要素の中身の位置を動かします。
object-fitobject-fit は「中身のサイズのはめ方(伸ばす/収める/切り抜く)」。
object-position は「はめたあと、どこに寄せるか」。
覚え方:object-fit が「収め方」、object-position が「寄せ方」です。
object-position は、置き換え要素(例:<img> / <video> / <iframe> など)の内容オブジェクトを、要素の内容ボックス(content box)の中でどこに配置するかを指定します。
left top は「左上」、50% 50% は「中央」。
20px 10px は「左から20px、上から10px」です。
% は「対応する点どうしを合わせる」0% 0% は「中身の左上」を「箱の左上」に合わせます。
100% 100% は「中身の右下」を「箱の右下」に合わせます。
50% 50% は「中身の中心」を「箱の中心」に合わせます。
% は「左上からの単純な割合」というより、端と端(または中心)を合わせる指定です。
より計算寄りに言うと、横方向のオフセットは (箱の幅 - 中身の幅) × (指定% / 100)、縦方向は (箱の高さ - 中身の高さ) × (指定% / 100) で決まります。cover で中身が大きいと差がマイナスになり、contain で中身が小さいと差がプラスになります。だから % は「端と端(中心どうし)を合わせる」感覚で捉えるのが一番迷いません。
50% 50%(中央)object-fit: cover のように「切り抜きが起きる」場合や、
contain のように「余白が出る」場合は、位置の指定が効いて見えます。
厳密さはここまで覚えればOKです。使うときは「箱の中で、画像/動画をどこに寄せるか」と捉えるのが一番ラクです。
まずは “これだけ” の型
left/center/right(横)と、top/center/bottom(縦)を組み合わせます。
%)50% 30% のように「中心より少し上」など、直感的に“狙い”を作れます。
写真の焦点(顔・商品)を守る用途で定番です。
pxなど)20px 10px のように、ピクセル単位でズラします。
UI素材(アイコン/図)や、サイズが固定に近い場面で安定しやすいです。
right 16px bottom 12px のように「端から何px離す」を書けます。
“端ぴったり”より、少し内側に余白を取る方が、見た目も事故も安定します。
CSS
/* 1値:横だけ指定 → 縦は center 扱い(よく使う) */
.thumb {
object-position: center;
}
/* 2値:横 縦(キーワード) */
.thumbTop {
object-position: center top;
}
/* 2値:横 縦(%) */
.thumbFocus {
object-position: 50% 25%;
}
/* 2値:横 縦(長さ) */
.thumbNudge {
object-position: 12px 8px;
}
/* 4つのトークン:端+余白(端からのオフセット) */
.badgeLike {
object-position: right 12px bottom 12px;
}
ここで止まりがち:object-position だけ書いても、画像が箱に“ぴったり収まっている”状態だと見た目が変わりません。まず object-fit と、width/height で箱のサイズを作れているかを確認します。
このデモは外部画像を使わず、data: URLのSVGで「目印(赤/緑/青の丸と文字)」を用意しています。object-fit を cover にすると切り抜きが起き、object-position で“どこを見せるか”が変わるのが分かります。
ヒント:fill は伸びるので、位置を変えても効果が分かりにくくなります(“効かない”の典型)。
現在の状態:object-fit: cover; object-position: 50% 50%;
HTML
<img class="thumb" src="photo.jpg" alt="...">
CSS
.thumb {
width: 320px;
height: 200px;
object-fit: cover; /* はめ方 */
object-position: 50% 25%; /* 寄せ方(焦点) */
}
実務メモ:「切り抜いて見せる」なら object-fit: cover を先に決め、次に object-position で“守りたい部分”を狙う、の順にすると迷いにくいです。
object-position は画像要素(<img>)そのものを動かす?margin や position、あるいはレイアウト(flex/grid)の話になります。
background-position と同じ?background-position は背景の位置、
object-position は画像/動画要素の中身の位置です。
「装飾としての背景」ではなく「内容としての画像」を扱いたいなら object-position 側が主役になりやすいです。
center 扱いになります。
たとえば object-position: left; は left center の意味。
逆に top のような縦方向のキーワードを1つだけ書いた場合は、横が center になり、center top の意味になります。
object-fit を書いていないのに効かせたいobject-fit を書かなくても、箱と中身のサイズがズレていれば位置は変えられます。
ただし、実務で「狙って切り抜く」場合は cover か contain のどちらかを明示する方が安全です。
fill にしているのに位置が変わらないobject-fit: fill は「伸ばして箱を埋める」ため、切り抜きも余白も起きません。
その結果、位置の違いが見えにくくなります。
“位置で解決したい”なら cover/contain/none を検討します。
cover で統一してから、必要に応じて object-position で上寄せします。
CSS
.cardThumb {
width: 100%;
height: 180px;
object-fit: cover;
object-position: 50% 25%; /* 顔が上に寄りがち、という“現場の癖”に合わせる例 */
}
center を基本語彙にしやすいです。
CSS
.avatar {
width: 72px;
height: 72px;
border-radius: 50%;
object-fit: cover;
object-position: center;
}
<img> で扱う(アクセシビリティ寄り)<img> として置く方が安全なことがあります。
その場合も cover+object-position が使えます。
CSS
.heroImg {
width: 100%;
height: min(52vh, 420px);
object-fit: cover;
object-position: 50% 30%;
display: block;
}
背景よりも「文書として意味を持たせやすい」ため、代替テキスト(alt)や周辺の説明とセットで運用しやすくなります。
<video>)の“切り抜き”を整えるCSS
.videoCover {
width: 100%;
height: 240px;
object-fit: cover;
object-position: center;
}
cover で重要な部分が切れるobject-fit: cover は「箱を埋めるためにトリミング(切り抜き)が起きる」動きです。
object-position で“切れて困る部分”を中央からズラして守ります。
それでも守れない場合は、枠の比率を変える、または画像の用意(トリミング済み素材)を運用として決める方が安全です。
50% 25% でも「どれくらい切れるか」が変わるため、ズレて見えることがあります。
object-position を変える、または“語彙(トークン)”を用意して切り替えます(後述のデザインシステム視点)。
object-position を書いたのに効かないwidth/height が自動のまま)object-fit: fill で伸ばして埋めている(切り抜き/余白が無い)<div> などには効かない)width/height)を決め、object-fit を明示し、置き換え要素に当たっているかを確認します。
<img> は既定でインライン要素なので、文字のベースライン扱いの余白が出ることがあります。
display: block(または vertical-align: middle)で解消します。サムネイル運用では display: block が定番です。
落とし穴:「どの画像でも同じように見せたい」のに、自由入力(37% 22% など)を増やすと、運用が崩れます。迷ったら“少数の語彙”に戻し、例外はルール化して増やすのが安全です。
object-fit(最重要の相棒)object-position は「寄せ方」なので、object-fit(はめ方)で状況が変わります。
実務ではこの2つをセットで考えます。
CSS
.thumbCover {
object-fit: cover;
object-position: center;
}
.thumbContain {
object-fit: contain;
object-position: center; /* 余白の中で中央に置く(必要なら top などへ) */
background: rgba(0,0,0,0.06); /* 余白の見え方を整えたいときの例 */
}
width/height / aspect-ratio(箱を作る)aspect-ratio を使うと、カードの比率を安定させやすくなります。
CSS
.thumb {
width: 100%;
aspect-ratio: 16 / 9; /* 高さを固定せず比率だけ固定 */
object-fit: cover;
object-position: center;
display: block;
}
overflow / クリップ(切り抜きの境界)object-fit の切り抜きは、要素の内容ボックス内で起きます。
角丸(border-radius)を効かせたい場合は、要素自体に border-radius を付けるのが基本です(箱と中身が同じ要素なので管理が簡単)。
background-position との住み分けbackground-position。
内容(画像/動画)として扱うなら object-position。
どちらが適切かは、アクセシビリティ/SEO/運用(CMSで差し替えるか)も含めて判断します。
コツ:まず 箱(width/height/aspect-ratio)を決め、次に はめ方(object-fit)、最後に 寄せ方(object-position)の順にすると、迷子になりにくいです。
alt に逃がす(背景にしない利点)<img> として置き、適切な alt(代替テキスト)を付けられます。
これは背景画像では難しい点です。
object-position で切り抜きが起きる以上、画像内の文字は切れやすいです。
重要な文字はHTMLのテキストとして置くのが原則です。
object-position の調整で“肝心の部分”が見えなくなると、誤タップや誤解につながります。
「何を見せたいか」を優先順位づけして、トークンで統一する方がUXが安定します。
center、例外は top」のようなルールを決めると、揺れが減ります。
ここからは「使える」だけでなく、再利用・制約・設計・運用に繋げる見方です。object-position は自由度が高いので、放置すると“コンテンツごとにバラバラ”になりやすい領域です。
center、center top、center 25%、right bottom)で回せるかを検討します。
“90%はこれで足りる” を目指すと運用が安定します。
right 12px bottom 12px のような指定は、余白スケール(spacing)と揃えることで統一感が出ます。
値が“意味を持つ”ので、レビューもしやすくなります。
CSS
:root {
/* まずは少数の語彙 */
--obj-pos-center: 50% 50%;
--obj-pos-top: center top;
--obj-pos-bottom: center bottom;
/* “焦点”トークン(例:人物写真を上寄せにしがち) */
--obj-focus-face: 50% 25%;
/* 端+余白(スペーススケールに合わせる) */
--obj-pos-inset-br: right 12px bottom 12px;
}
.cardThumb {
object-fit: cover;
object-position: var(--obj-pos-center);
}
.cardThumb--face {
object-position: var(--obj-focus-face);
}
ポイントは「自由入力を減らす」ことです。トークンに落とすと、意図が言語化され、レビュー・保守・一括調整がしやすくなります。
.obj-center).cardThumb の中で固定)object-position をコンポーネントの責務に閉じ込めると、一覧やレイアウト変更時の事故が減ります。
“内容に近い画像”ほど、コンポーネント側で固定する価値が高いです。
data-focus="face")center/top/face)に絞り、CSS側でマッピングする設計が安全です。
37% 22% など)が増えて、意図が共有できなくなる。
50% 20%、PCは 50% 35%)。
結論(設計):object-position は自由に見えるほど、運用では制約が必要です。少数の語彙・トークン化・例外ルール、の3点セットで “作ったあと” が楽になります。
object-position: center; は縦方向も中央ですか?center 扱いになるため、
center は実務上 50% 50% と同じ意図で使えます(既定も中央です)。
% と px はどちらを使えばいいですか?% が便利です(例:50% 25%)。
端からの余白を安定させたい場合は、right 12px bottom 12px のような “端+長さ” が向きます。
object-position が効かないのですが?width/height または aspect-ratio)。
次に object-fit を見直します(fill だと差が出にくい)。
最後に対象が置き換え要素か(<img>/<video> など)を確認すると切り分けが早いです。
object-fit は必ず必要ですか?right 10px bottom 10px のような書き方は常に使えますか?cover にすると顔が切れます。背景にした方がいいですか?<img> のまま object-position で焦点を守り、それでも厳しければ枠比率や素材側の用意(トリミング済み)を運用として決めるのがおすすめです。
width/height または aspect-ratio)を作り、object-fit: cover などで切り抜き/余白が起きる状態にします。fill にしていると位置が効かないcover/contain/none を検討します。img に display: block を指定します。cover で顔やロゴが切れるobject-position を上寄せ/左右寄せで調整。それでも厳しければ枠比率や素材の運用ルールを見直します。width/height/aspect-ratio)を作るobject-fit(cover か contain)で“はめ方”を固定するobject-position で“守りたい部分”を狙う(例:50% 25%)<img> として扱い、alt を含めて設計する