2026年版 ToolShare Lab / Guide

CSSボックスシャドウ
完全ガイド

「なんとなく影をつけているけど、ちゃんと理解していない」を解決する。box-shadowプロパティの基本構文からinsetシャドウ、複数シャドウの重ね方、コピペで使えるデザインパターン20選、パフォーマンス最適化、レスポンシブ対応、ダークモード設計まで、実務で必要な知識をコード付きで網羅した。

読了時間: 約18分 更新日: 2026年3月16日

box-shadowジェネレーターで今すぐ作成

スライダーを動かすだけでbox-shadowをリアルタイムにプレビュー。この記事のパターンをベースにカスタマイズできる。登録不要・完全無料。

CSS box-shadowとは、要素に影を付けるプロパティで、構文は box-shadow: offset-x offset-y blur spread color inset の6値で指定する。offset-xとoffset-yの2値が必須で、blur・spread・color・insetは任意である。カンマ区切りで複数の影を重ねることも可能で、カードUIやニューモーフィズムなど20以上のデザインパターンに応用できる。

実際にbox-shadowを試したい方は、box-shadowジェネレーターでリアルタイムプレビューしながら値を調整できます。

box-shadowの基本構文

CSSのbox-shadowプロパティは、要素に影(シャドウ)効果を加えるプロパティだ。カードの浮き上がり表現といった単純な使い方から、ネオモーフィズムやグロウといった凝ったデザインまで、UIの奥行きと立体感はほぼこの1プロパティで決まる。

構文の全パラメータ

box-shadowの完全な構文はこうなる。

box-shadow: offset-x offset-y blur-radius spread-radius color inset; /* 例 */ box-shadow: 4px 8px 16px 0px rgba(0, 0, 0, 0.15);

各パラメータの意味を順番に整理する。

パラメータ 意味 必須 初期値
offset-x X方向のずれ。正の値で右、負の値で左へ影が伸びる 必須 -
offset-y Y方向のずれ。正の値で下、負の値で上へ影が伸びる 必須 -
blur-radius ぼかし半径。大きいほど影がふんわりと広がる。0だとシャープな影 任意 0
spread-radius 影の拡大・縮小。正の値で広がり、負の値で縮む 任意 0
color 影の色。rgba()で透明度も指定できる 任意 currentColor
inset キーワード。指定すると内側に影が付く 任意 外側シャドウ

最小構成から順番に理解する

  1. offset-xとoffset-yだけ(最小構成)

    2つの値だけでも影は付くが、ぼかしがなくシャープな影になる。意図的なデジタル風表現なら使えるが、通常はblurも一緒に指定する。

  2. blurを追加する(標準構成)

    blurを加えると自然なふんわりとした影になる。UIカードやボタンでは box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1) のように blur を 8〜16px 程度に設定するのが定番だ。

  3. spreadを使って影の大きさを制御する

    spreadに正の値を指定すると影が要素の周囲に広がり、負の値で縮む。blurだけでは作れない形状のシャドウが、spreadを組み合わせることで実現できる。

  4. 色はrgba()を使う

    rgba(0, 0, 0, 0.15) のように透明度を指定するのが基本だ。不透明な黒や単色の影は浮いて見えることが多い。透明度を持たせることで影が背景に馴染む。

Point

offset-x と offset-y を両方 0 にすることで、全方向均等に広がる影(Ambient Shadow)が作れます。カードUIで最もよく使われるパターンで、box-shadow: 0 2px 8px rgba(0,0,0,0.12) のように書きます。

insetシャドウの使い方

insetキーワードを追加すると、影が要素の外側ではなく内側に付く。押し込まれたような表現や凹んだ溝のようなデザインに使う場面が多く、ネオモーフィズムの凹型ではほぼ必須のキーワードだ。

insetの基本

/* 通常(外側) */ box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15); /* inset(内側) */ box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.2); /* insetは先頭に書く */ box-shadow: inset 0 4px 8px -2px rgba(0, 0, 0, 0.3);

insetの主な用途

/* ボタンの押下状態でinsetを使う例 */ .button { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); transition: box-shadow 0.1s ease; } .button:active { box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.3); transform: translateY(1px); } /* テキスト入力フィールドの凹み表現 */ .input { box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.08), inset 0 0 0 1px rgba(0, 0, 0, 0.12); }

Point

insetシャドウは要素の overflow プロパティの影響を受ける。overflow: hidden が指定されていると inset shadow が見えなくなる——これは見落としやすいので頭に入れておきたい落とし穴だ。

複数シャドウの重ね方

box-shadowはカンマ区切りで複数の影を同時に指定できる。リストの先に書いた影が上(前面)に描画される。複数シャドウを重ねることで、現実の物体のようなリアルな影の表現が生まれる。

複数シャドウの基本構文

/* カンマで区切って複数指定 */ box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05), /* 近い影(強め) */ 0 8px 16px rgba(0, 0, 0, 0.08), /* 遠い影(ふんわり) */ 0 24px 48px rgba(0, 0, 0, 0.06); /* 最も広い環境光 */

2層シャドウで自然な浮き上がりを表現

現実世界の影は1種類ではない。光源に近い鮮明な影と、環境光による拡散した影が重なっている。CSSで2〜3層の影を重ねると、その物理的な現象を再現できる。

/* 自然な浮き上がり(2層) */ .card { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 4px 12px rgba(0, 0, 0, 0.08); } /* ホバー時により浮き上がる */ .card:hover { box-shadow: 0 4px 8px rgba(0, 0, 0, 0.12), 0 12px 32px rgba(0, 0, 0, 0.1); transform: translateY(-2px); transition: box-shadow 0.2s ease, transform 0.2s ease; }

外側と内側を組み合わせる

/* 外側シャドウ + insetを同時指定 */ .glass-card { box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), /* 外側の影 */ inset 0 1px 0 rgba(255, 255, 255, 0.5); /* 内側の光沢 */ }

Point

複数シャドウはインラインでも書けるが、各シャドウを改行してコメントを残す習慣をつけるといい。「近い影」「遠い影」と意図を記録しておけば、数週間後の自分もチームメンバーも即座に意図を読み取れる。

コピペで使えるbox-shadowパターン20選

構文を理解したら、実際のデザインパターンへの応用が本番だ。以下の20パターンは現場で広く使われているシャドウ表現を7カテゴリに分類し、コードをそのまま流用できるように用意した。各パターンの横にあるジェネレーターリンクで、値を自由に微調整できる。

ベーシック(ソフトシャドウ・ハードシャドウ・インセット)

1. ソフトシャドウ(定番)

あらゆるカードUIの基本形。blur を大きめにして自然な浮き上がりを表現する。迷ったらまずこれを使う。

box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);

2. ハードシャドウ(フラット)

blur を 0 にしたシャープな影。イラスト的でポップな印象を与え、LP やポートフォリオサイトに向いている。

box-shadow: 6px 6px 0px #1a1a2e;

3. インセットシャドウ(凹み)

入力フィールドやプログレスバーに奥行きを出す。insetキーワードで内側に影が付く。

box-shadow: inset 0 2px 6px rgba(0, 0, 0, 0.15);

マテリアルデザイン風(Elevation 1-5)

Google Material Design の elevation(浮き高さ)を CSS で再現するパターン。コンポーネントの階層関係を影だけで伝えられる。

4. Elevation 1(ほぼ地面)

box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24);

5. Elevation 2(カード)

box-shadow: 0 3px 6px rgba(0, 0, 0, 0.16), 0 3px 6px rgba(0, 0, 0, 0.23);

6. Elevation 3(ドロップダウン)

box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23);

7. Elevation 4(ダイアログ)

box-shadow: 0 14px 28px rgba(0, 0, 0, 0.25), 0 10px 10px rgba(0, 0, 0, 0.22);

8. Elevation 5(モーダル)

box-shadow: 0 19px 38px rgba(0, 0, 0, 0.3), 0 15px 12px rgba(0, 0, 0, 0.22);

Point

Elevation の数値が大きいほどコンポーネントは「画面から離れている」ことを意味する。モーダル > ドロップダウン > カード > ボタン の順でシャドウを強くするのが階層表現の基本だ。ジェネレーターでelevationを再現する

ニューモーフィズム(凸・凹・フラット)

背景色と近い色のシャドウを使い、要素が背景から浮き出ているように見せるスタイル。「光源は左上」が前提で、左上に明るい影・右下に暗い影を配置する。

9. ニューモーフィズム(凸型:浮き上がり)

/* 背景色: #e0e5ec に合わせた凸型 */ background: #e0e5ec; box-shadow: 8px 8px 16px #d1d1d1, -8px -8px 16px #ffffff;

10. ニューモーフィズム(凹型:押し込み)

background: #e0e5ec; box-shadow: inset 8px 8px 16px #d1d1d1, inset -8px -8px 16px #ffffff;

11. ニューモーフィズム(フラット型:ボタン押下)

background: #e0e5ec; box-shadow: inset 3px 3px 6px #d1d1d1, inset -3px -3px 6px #ffffff, 3px 3px 6px #d1d1d1, -3px -3px 6px #ffffff;

注意

ネオモーフィズムはコントラスト比が低くなりやすく、アクセシビリティ上の問題が指摘されている。WCAG 2.1 のコントラスト比基準(テキスト 4.5:1 以上)をコントラストチェッカーで必ず確認すること。

カード型UI(ホバーで浮き上がるシャドウ)

12. カード標準シャドウ

通常状態の控えめなシャドウ。背景との境界を柔らかく示す。

box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.06);

13. カードホバーシャドウ(浮き上がり)

ホバー時に影を広げて「カードが浮き上がった」演出をする。transform: translateY(-2px)と組み合わせると効果が倍増する。

/* 通常 */ .card { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.06); transition: box-shadow 0.2s ease, transform 0.2s ease; } /* ホバー */ .card:hover { box-shadow: 0 10px 30px rgba(0, 0, 0, 0.12), 0 4px 8px rgba(0, 0, 0, 0.06); transform: translateY(-2px); }

14. カードボーダー風シャドウ

spread だけを使ってborderのような線を描く。ボックスモデルに影響しないため、レイアウトがズレない。

box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08), 0 4px 12px rgba(0, 0, 0, 0.05);

多重シャドウ(レイヤード)

15. スムースシャドウ(段階的レイヤー)

4層のシャドウを段階的に広げることで、非常になめらかで自然な影を作る。高品質なデザインテンプレートでよく見かけるパターンだ。

box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12), 0 2px 2px rgba(0, 0, 0, 0.12), 0 4px 4px rgba(0, 0, 0, 0.12), 0 8px 8px rgba(0, 0, 0, 0.12);

16. ディープシャドウ(6層レイヤー)

6層を重ねた贅沢な影。スクリーンショットの掲載や製品画像の浮遊感に最適だ。

box-shadow: 0 1px 1px rgba(0, 0, 0, 0.08), 0 2px 2px rgba(0, 0, 0, 0.08), 0 4px 4px rgba(0, 0, 0, 0.08), 0 8px 8px rgba(0, 0, 0, 0.08), 0 16px 16px rgba(0, 0, 0, 0.08), 0 32px 32px rgba(0, 0, 0, 0.08);

カラーシャドウ(ブランドカラーを影に使用)

17. ブルーグロウ

CTAボタンやブランドカラーを強調したい要素に。暗い背景で特に効果が映える。

box-shadow: 0 10px 30px -5px rgba(59, 130, 246, 0.5);

18. マルチカラーグロウ

グラデーション的な輝きを複数のカラーシャドウで再現する。ゲームやエンタメ系のサイトに。

box-shadow: -5px -5px 20px rgba(139, 92, 246, 0.4), 5px 5px 20px rgba(236, 72, 153, 0.4);

19. サブトルカラーシャドウ

控えめな有彩色シャドウ。純粋な黒より洗練された印象になり、コーポレートサイトにも使いやすい。

box-shadow: 0 4px 14px 0 rgba(99, 102, 241, 0.2);

テキストシャドウ風の応用

20. 3Dボタン(立体感のある影)

大きな offset-y と色の濃い下面で、物理的なボタンのような立体感を出す。

/* 通常状態 */ .button-3d { background: #6366f1; color: #fff; box-shadow: 0 4px 0 #4338ca, 0 6px 12px rgba(99, 102, 241, 0.3); transition: box-shadow 0.1s ease, transform 0.1s ease; } /* 押下状態 */ .button-3d:active { box-shadow: 0 1px 0 #4338ca, 0 2px 4px rgba(99, 102, 241, 0.2); transform: translateY(3px); }

ツールで効率化

上記20パターンすべてをbox-shadowジェネレーターで値を微調整してカスタマイズできる。プリセットから選んでスライダーで数値を変えるだけで、プロジェクトに合ったシャドウが完成する。

パフォーマンスへの影響と最適化

box-shadowはブラウザのGPUでレンダリングされるが、使い方を誤るとアニメーション時のパフォーマンスが落ちる。デスクトップでは気にならなくても、モバイルで突然カクつくのはこの影響であることが多い。

パフォーマンスに影響する要因

最適化のアプローチ

  1. will-changeプロパティを使う

    アニメーション対象の要素に will-change: box-shadow を指定すると、ブラウザが事前にGPUレイヤーを用意する。ただし全要素に指定するとメモリを食いつぶすため、実際にアニメーションする要素だけに限定すること。

  2. box-shadowの代わりにfilter: drop-shadowを使う

    filter: drop-shadow() はGPU処理されやすく、SVGや透明PNGの輪郭に沿った影を付けられる。ただし spread-radius の指定ができないなど機能が限られるため、形状コントロールが必要な場面では box-shadow が適している。

  3. アニメーションはopacityで代替する

    ホバー時に box-shadow の値を変えるより、::after 疑似要素に大きなシャドウを仕込んでおき、ホバー時に opacity でフェードインさせる方法が軽い。opacity は GPU 合成のみで処理されるため、毎フレームのリペイントを避けられる。

/* パフォーマンスに優しいホバーシャドウ(opacityで切り替え) */ .card { position: relative; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } .card::after { content: ''; position: absolute; inset: 0; border-radius: inherit; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); opacity: 0; transition: opacity 0.3s ease; } .card:hover::after { opacity: 1; }

will-change: transform との組み合わせ

ホバー時に transform: translateY(-2px)box-shadow の両方をアニメーションさせるケースは非常に多い。この場合、will-change: transform, box-shadow を指定することでブラウザに最適化のヒントを与えられる。ただし、will-change は「アニメーションが発生する直前」に付与し、アニメーション完了後に解除するのが理想的だ。常時指定はメモリの無駄遣いになる。

/* will-changeの適切な使い方 */ .card { box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); transition: box-shadow 0.3s ease, transform 0.3s ease; } /* ホバー時のみwill-changeを有効にする */ .card:hover { will-change: transform, box-shadow; box-shadow: 0 12px 32px rgba(0, 0, 0, 0.15); transform: translateY(-4px); }

CSSのアニメーション効果と組み合わせると、より動きのあるデザインに。CSSアニメーション入門ガイドも参考にしてください。

filter: drop-shadow() との違いと使い分け

特徴 box-shadow filter: drop-shadow()
影の形状 要素のボックスモデル(矩形)に沿う 要素の実際の形状(透明部分含む)に沿う
spread-radius 指定可能 指定不可
inset 指定可能 指定不可
複数シャドウ カンマ区切りで複数指定可能 filter関数を連結して指定(非推奨)
パフォーマンス リペイント発生 GPU処理されやすい
最適な用途 UIカード、ボタン、モーダル SVGアイコン、透過PNG、複雑な形状

Point

Chrome DevTools の Performance パネルで box-shadow 起因のリペイントを確認できる。「Paint flashing」を有効にすると影響を受けている要素が緑でフラッシュするので、スクロールしながら見ると一目瞭然だ。

レスポンシブ対応のシャドウ

モバイルとデスクトップでは画面サイズも要素サイズも大きく異なる。デスクトップで美しいシャドウがモバイルでは大きすぎてボケて見える——そんな問題を防ぐために、レスポンシブなシャドウ設計を押さえておきたい。

clamp() を使ったレスポンシブシャドウ

CSS の clamp() 関数を使うと、ビューポート幅に応じてシャドウのサイズを流動的に変えられる。メディアクエリを書かなくても、モバイルでは控えめ・デスクトップでは大きめのシャドウが実現する。

/* clamp()を使ったレスポンシブシャドウ */ .card { box-shadow: 0 clamp(2px, 0.5vw, 4px) clamp(8px, 2vw, 16px) rgba(0, 0, 0, 0.1), 0 clamp(4px, 1vw, 12px) clamp(16px, 4vw, 48px) rgba(0, 0, 0, 0.06); }

メディアクエリでの切り替え

clamp() よりも制御しやすいのがメディアクエリによる切り替えだ。ブレイクポイントごとにシャドウの値を明示的に変えられるため、デザイナーとのコミュニケーションもスムーズになる。

/* メディアクエリでシャドウを段階的に変更 */ .card { /* モバイル: 控えめなシャドウ */ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } @media (min-width: 768px) { .card { /* タブレット: 中程度 */ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1), 0 4px 16px rgba(0, 0, 0, 0.06); } } @media (min-width: 1024px) { .card { /* デスクトップ: リッチなシャドウ */ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1), 0 12px 40px rgba(0, 0, 0, 0.08); } }

CSS変数でシャドウを一元管理する

プロジェクト全体でシャドウの一貫性を保つには、CSS変数でシャドウトークンを定義するのが実務的なベストプラクティスだ。デザインシステムを運用しているプロジェクトでは必須の手法になっている。

/* シャドウトークンの定義 */ :root { --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.05); --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.1), 0 1px 2px rgba(0, 0, 0, 0.06); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 8px 10px -6px rgba(0, 0, 0, 0.1); } /* 使用例 */ .card { box-shadow: var(--shadow-sm); } .card:hover { box-shadow: var(--shadow-lg); } .modal { box-shadow: var(--shadow-xl); }

活用シーン

CSS変数でシャドウを管理すると、ダークモード切り替え時にも :root の値を上書きするだけで全コンポーネントのシャドウが一括で変わる。メディアクエリとの組み合わせでレスポンシブ対応も1箇所で完結する。

ダークモードでのシャドウ設計

ダークモードで box-shadow を使うとき、黒い背景に黒い影は当然見えない。ここが見落とされやすいポイントで、ライトモードで完璧に仕上げたシャドウがダークモードで消える——という失敗は珍しくない。設計段階で以下の3つのアプローチを知っておくと対処できる。

アプローチ 方法 向いているケース
影を使わずelevationをborderで表現 透明度の高いborderで要素の輪郭を示す シンプルなダークUI
影の色を明るくする 黒ではなく半透明の白や明るいグレーを使う グラデーションが複雑な背景
グロウシャドウに切り替え 有彩色のグロウでelevationを表現する ブランドカラーが強いデザイン
/* CSS変数でライト/ダークを切り替える例 */ :root { --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.12); --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.1); --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12); --card-border: transparent; } @media (prefers-color-scheme: dark) { :root { /* ダークモードでは影の代わりに微細なborderを使う */ --shadow-sm: 0 0 0 1px rgba(255, 255, 255, 0.08); --shadow-md: 0 0 0 1px rgba(255, 255, 255, 0.1); --shadow-lg: 0 0 0 1px rgba(255, 255, 255, 0.12); --card-border: rgba(255, 255, 255, 0.06); } } /* カードコンポーネントでの使用 */ .card { box-shadow: var(--shadow-md); border: 1px solid var(--card-border); } /* 有彩色グロウをダークモードで使う例 */ @media (prefers-color-scheme: dark) { .card-accent { box-shadow: 0 0 0 1px rgba(99, 102, 241, 0.3), 0 4px 16px rgba(99, 102, 241, 0.15); } }

Material Design 3 のアプローチ

Google Material Design 3では、ダークモードで影の代わりに「Surface tint」(背景をブランドカラーで微妙に染める)でelevationを表現している。シャドウを完全に排除してコントラスト問題を回避するアプローチで、自前のデザインシステム設計にも参考になる。

box-shadowジェネレーターの使い方

box-shadow の値は、数値を細かく調整しながら目視で確認する作業の連続だ。コードを書いてはリロードして確認して——を繰り返すのは時間の無駄。当サイトのbox-shadowジェネレーターなら、スライダーで値をリアルタイムに動かしながらプレビューできる。

ジェネレーターの使い方(5ステップ)

  1. プレビュー要素の設定

    背景色や要素のサイズを設定する。実際のデザインに近い色で確認することで、同じシャドウでも背景色によって印象がまったく変わるのを実感できる。

  2. offset・blur・spreadをスライダーで調整

    各パラメータのスライダーを動かすとリアルタイムでプレビューに反映される。X/Yのオフセット、blur、spreadを順番に調整しながら、各パラメータの効果を確認できる。

  3. 影の色と透明度を選択

    カラーピッカーで影の色を選び、不透明度スライダーで透明度を調整する。rgba()の値がリアルタイムで更新されるので、数値とビジュアルの対応関係を掴みやすい。

  4. insetの切り替えと複数シャドウの追加

    「内側シャドウ」トグルでinsetの有無を切り替えられる。「シャドウを追加」ボタンで複数のシャドウを重ねれば、多層シャドウも視覚的に確認しながら作れる。

  5. CSSコードをコピー

    完成したシャドウのCSSコードを「コピー」ボタンでクリップボードに取得し、プロジェクトにそのまま貼り付けるだけ。

ツールで効率化

登録不要・完全無料。ネオモーフィズム・グロウ・フラットシャドウのプリセットから微調整するだけで、この記事で紹介したデザインパターンを即座に再現できる。

その他の活用場面

box-shadowはUIコンポーネントだけに留まらない。知っておくと地味に役立つ使い方を4つ挙げておく。

box-shadowジェネレーターで今すぐ試す

この記事で解説したbox-shadowのパターン20選を、スライダーを動かしながらリアルタイムでプレビューできる。ネオモーフィズム・グロウ・フラットシャドウのプリセット収録。登録不要・完全無料。

よくある質問

box-shadowの構文は?
box-shadow: offset-x offset-y blur-radius spread-radius color inset; の順で指定する。最低限 offset-x と offset-y の2値が必須で、blur、spread、color、inset は任意だ。例: box-shadow: 4px 8px 16px 0 rgba(0, 0, 0, 0.15);
insetとは?
insetは影を要素の外側ではなく内側に付けるキーワードだ。構文の先頭に inset と書くだけで、押し込まれたような凹み表現ができる。フォームの入力フィールドやネオモーフィズムの凹型で頻繁に使われる。
複数のbox-shadowを重ねるには?
カンマ区切りで複数の影を指定する。box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 4px 12px rgba(0,0,0,0.08); のように書く。先に書いた影が上(前面)に描画される。外側シャドウと inset シャドウを混在させることも可能だ。
text-shadowとbox-shadowの違いは?
text-shadowはテキストの文字自体に影を付けるプロパティで、box-shadowは要素のボックス(矩形の外枠)に影を付けるプロパティだ。text-shadow には spread-radius と inset の指定がなく、構文は text-shadow: offset-x offset-y blur color; とシンプル。用途が明確に異なるため、混同しないよう注意したい。
box-shadowとfilter: drop-shadowの違いは?
box-shadow はボックスモデル(要素の矩形)に基づいて影を付けるが、filter: drop-shadow は要素の実際の形状(透明部分を含む)に沿って影を付ける。SVGアイコンや透過PNGには輪郭通りの影が付くため drop-shadow が向いている。パフォーマンス面では drop-shadow の方が GPU 処理されやすいが、spread-radius の指定ができないなど機能が限られる。用途で使い分けること。
box-shadowはborder-radiusと一緒に使えますか?
使える。border-radius を指定した要素に box-shadow を付けると、影の形も border-radius に沿う。完全に丸い要素(border-radius: 50%)に box-shadow を付けると丸い影になる。ネオモーフィズムのデザインではこの組み合わせが特に重要だ。
box-shadowはCSSトランジションでアニメーションできますか?
できる。transition: box-shadow 0.3s ease のように指定すると box-shadow の変化をアニメーションできる。ただし box-shadow のアニメーションはリペイントを引き起こすため、モバイルでカクつく可能性がある。複雑なアニメーションには ::after 疑似要素に shadow を用意して opacity でフェードさせる方法の方が軽量だ。
ネオモーフィズムをアクセシビリティに配慮して使うには?
ネオモーフィズムはコントラスト比が低くなりやすく、低視力のユーザーには見づらい場合があります。対策として、(1)テキストには十分なコントラスト比(4.5:1以上)を確保する、(2)ボタン等のインタラクティブ要素にはフォーカスリングを必ず表示する、(3)装飾的な使い方に留めてコアなUIコンポーネントへの使用は慎重にする、の3点が基本になる。
box-shadowをborderの代わりに使うメリットは?
box-shadow: 0 0 0 2px #6366f1 のように offset と blur を 0 にして spread だけ指定すると、border と同じ見た目になる。ボックスモデルに影響しないため(要素のサイズが変わらない)、ホバー時に border を追加・除去してもレイアウトがずれない。ボタンのフォーカスリングやホバーハイライトで使うと、ガタツキのないなめらかな UI が作れる。
影の色に黒以外を使うメリットは?
純粋な黒(rgba(0,0,0,x))より、要素の色に合わせた有彩色の影の方が自然でおしゃれに見える。青いボタンには rgba(99, 102, 241, 0.4) のような青みがかった影を使うとグロウ感が出る。背景色に近い色の影を使うと要素がなじんで見えるのがネオモーフィズムの原理だ。「黒い影は安っぽい」はCSSデザイナーの間では定説になっている。