CSSボックスシャドウジェネレーター

次へ

box-shadow のルールを 1 つずつ作成します。水平・垂直オフセット、ぼかし、広がり、色、任意の inset を設定して、結果をコピーしてください。本物のシャドウは通常 2〜3 層必要なので、各レイヤーを個別に生成し、ルールをカンマでつなぎます。

ボックスシャドウのデザイン方法

  1. 1

    シャドウの値を設定する

    水平オフセット、垂直オフセット、ぼかし半径、広がり、そして不透明度を含む色を指定します。

  2. 2

    inset を切り替える

    シャドウを inset に切り替えると内側のシャドウになります。押し込まれたボタンやくぼみの効果に便利です。

  3. 3

    色を選ぶ

    不透明度の低い黒が定番です。要素の色合いに合わせた、やや暗めの色付きシャドウのほうが自然に見えます。

  4. 4

    CSS をコピーする

    1 つのシャドウルールをコピーしてスタイルシートに貼り付けます。複数レイヤーのシャドウを作るには、各レイヤーを個別に生成し、ルールをカンマで結合します。

box-shadowの構文

box-shadow: <x-offset> <y-offset> <blur> <spread> <colour> [inset];
  • x-offset: 正の値は右、負の値は左を表します。
  • y-offset: 正の値は下、負の値は上を表します。
  • blur: 0ならくっきりとした輪郭、値が大きいほどやわらかくなります。見た目のサイズは、要素の外側にぼかし値の約1.5倍ほど広がります。
  • spread: 要素の外側に加わる追加のサイズです。正の値ではシャドウが大きくなり、負の値では小さくなります(控えめなハローに便利です)。
  • colour: あらゆるCSSの色に対応します。rgba(0, 0, 0, 0.15) が定番中の定番です。
  • inset: 要素の内側にシャドウを反転させるキーワードです。

多層シャドウはリアルに見える

このジェネレーターは一度に 1 つのシャドウルールしか出力しません。複数レイヤーのシャドウを作るには、各レイヤーを個別に生成し、ルールをカンマで結合してください。

0 0 40px のシャドウを1つだけ使うと、ぼんやりとした印象になります。要素の近くに置く小さく鋭いシャドウと、外側に置く大きくやわらかいシャドウの2層を重ねると、実際の光が散乱する様子を再現できます。

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

1行目は密着した接地シャドウを、2行目はよりやわらかい環境シャドウを表します。このひとつのパターンだけで、カード型UIの80%をカバーできます。

エレベーションシステム

マテリアルデザインでは6段階のエレベーション(高度)を使い、それぞれ異なるシャドウの組み合わせを割り当てています。簡略化すると次のとおりです。

エレベーション シャドウ
1(静止状態) 0 1px 3px rgba(0,0,0,.12), 0 1px 2px rgba(0,0,0,.24)
2 0 3px 6px rgba(0,0,0,.16), 0 3px 6px rgba(0,0,0,.23)
3 0 10px 20px rgba(0,0,0,.19), 0 6px 6px rgba(0,0,0,.23)
4(浮き上がり) 0 14px 28px rgba(0,0,0,.25), 0 10px 10px rgba(0,0,0,.22)
5(浮遊) 0 19px 38px rgba(0,0,0,.30), 0 15px 12px rgba(0,0,0,.22)

エレベーションの役割ごとに1つを選び、一貫して使いましょう。

色付きシャドウのほうが自然に見える

純粋な黒のシャドウは人工的に見えます。実際のシャドウは、その下にある表面の色を帯びるからです。次のように試してみてください。

box-shadow: 0 12px 24px rgba(40, 80, 120, 0.18);

純黒ではなく、クールな青みがかったグレーを使っています。暖色系の背景では、より暖かみのある色合いを選びましょう。

パフォーマンス

ボックスシャドウは再描画のたびに描かれます。多くの要素に大きく重いシャドウを設定すると、スクロールが遅くなることがあります。対策は次のとおりです。

  • 要素に transform: translateZ(0) を指定し、合成レイヤーを強制的に生成します。
  • シャドウをclip-pathに沿わせる必要がある場合にかぎり、複雑なシャドウを filter: drop-shadow() に置き換えます(一般的には処理が遅くなります)。
  • 頻繁に再描画される要素では、シャドウを控えめにします。

押し込み状態のためのinset

.button:active {
  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.12);
}

insetシャドウはくぼんだ見た目を演出し、ボタンが表面に押し込まれたように見せます。下方向への小さな transform: translateY(1px) と組み合わせると、触感のあるクリック感が得られます。

よくある質問

たいていは、ぼかしが弱すぎるか、広がり(spread)が大きすぎるためです。ぼかしのない輪郭の硬いシャドウは、要素が二重になっているように見えます。ぼかしを大きくし(20〜30pxが一般的な出発点です)、広がりは0か、ごく小さな負の値に保ってください。

box-shadowはborder-radiusを含む要素のボーダーボックスに追従するため、角丸のカードには自動的にきれいに丸まったシャドウが付きます。clip-pathで作った形状の場合、box-shadowはクリップには追従しないので、代わりに filter: drop-shadow() を使ってください。

選んだ方向に大きくオフセットし、負の広がりで反対側を隠します。あるいは2つのシャドウを使い、1つを対象の側に表示させ、もう1つを負の広がりにして、はみ出した不要な部分を「打ち消す」方法もあります。

厳密な上限はありませんが、シャドウが1つ増えるごとに描画処理も1つ増えます。実用的な上限は3〜4層で、それ以上必要な場合は背景画像やSVGの使用を検討すべきです。

関連ツール