Menu

CSS box-shadow で影を付ける: 書き方、spread、inset

box-shadow は要素のボックスの周りに影を描きます。5 つの値 (x、y、ぼかし、広がり、色)、内側の影 inset、自然な奥行きを出す複数の影の重ね方、spread で作るフォーカスリング、影がにごって見える間違いを解説します。

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

box-shadow のしくみ

box-shadow は要素の border ボックスの周りに影を描きます。border-radius に沿い、レイアウトでは場所を取らず、少なくとも 2 つの値 (横と縦にどれだけずらすか) が必要です。

書き方

box-shadow: [inset] <offset-x> <offset-y> [<blur>] [<spread>] [<color>];
値意味初期値
insetへこんだ部分のように、ボックスの内側に影を描く外側
offset-x正の値で右、負の値で左にずらす必須
offset-y正の値で下、負の値で上にずらす必須
blur縁のぼかし具合。負の値は不可0 (くっきりした縁)
spread影を大きく (正の値) または小さく (負の値) する0
color任意の色。半透明の黒が一番きれいに見えることが多い文字の色

長さの数で意味が決まります。2 つならずらし、3 つならぼかしが加わり、4 つなら spread が加わります。試してみてください:

0 0 0 4px #f59e0b (リング)、inset 0 0 12px #2563eb、-8px -8px 0 #16a34a を試してみてください。

spread: リングと片側だけの影

spread はぼかす前に影の大きさを変えます。ここから 2 つのパターンが生まれます:

  • リング: ずらしもぼかしもなく、spread だけ。border と違って要素のサイズを変えないので、フォーカスの表示に向いています (:focus-visible { box-shadow: 0 0 0 3px #2563eb; })。
  • すき間のあるリング: 白い spread を、それより大きい色付きの spread の下に重ねます。
  • 片側だけ: 影を下にずらし、負の spread で小さくして、下にだけのぞくようにします。

影を重ねて自然な奥行きを出す

本物の影には、物体の近くの暗くくっきりした部分と、離れたところの柔らかく薄い部分があります。2 つか 3 つのレイヤーを重ねると、大きなぼかし 1 つよりずっと本物らしくなります:

リストの最初の影が一番上に描かれます。影の色は半透明の黒か背景の暗い色にして、純粋な灰色は避けましょう。そうすれば下にあるものが何でも暗く見えます。

内側の影 (inset)

inset は、表面がへこんでいるように padding ボックスの内側に影を描きます。テキスト入力欄、くぼみ、押されたボタンに向いています:

input {
  box-shadow: inset 0 1px 3px rgb(0 0 0 / 20%);
}
button:active {
  box-shadow: inset 0 3px 6px rgb(0 0 0 / 30%);
}

内側の影は背景の上、内容の下に描かれます。ボックスではなく文字の形に沿う影は text-shadow です。

よくある間違い

  • 完全に不透明な真っ黒の影。 黒い輪郭線のように見えます。アルファ値は 10% から 30% にしましょう。
  • 奥行きを大きなぼかし 1 つで出す。 小さくくっきりした影と大きく柔らかい影を重ねます。
  • 影が端で切れる。 祖先の overflow: hidden で切り取られています。祖先に padding を足すか、overflow の指定を移しましょう。
  • 負のぼかし。 無効で、宣言全体が無視されます。
  • 多くの要素で box-shadow をアニメーションさせる。 毎フレーム再描画されます。重いページでは、大きい影を持たせた疑似要素の opacity をアニメーションさせましょう。

よくある質問

box-shadow の書き方は?

box-shadow: offset-x offset-y blur spread color; です。例: box-shadow: 0 4px 12px 0 rgb(0 0 0 / 15%);。必須なのは 2 つのずらしの値だけで、inset を付けるとボックスの内側に影を描きます。

box-shadow の spread は何をしますか?

ぼかす前の影を大きく (正の値) したり小さく (負の値) したりします。ずらしもぼかしもなく spread が 3px の影は、要素の周りの 3px の単色のリングになります。

下だけに影を付けるには?

影を下にずらし、負の spread で内側に引っ込めて左右を消します: box-shadow: 0 8px 6px -6px rgb(0 0 0 / 40%);。

box-shadow はレイアウトに影響しますか?

しません。影は場所を取らず、ほかの要素を動かしません。そのため、レイアウトのずれなしにフォーカスリングやホバー時の浮き上がりを付けるのに向いています。ただし祖先の overflow: hidden で切り取られることがあります。

box-shadow は複数指定できますか?

できます。カンマで区切ります。最初の影が一番上に描かれます。小さくくっきりした影と大きく柔らかい影を重ねると、大きな影 1 つよりも自然に見えます。

Coddy programming languages illustration

Coddyでコードを学ぼう

始める