pipipipi.net

pipipipi.net

約7分で読めます

CSSのbox-shadowを徹底解説!デザイン実例とジェネレーターの使い方

CSSのbox-shadowを徹底解説!デザイン実例とジェネレーターの使い方

CSSでカードコンポーネントに立体感を出したい、ボタンにホバー時のシャドウエフェクトを付けたい、という場面は多いはずです。“box-shadow” はそのすべてを1プロパティで解決できます。

ところが「値が4つも5つもある」「insetって何だ」「複数シャドウの順番が分からない」という疑問を持つ方も少なくありません。この記事では MDN Web Docs の仕様をベースに、各値の意味と実践的なデザイン実例をコードとともに解説します。

コードを書かずに視覚的に試したい場合は、ボックスシャドウ ジェネレーターを使うと、スライダー操作でリアルタイムにプレビューしながら CSS コードを生成できます。アカウント不要・無料で利用できます。

目次

box-shadowの基本構文

box-shadow: offset-x offset-y blur-radius spread-radius color;

MDN Web Docs(box-shadow - CSS: カスケーディングスタイルシート | MDN)によると、構文上で必須なのは “offset-x” と “offset-y” の2値のみです。残りは省略可能です。

/* 最小構成:右10px・下5px */
.card {
  box-shadow: 10px 5px;
}

/* 全値指定 */
.card {
  box-shadow: 10px 5px 15px 2px rgba(0, 0, 0, 0.2);
}

各値の役割

offset-x / offset-y(必須)

影の水平・垂直方向のずれを指定します。

方向
”offset-x” 正
”offset-x” 負
”offset-y” 正
”offset-y” 負
/* 右下に影 */
.shadow-right-bottom {
  box-shadow: 8px 8px 0 rgba(0, 0, 0, 0.15);
}

/* 左上に影(光源が右下にある表現) */
.shadow-left-top {
  box-shadow: -8px -8px 0 rgba(0, 0, 0, 0.15);
}

blur-radius(ぼかし半径)

3番目の値で、影のぼかし具合を制御します。負の値は指定できません。“0” を指定するとくっきりとした影になります。

/* くっきりした影 */
.sharp {
  box-shadow: 4px 4px 0 rgba(0, 0, 0, 0.3);
}

/* 柔らかいぼかし */
.soft {
  box-shadow: 4px 4px 20px rgba(0, 0, 0, 0.2);
}

spread-radius(拡散半径)

4番目の値で、影のサイズを基準の要素から拡大・縮小します。

  • 正の値:影が要素より大きくなる
  • 負の値:影が要素より小さくなる
/* 全方向に均等な影(spread活用) */
.glow {
  box-shadow: 0 0 0 8px rgba(100, 100, 255, 0.3);
}

“offset” をゼロにして “spread-radius” だけ大きくすると、全方向に均等な「光彩効果」を作れます。

color(色)

位置は前後どちらでも指定できます。省略すると親要素の “color” プロパティの値を引き継ぎます。“rgba()”・“hsl()“・CSS変数など現代的な色指定はすべて使えます。

/* ブランドカラーでグロー */
.brand-glow {
  box-shadow: 0 0 20px 4px rgba(99, 102, 241, 0.5);
}

inset:内側の影

“inset” キーワードを先頭に付けると、影が要素の外側ではなく内側に描画されます。押し込まれたような立体感、テクスチャ、内側の縁取りに使えます。

/* 内側の影で凹み表現 */
.inset-box {
  box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.2);
}

/* フォームフィールドのフォーカスリング内側 */
input:focus {
  box-shadow: inset 0 0 0 2px #6366f1;
  outline: none;
}

複数シャドウの重ねがけ

カンマ区切りで複数の影を同時に指定できます。リストの先頭の影が最前面に表示されます。外側・内側の影を組み合わせることで、リッチな立体表現が可能です。

/* カードのリアルな影:近距離の濃い影 + 遠距離の広い影 */
.card-realistic {
  box-shadow:
    0 1px 3px rgba(0, 0, 0, 0.12),
    0 4px 12px rgba(0, 0, 0, 0.08),
    0 16px 40px rgba(0, 0, 0, 0.05);
}

デザイナーの間では「近い距離の濃い影」と「遠い距離の薄い影」を重ねるのが、リアルな影表現の定石です。

実践デザインパターン

パターン1:カードのリフト(ホバーアニメーション)

.card {
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  transition: box-shadow 0.25s ease, transform 0.25s ease;
}

.card:hover {
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
  transform: translateY(-2px);
}

“box-shadow” は CSS トランジションの補間対象なので、“transition” と組み合わせると滑らかなリフトアニメーションになります。

パターン2:ボタンのプレス感

.button {
  box-shadow:
    0 4px 0 rgba(0, 0, 0, 0.3),
    0 6px 12px rgba(0, 0, 0, 0.15);
  transform: translateY(0);
  transition: all 0.1s ease;
}

.button:active {
  box-shadow: 0 1px 0 rgba(0, 0, 0, 0.3);
  transform: translateY(3px);
}

外側の影と “transform: translateY” を組み合わせると「実際に押し込まれる」ボタン表現になります。

パターン3:集中線・グロー効果

.glow-card {
  box-shadow:
    0 0 0 1px rgba(99, 102, 241, 0.3),
    0 0 20px rgba(99, 102, 241, 0.2),
    0 0 60px rgba(99, 102, 241, 0.1);
}

“offset” ゼロ・“blur-radius” を大きくとると、光を放つような「グロー」表現になります。

パターン4:テキスト入力フォーカスリング

.input {
  border: 1px solid #e2e8f0;
  box-shadow: none;
  transition: box-shadow 0.15s ease;
}

.input:focus {
  outline: none;
  border-color: #6366f1;
  box-shadow:
    0 0 0 3px rgba(99, 102, 241, 0.2),
    inset 0 1px 2px rgba(0, 0, 0, 0.05);
}

外側のフォーカスリング(“spread-radius” 活用)と内側の微細な影を組み合わせると、洗練されたフォーカス状態になります。

ジェネレーターで視覚的に試す

上記の値を手で調整するのは試行錯誤が必要です。ボックスシャドウ ジェネレーターでは:

  • offset-x / offset-y / blur-radius / spread-radius をスライダーで直感的に操作
  • inset のオン/オフをトグルで切り替え
  • 影の色と透明度をカラーピッカーで指定
  • 複数シャドウの追加・削除
  • 生成された CSS コードをワンクリックでコピー

パラメータを変えながらプレビューを確認し、気に入ったコードをコピーして使えます。

まとめ

役割省略時
”offset-x”水平オフセット(必須)
“offset-y”垂直オフセット(必須)
“blur-radius”ぼかし半径(負の値不可)“0"
"spread-radius”影の拡大縮小”0"
"color”影の色親の “color"
"inset”内側の影に切り替え外側

“box-shadow” はシンプルな構文ながら、値の組み合わせ次第で多彩な表現が可能です。複数シャドウの重ねがけとトランジションを組み合わせると、コード数行でプロフェッショナルなUIアニメーションが実現できます。

値の調整は ボックスシャドウ ジェネレーター で視覚的に試してみてください。


参考文献

関連記事