JINMUSOFTWARE

画像をはみ出さない様に隙間なく表示する方法【CSS】

画像のアスペクト比を保ちつつ親要素に対して隙間なくピッタリと表示する方法です。

アスペクト比を維持しつつ全体を表示する方法も紹介します。

序文

imgタグの画像について

imgタグの画像は置換要素です。

このページは置換要素の「はめ込み方法」を説明しています。

使用するSample画像の紹介

今から使用するsample画像の画像集です。アスペクト比などサイズ感を確認しておいてください。。

sample

30 x 30px 30x30pxの画像

100 x 100px 100x100pxの画像

200 x 200px 200x200pxの画像

300 x 300px 300x300pxの画像 背景は透過

100 x 300px 100x300pxの画像 Helloの文字列

300 x 100px 300x100pxの画像 Helloの文字列

100 x 20px 100x20pxの画像

20 x 100px 20x100pxの画像

imgタグの画像がはみ出す原因

imgタグの画像にサイズを指定していない場合は、画像がそのままのサイズで表示されてしまいます。

  • 小さい画像は隅に表示されます。左上原点。
  • 大きい画像は親要素をはみ出して表示されます。
30pxの画像
300pxの画像
300x100pxの画像

あらら。いろいろはみ出してしまいましたね。

※上記は親コンテナにoverflow: hiddenを設定しているので途中で見切れています。

念のため、imgタグの親コンテナには、overflow: hidden;を設定していおいたほうが良いかもしれませんね。

imgタグの画像の配置を制御する

imgタグにサイズを指定をします。「px」でも「%」でもOKです。

imgタグにサイズを「px」で指定するとそのサイズで表示されます。

imgタグに「%」を指定するとそのサイズは親コンテナに依存します。

親コンテナは、恐らくgridだったりflexであり、レスポンシブルに対応していることと思います。imgタグの画像をレスポンシブルに対応する場合は「%」を選ぶでしょう。

imgタグに100%指定

以下の例は、親コンテナのサイズが160x160px、imgは100%x100%の指定です。

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像

親コンテナのサイズに対して100%の長さでfitする様に拡縮してはめ込まれます。

はみ出すことはありませんが、アスペクト比が違う場合の歪みがきになりますね。

親コンテナの形が長方形でも同じです。160x100pxのサイズです。

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像

以上のようになります。

imgタグに片方のみ100%指定

width: 100%; のみを指定しました。

heightは未指定です。

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像

heightはautoになりますので、アスペクト比は維持されます。

縦の長さがコンテナより長い場合は、はみ出すので、over-flowの制御を考えておく必要があります。

補足

上記の画像を上下中央に表示したい場合は、親要素の高さと親要素のline-heightの値を同じ高さにして、imgタグのvertical-alignをmiddleにする必要があります。

自分で比率を計算してみる

補足ですが、比率を計算して、アスペクト比を維持することもできます。

ただしこの方法ですと各画像のアスペクト比を計算して、コンテナに対して比率を%で指定する必要があります。とっても面倒です。

これは、widthとheightの両方でも、片方でも指定すればアスペクト比を維持できます。

100% x 66.67% の例
300x100pxのサンプル画像
66.67% x 100% の例
300x100pxのサンプル画像

結論

imgに100%を設定すると親コンテナのサイズに追従します。まぁ100%と指定していますからね。

object-fitを使用して画像のは見込みを制御する

object-fitプロパティを使用すると、はめ込む画像を制御できます。

まずは、imgタグにサイズを指定します。「%」でも「px」でも大丈夫です。

ここでは、width:100%; height: 100%;を指定します。

さて、Object-fitの値を色々指定してみましょう。

object-fit: fill;

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
  • 親コンテナに合わせて拡縮されます。object-fitを指定していないときと同じですね。
  • アスペクト比は維持されません。

object-fit: contain;

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
  • 画像が親コンテナに収まるサイズに拡縮します。
  • 画像の長い辺が親サイズに合わせて拡縮します。短い辺はアスペクト比を維持する長さに拡縮します。
  • 画像は中央に配置されます。(変更できます)
  • 親サイズとアスペクト比が異なる場合は、空白の範囲が生まれます。
  • アスペクト比を維持します。

object-fit: cover;

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
  • 画像の短い辺が親サイズに合わせて拡縮します。長い辺はアスペクト比を維持する長さに拡縮します。
  • 親サイズとアスペクト比が異なる場合は、長い辺側が見切れます。
  • 親コンテナには画像が隙間なく表示されます。coverだけにcoverされていますね。
  • アスペクト比を維持します。

object-fit: scale-down;

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
  • 親コンテナより大きい画像はcontainと同じく縮小されて表示されます。
  • 親コンテナより小さい画像はそのまま表示されます。
  • アスペクト比は維持されます。

object-fit: none;

30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
30pxのサンプル画像
100pxのサンプル画像
200pxのサンプル画像
300pxのサンプル画像
300x100pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像
20x100pxのサンプル画像
  • 拡縮せずそのまま表示されます。
  • よって、アスペクト比は保たれます。

補足

画像の中心

object-fitを使用して画像を表示した場合、画像は中央に表示されますが変更できます。

object-position: x y;
object-position: 50% 50%; /* 中央表示 */

中心のずれているいくつかのsample

30pxのサンプル画像
100x300pxのサンプル画像
100x20pxのサンプル画像

object-fitを使用したときの画像のはみ出し

object-fitを使用したときは画像がはみ出しません。

結論

親コンテナに対して画像を隙間なく表示する方法は、

imgタグに以下設定する。

  1. サイズを明示する。
  2. object-fit: cover を指定する。

以上。

memo

メモです

object-fitプロパティについて

object-fitを使用するには、imgタグにサイズに指定が必要。

imgタグにサイズ指定をしないと効果無し。画像は拡縮されずそのまま表示される。

imgタグにサイズ指定するには、height、widthの両方に指定する。

親コンテナがフレキシブルとすれば、imgは100%を指定する。

アスペクト比が親に依存するので歪む可能性があり。

プロパティ値

contain

アスペクト比維持。画像の全てがコンテナ内に含まれる様に拡縮されて配置。画像とコンテナのアスペクト比が異なる場合は隙間が発生する。

cover

アスペクト比維持。短い辺に合わせて拡縮されて配置。長い辺は見切れる。隙間なく配置。

scale-down

アスペクト比維持。大きい場合のみ縮小する。containの様に拡大はしない。

none

アスペクト比維持。拡縮しない。素のサイズで配置される。

fill

アスペクト比破綻。親コンテナに合わせて拡縮して配置。object-fit未指定と同じ。

全て中央配置

object-positionで変更可能

Imgタグについて

alt属性はあったほうが良き。読み込めないときの文字の保険。altは画像そのものと同じくらいのも。

alt属性が空文字の場合(alt=””)、この画像が重要でないことを示すことになる。

alt属性そのものが省略されている場合は、テキストでは表すことのできないほど重要な要素を示すことになる。

imgタグは中々奥が深い。

属性でサイズを指定できる。width、heightでサイズを指定できる。単位は無い。ブラウザで描画されるときあらかじめ領域を確保するので画面の乱れを抑える期待がある。

セキュリティの設定もある。crossorigin、referrerpolicyなど参考。

sizes、srcsetなど、レスポンシブ対応が新しい。pictureタグも参考にしようかな。

WebPがおすすめなのかな?

実は画像読み込みエラーに対応できるようだ。

Decodeのヒントをブラウザに指定できる。sync, async, auto

loadingのヒント。eager, lazy

sizes: サイズのセット

srcset: ソース画像のセット

imgは、置換要素、inline要素、空タグ、です。

埋め込まれた画像には、padding、margin、width、heightを設定できる。borderも。

imgタグはbaselineが無い。画像の下っ端がそれに揃う。

titleはツールチップかな。ユーザがそれに気づかない可能性は大いにある。

30pxのサンプル画像

参考資料

object-fit

<img>: The Image Embed element

HTML の画像

コンテンツカテゴリー

<picture>: 画像要素

画像ファイルの種類と形式ガイド

関連記事

Box-Sizingを理解してボーダー幅のはみ出しを抑える方法

IMGタグの隙間問題

imgタグ画像要素が親要素をはみ出すとき解決方法を考える