The CSS box-shadow property draws shadows around an element’s frame. It can add depth, highlight focus states, and improve UI clarity when used subtly and consistently.
box-shadow は「要素の外側(または内側)に影を描く」ためのCSSプロパティです。
box-shadow が「どこに、どう描画される影」なのかを説明できるinset を、用途で使い分けられる:focus-visible)として安全に使う判断ができるoutline / filter: drop-shadow() との違い等)を整理できるbox-shadow って何?ざっくり言うと、box-shadow は「要素の箱(ボックス)のまわりに、にじむ影を描いて、奥行きや区切りを作るスイッチ」です。
inset)box-shadow は、要素の枠(ボックス)に対して影を描き、境界・階層・状態を分かりやすくするために存在します。境界線(border)だけでは硬い印象になりやすい場面で、柔らかい区切りとして使えます。
基本的に 要素のボックスに適用されます(ブロック/インラインブロック/置換要素など)。擬似要素(::before / ::after)にも、ボックスを持つ形で生成していれば適用できます。
inset)text-shadow のように文字そのものに影をつける(文字は text-shadow)filter: drop-shadow() が近い)overflow: hidden などで 影が切れることがあります。これは「効かない」のではなく「描かれているが見えない」状態です。padding やサイズで確保します。outline や色・形の変化も併用します。CSS
.card {
box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12);
}
0 6px 18px は順に、offset-x(横方向), offset-y(縦方向), blur-radius(ぼかし)です。色は rgba() などで透明度を足すと、強さを調整しやすいです。
0 1px 2px + 0 6px 18px のように、薄い影を重ねると自然になりやすいです。inset 0 1px 2px のような内側影は、境界線より柔らかい“奥行き”を作れます。:focus-visible と組み合わせ、0 0 0 3px のように“外側に広げる影”で囲むと視認性が上がります。<style>style="box-shadow: ..." は検証には便利ですが、運用では差分管理が難しくなりやすいので、最後の手段に寄せます。デモは「悪い例 → 良い例」で、差が一目で分かるようにします。
悪い例:影が強すぎる
濃い影・大きいぼかし・大きい広がりは、UIだと“汚れ”や“古さ”に見えやすく、描画コストも上がりがちです。
ポイント:まずは小さく薄く。必要なら重ねる。
良い例:薄い影を重ねる
薄い影を2枚重ねると、境界が自然になりやすく、デザイン変更にも強いです。
ポイント:rgba() で透明度を調整しやすい。
inset:内側の影
入力欄やパネルなど、“へこみ”を出したい時に便利です。
ポイント:境界線(border)と合わせると安定。
切れの例:overflow: hidden の容器の中だと外側の影は切れます(効かないのではなく、見えていない)。
フォーカス例:キーボード移動でフォーカスが当たるときだけ、見失わないリングを出します(:focus-visible)。
ホバー例:影の変化は控えめに。動きを減らす設定の人にはアニメを切ります。
HTML
<div class="demoShadowCard demoShadowGood">
<p class="demoShadowCardTitle">良い例:薄い影を重ねる</p>
<p>薄い影を2枚重ねると、境界が自然になりやすく、デザイン変更にも強いです。</p>
</div>
<button class="demoShadowButton" type="button">Tabキーでここにフォーカス</button>
CSS
.demoShadowGood {
box-shadow:
0 1px 2px rgba(0, 0, 0, 0.12),
0 6px 18px rgba(0, 0, 0, 0.10);
}
.demoShadowButton:focus-visible {
outline: 2px solid transparent;
box-shadow:
0 0 0 3px rgba(1, 136, 255, 0.35),
0 1px 2px rgba(0, 0, 0, 0.15);
}
box-shadow は 継承しません。親に影をつけても、子に自動ではつきません(子に必要なら子にも指定します)。none(影なし)です。box-shadow の長さは px や em などの長さで指定します。% は基本的に使いません(使える前提で考えると事故ります)。rgba() などの色や長さを“確定”させて描画します。DevTools の Computed で最終的な box-shadow を見ると、効いている/上書きされているが分かります。offset-x と offset-y は必須です。順番が崩れると無効になることがあります。color は省略でき、既定の色(多くは currentColor 相当)になります。transition で box-shadow を変えられます。ただし大きいぼかしや広い影は重くなりやすいので、変化は小さく・短くが安全です。box-shadow と text-shadowbox-shadow はボックス、text-shadow は文字です。文字の可読性を上げたいなら、まずは背景色やコントラストを見直し、必要なら text-shadow を検討します。box-shadow と outlineoutline は“線”で、フォーカス可視化の王道です。box-shadow は“にじみ”なので、デザインに馴染ませやすい反面、薄すぎると見落とされます。フォーカス用途では outline を消さない、消すなら同等以上に目立つ代替を作る、が安全です。box-shadow と filter: drop-shadow()drop-shadow() は“画像や要素の描画結果”に対して影を落とします。透明部分を持つアイコン画像に沿った影を作りたい場合は drop-shadow() の方が近いです(ただしフィルターは重くなりやすいので注意)。inset だけで区切りにすると、背景色が変わった時に境界が消えることがあります。境界が必要なら border とセットにすると崩れにくいです。要素同士の境界を作る目的で、border の代わりに薄い box-shadow を使うことがあります。背景が写真やグラデーションでも、影は“柔らかい区切り”として機能しやすいです。
影で押せそうに見せるのは効果がありますが、押せるかどうかは 形・ラベル・余白でも伝えます。影は補助として扱うと安定します。
フォーカスリングは :focus-visible とセットにするのが基本です。エラーは影だけでなく、border-color、説明文、アイコンなどを併用して“見落としにくさ”を上げます。
box-shadow を見て、どのルールが勝っているか確認します。box-shadow: none が後から当たっていないかチェックします。rgba() の透明度が小さすぎたり、背景が暗い/明るいと影が見えにくいです。まずは色・透明度を少し上げ、必要なら影を2枚に分けます。overflow: hidden / clip-path / mask などで、影が見切れます。影を見せたい要素に対して、外側のラッパーで影を持たせると解決しやすいです。
blur と大きい spread はコストが上がりやすい:focus-visible を使い、キーボード操作時に見失わない表示を用意するoutline や border も併用するtransition は短く、小さく。prefers-reduced-motion で無効化するborder-radiusoverflow: hidden と併用すると影が切れます(角丸クリップのため)。outline / outline-offsetbox-shadow でリングを作る場合も、outline を残す/同等の視認性を確保する判断が重要です。:focus-visiblefilter: drop-shadow()position と重なりoffset-x / offset-yblur-radiusspread-radiusinsetbox-shadow はレイアウトに影響しない(押し広げない)overflow: hidden で切れることがある(“効かない”と勘違いしやすい)outline を無闇に消さない問題:box-shadow を付けたのに、要素の外側の影が見えません。最初に疑うべきCSSはどれ?
解説:overflow: hidden(自分または親)を疑います。影は描かれていても、はみ出しが切られます。
問題:ボタンのフォーカス表示を作りたい。outline: none を付けるのは安全?
解説:基本は非推奨です。消すなら、:focus-visible で同等以上に見えるリングを必ず用意します。
問題:box-shadow: 0 10px red; の指定は有効?
解説:有効です。offset-x と offset-y が揃っているため成立します(blur や spread、色は省略可能)。
問題:影を2つ重ねたい。指定方法は?
解説:カンマ区切りで並べます。box-shadow: 0 1px 2px ... , 0 6px 18px ...; のように書きます。
問題:text-shadow と box-shadow の違いを一言で。
解説:text-shadow は文字、box-shadow は要素の箱に影をつけます。
rgba(0,0,0,0.12) のように薄くし、必要なら2枚に分けます。背景が暗い場合は透明度を下げる/色相を少しずらすなどで馴染ませます。overflow: hidden などで“はみ出し”がクリップされています。影を見せたいなら、外側の要素に影を持たせる構造にします。box-shadow で作ってもいいですか?outline を消さない、消すなら同等以上に見える表示を作る、:focus-visible を使う、を守ると安全です。box-shadow をアニメーションさせても大丈夫?prefers-reduced-motion で無効化する配慮も入れます。padding やボタン自体のサイズ、cursor、ラベル表現で作ります。box-shadow: none)/ 透明度が低すぎる / 背景と同化box-shadow を確認overflow: hidden、clip-path、角丸クリップoverflow を確認(DevTools の Styles)blur、広い影、固定要素に影、影のアニメーションoutline: none を入れた、影が薄い、背景と同化:focus-visible を強制outline を戻す、リングを太く/濃くする、色・境界線も併用
:focus-visible を基本にし、outline を無闇に消さないprefers-reduced-motion で無効化する