背景画像を設定する
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-mode | multiply のようにレイヤー同士を合成する |
よくある間違い
- パスの間違い。 スタイルシートの中の
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 のショートハンドが画像をリセットしたこと、のいずれかです。