【PR】を含みます。

フロントエンド

【CSS】画像サイズを合わせる方法|object-fitの使い方

CSSで画像サイズを合わせる方法とobject-fitの使い方を紹介するイラスト

CSSで画像サイズを合わせる方法は、目的によって2つあります。

親要素の幅に合わせるだけの場合は、imgにmax-width: 100%とheight: autoを指定します。サイズの違う画像を同じ大きさの枠にそろえる場合は、object-fitを使います。

この記事では、object-fitの5つの値の見え方をデモで比べます。あわせて、画像を枠に合わせる方法と、object-positionで切り取る位置を変える方法を紹介します。どちらもコピペで使えるCSSを載せています。

CSSで画像サイズを合わせる2つの方法

画像を親要素の幅に合わせる(max-width)

横幅だけを親要素に合わせて、高さは画像の縦横比のまま決まればよい場合は、imgに次の2行を指定します。

CSS
Copy
img {
  max-width: 100%;
  height: auto;
}

max-width: 100%は、画像を親要素の幅より大きくしない指定です。画像のほうが親要素より小さい場合は元の幅のまま表示され、引き伸ばされません。

height: autoは、HTMLのimgにwidth・height属性を書いている場合に必要です。height: autoを書かないと、幅だけが縮んで高さは属性の値のまま残り、画像が縦に伸びて表示されます。

この方法では、縦横比が違う画像を並べると高さがそろいません。

縦横比が違う画像を同じサイズで表示する(object-fit)

object-fitを使うと、画像と枠の縦横比が合わないときに、はみ出た部分を切り取るか、足りない部分を余白にするかを値で選べます。

object-fitとは

object-fitは、imgやvideoに指定した幅と高さの中に、画像や動画をどう収めるかを決めるCSSプロパティです。

object-fitで画像を枠に合わせるには、imgの幅と高さを両方決めておきます。親要素にだけ幅と高さを指定し、imgが元の縦横比のまま表示されている状態では、object-fitを書いても見た目は変わりません。

親要素を枠にする場合は、imgにwidth: 100%とheight: 100%を指定して、imgを枠と同じサイズに広げます。

object-fitのブラウザ別対応状況

現在の主要ブラウザ(Chrome・Edge・Firefox・Safari)はすべて対応しているので、ベンダープレフィックス(-webkit-などの接頭辞)や古いブラウザ向けの対策は要りません(MDN: object-fit)。

caniuse.comによるobject-fitのブラウザ別対応状況の表

object-fitの値一覧

値縦横比枠への収まり方
fill(初期値)保たない枠いっぱいに引き伸ばす。枠と縦横比が違うと、画像が縦か横に伸び縮みして歪む
contain保つ画像全体が枠に収まるように拡大・縮小する。縦横比が合わない部分は余白になる
cover保つ枠全体を埋めるように拡大・縮小する。枠からはみ出した部分は切り取られる
none保つ拡大・縮小しない。元のサイズのまま枠の中央に置く
scale-down保つnoneとcontainのうち、画像が小さく表示されるほうになる

次の横長の画像を正方形の枠に入れて、object-fitの値ごとの見え方を比べます。灰色の線が枠です。

元の横長の桜の写真

fill(初期値)

object-fit: fillで横長の桜の写真の縦横比が崩れて歪んだ表示

contain

object-fit: containで横長の桜の写真全体が正方形の枠に収まり上下に余白が出た表示

cover

object-fit: coverで横長の桜の写真の左右が切り取られた表示

none

object-fit: noneで横長の桜の写真が元のサイズのまま中央部分だけ表示された状態

scale-down

object-fit: scale-downで横長の桜の写真がcontainと同じく枠に収まった表示

このデモのscale-downがcontainと同じ表示なのは、画像が枠より大きいからです。画像が枠より小さい場合はnoneと同じく元のサイズで表示され、枠に合わせて拡大されません。

object-fit: coverとcontainの違い

coverとcontainの違いは、画像と枠の縦横比が合わないときの収め方です。containは画像全体を枠に収めて余白を残し、coverは枠を埋めてはみ出た部分を切り取ります。

画像全体を見せたい場合はcontain、枠に余白を出したくない場合はcoverを選びます。

正方形の枠に表示すると、横長の画像はcontainで上下に余白が出て、coverで左右が切り取られます。縦長の画像では逆に、containで左右に余白が出て、coverで上下が切り取られます。

元の縦長の城と桜の写真

contain

object-fit: containで縦長の写真の左右に余白が出た表示

cover

object-fit: coverで縦長の写真の上下が切り取られた表示

画像サイズを枠に合わせるCSS

枠のサイズをpxで固定する

枠にするdivに幅と高さを指定し、中のimgを枠いっぱいに広げてからobject-fitを指定します。

HTML
Copy
<div class="thumbnail">
  <img src="image.jpg" alt="画像の説明">
</div>
CSS
Copy
.thumbnail {
  width: 300px;
  height: 200px;
}
.thumbnail img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

縦横比が違う画像も、.thumbnailに指定した幅と高さで表示されます。画像を切り取らずに全体を見せたい場合は、coverをcontainに変えます。

枠を画面幅に合わせて伸縮させる

枠に幅と高さを指定する代わりに、aspect-ratioで縦横比を指定します。divは親要素の幅いっぱいに広がり、高さは幅とaspect-ratioから決まります。HTMLは、imgを<div class="thumbnail">で囲みます。

CSS
Copy
.thumbnail {
  aspect-ratio: 4 / 3;
}
.thumbnail img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}

aspect-ratio: 4 / 3は「幅4に対して高さ3」の比率です。正方形にする場合は1 / 1にします。aspect-ratioも、現在の主要ブラウザ(Chrome・Edge・Firefox・Safari)はすべて対応しています。

imgのdisplay: blockは、画像の下にできる隙間を消すための指定です。imgは初期状態では文字と同じ行に並ぶ要素なので、画像の下にわずかな隙間ができます。pxで固定した枠では見た目に影響しませんが、aspect-ratioで作った枠では隙間の分だけ枠が縦に伸びて、縦横比がずれます。

枠にwidthとheightを両方指定していると、aspect-ratioは効きません。「枠のサイズをpxで固定する」のコードを書き換える場合は、.thumbnailのwidthとheightを消してからaspect-ratioを足します。

画像を切り取る位置を変える(object-position)

object-fit: coverでは、初期状態だと画像の中央が残り、上下または左右の端が切り取られます。object-positionの初期値が50% 50%(中央)だからです。

人物の顔や建物など、残したい部分が中央から外れている場合は、.thumbnail imgにobject-fit: coverを指定したCSSはそのままにして、次の指定を足します。

CSS
Copy
.thumbnail img {
  object-position: center bottom;
}

center bottomは「横は中央、縦は下端」に合わせる指定です。left・right・topなどのキーワードのほか、50% 100%のように割合でも書けます。割合で書く場合は、1つ目が横、2つ目が縦の位置です(MDN: object-position)。

縦長の画像を正方形の枠にcoverで表示し、初期値とcenter bottomを比べると次のようになります。

初期値(50% 50%)

object-positionが初期値で縦長の写真の中央が残り城の下側が切れた表示

center bottom

object-position: center bottomで縦長の写真の下側が残り城と桜が収まった表示

よくある質問

Q. object-fitを指定したのに画像が変わらないのはなぜですか?

A. img自身の幅と高さが決まっていない可能性があります。次の3点を確認してください。

  • 枠のdivだけに幅と高さを書き、imgにwidth: 100%・height: 100%を書いていない
  • 枠のdivに高さが無く、imgのheight: 100%が効いていない(枠にheightかaspect-ratioを指定する)
  • WordPressのテーマなど、ほかのCSSがimgにheight: autoを指定していて、書いたheightが上書きされている(ブラウザの開発者ツールで、heightに取り消し線が付いていないかを見る)

heightに取り消し線が付いていた場合は、上書きしているCSSよりも詳細度(どのCSSを優先するかを決める強さ)の高いセレクタで指定し直します。それでも上書きできない場合は、!importantを付けます。

Q. background-sizeのcover・containとの違いは何ですか?

A. 使う対象が違います。background-sizeはCSSの背景画像(background-image)に、object-fitはHTMLのimgやvideoに使います。

coverとcontainの意味は、object-fitと同じです。coverは枠を埋めてはみ出た部分を切り取り、containは画像全体を枠に収めます。ただしbackground-size: containは余った部分に画像が繰り返し並ぶことがあるので、background-repeat: no-repeatもあわせて指定します。

Q. object-fitは動画(video)にも使えますか?

A. 使えます。videoに幅と高さを指定してobject-fit: coverにすると、動画と枠の縦横比が違っても、枠を埋めて表示できます。

まとめ

  • 画像を親要素の幅に合わせるだけの場合は、imgにmax-width: 100%とheight: autoを指定する
  • 縦横比が違う画像を同じ大きさでそろえる場合は、object-fitを使う
  • 画像全体を見せたい場合はcontain、枠を余白なく埋めたい場合はcoverを選ぶ
  • 枠を画面幅に合わせて伸縮させる場合は、枠にaspect-ratioを指定し、imgにdisplay: blockを足す
  • coverで残したい部分が切れる場合は、object-positionで切り取る位置を変える
この記事を書いた人
もみじのアイコン画像

もみじ

現役フリーランスWebエンジニア。フロントエンド開発を中心に、Web制作、WordPress、業務効率化ツール開発、PHPを用いた機能改修に携わってきました。社内SEとして業務ツール開発や運用保守を担当した経験もあります。

実務や学習を通じて得た知見をもとに、初心者がつまずきやすいポイントや、現場で役立つ考え方をわかりやすく発信しています。

詳しいプロフィールはこちら

-フロントエンド
-