Menu

CSS 背景画像 (background-image) の使い方: サイズ、位置、繰り返し

background-image は要素の内容の後ろに画像やグラデーションを表示します。url() とグラデーション、background-size (cover と contain)、background-position、background-repeat、複数の背景の重ね方、background のショートハンドを解説します。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

背景画像を設定する

background-image は、要素の内容、padding、border の後ろに画像を描きます。初期状態では padding ボックスの左上から始まり、画像本来のサイズのまま、ボックスを埋めるように繰り返されます:

実際のプロジェクトでは url() はファイルを指します: url("images/hero.jpg")。パスは、その指定を含むスタイルシートからの相対パスです (<style> 要素ではページからの相対パス)。このページの例は、どこでも動くように、小さな SVG 画像を data: URL としてインラインで書いています。

最初に知っておきたいことが 2 つあります:

  • 背景は要素にサイズを与えません。 背景画像を指定した空の div の高さは 0px です。内容、padding、height、aspect-ratio のどれかで大きさを与えてください。
  • 背景画像は装飾です。 スクリーンリーダーは読み飛ばし、代替テキストもありません。意味を持つ画像は <img> 要素で表示します。

background-size: cover、contain、長さ

background-size は画像の大きさを変えます。2 つのキーワードは縦横比を保ちます:

画像は横幅が高さの 2 倍で、どのボックスも正方形です。

値結果
auto (初期値)画像本来のサイズ
coverボックスを完全に埋めるまで拡大縮小し、はみ出た部分は切り取られる
contain画像全体が収まるまで拡大縮小し、2 辺に灰色の帯が残る
200px幅 200px、高さは比率に合わせる
50% autoボックスの幅の半分、高さは比率に合わせる
100% 100%ボックスとぴったり同じサイズ。縦横比が違うと画像がゆがむ

ヒーローバナーやカードには cover がよく使われます。contain は、絶対に切れてはいけないロゴやイラストに使います。

background-position と background-repeat

background-position はボックスの中の画像の位置を、キーワード (top、center、bottom、left、right)、パーセント、長さで指定します。background-repeat は繰り返しを制御します。いろいろな値を試してみてください:

位置は top right、bottom 10px right 20px、25% 75%、繰り返しは repeat-x、repeat-y、space (切れないように間隔を空けて並べる)、round (ちょうど整数個が収まるようにサイズを調整する) を試してみてください。

重ねる: 複数の背景と文字のオーバーレイ

background-image にはカンマ区切りのリストを指定できます。最初のレイヤーが一番上に描かれます。よくある使い方は、写真の上に半透明のグラデーションを重ねて、白い文字を読みやすくすることです:

aspect-ratio が空のボックスに高さを与え、background-size: cover は両方のレイヤーに適用されます。グラデーションの例は CSS グラデーション にまとめています。

background のショートハンド

background は背景のプロパティすべてを 1 行で指定します。サイズは位置のすぐ後にスラッシュで区切って書き、色は最後のレイヤーに書きます:

.hero {
  background: url("hero.jpg") center / cover no-repeat, #1f2937;
}
/* the same as */
.hero {
  background-image: url("hero.jpg");
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
  background-color: #1f2937;
}

代わりの色は、画像の読み込み中と読み込みに失敗したときに表示されます。ショートハンドで省略したプロパティは初期値にリセットされるので、ショートハンドを先に書き、個別のプロパティはその後に書きましょう。

そのほかの背景プロパティ

プロパティ役割
background-attachment: fixedページをスクロールしても画像が動かない (iOS Safari では無視されます)
background-origin位置の基準を border、padding、内容のどの端にするか
background-clip背景を描く範囲。文字の中を塗る text もあります
background-blend-modemultiply のようにレイヤー同士を合成する

よくある間違い

  • パスの間違い。 スタイルシートの中の url() は、HTML ページではなく CSS ファイルからの相対パスです。
  • 空の要素。 高さがないので、画像を表示する場所がありません。
  • no-repeat の付け忘れ。 contain や小さな画像では、画像が繰り返されます。
  • cover のつもりで 100% 100% を使い、画像を引き伸ばす。
  • 重要な画像を背景にする。 内容としての画像には代替テキスト付きの <img> を使います。背景はスクリーンリーダーから見えません。
  • 空白や引用符を含む data: URL を引用符で囲まない。 常に url("...") と書きましょう。

よくある質問

CSS で背景画像を設定するには?

要素に background-image: url("photo.jpg"); を指定します。パスは CSS ファイルからの相対パスです (style 属性や <style> 要素ではページからの相対パス)。背景は空の要素を大きくしないので、要素にサイズを与えてください。

背景画像を要素全体に表示するには?

background-size: cover; と background-position: center; を使います。画像は縦横比を保ったまま拡大縮小されてボックス全体を埋め、はみ出した部分は切り取られます。

cover と contain の違いは何ですか?

cover はボックス全体を埋め、収まらない部分を切り取ります。contain は画像全体を表示し、縦横比が違うときは 2 辺に空白が残ります。

背景画像を繰り返さないようにするには?

background-repeat: no-repeat; を追加します。初期状態では、背景画像は要素を埋めるように縦横両方向に繰り返されます。

背景画像が表示されないのはなぜですか?

よくある原因は、url() のパスの間違い (CSS ファイルからの相対パスです)、内容がないため高さが 0 の要素、後から書いた background のショートハンドが画像をリセットしたこと、のいずれかです。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める