初心者向けチュートリアル:CSS3でSVGにドロップシャドウを追加する方法

2024-04-02

SVGドロップシャドウ:CSS3による表現方法と実践ガイド

SVGは、Web上でベクター画像を扱うための標準フォーマットです。軽量で拡大縮小しても劣化しない特性から、アイコンやロゴ、イラストなど幅広い用途で活用されています。

本記事では、CSS3を用いてSVGにドロップシャドウを適用する方法について、初心者にも分かりやすく解説します。具体的なコード例や図を用いて、実践的なスキルを習得できるようサポートします。

目次

  1. ドロップシャドウとは?
  2. SVGにおけるドロップシャドウの重要性
  3. CSS3によるドロップシャドウの実装方法 3.1. filterプロパティ 3.2. box-shadowプロパティ
  4. 実践例:ボタンにドロップシャドウを適用する
  5. 高度な表現:複数のドロップシャドウを組み合わせる
  6. ブラウザ互換性と注意点

ドロップシャドウは、影を表現することで、オブジェクトに奥行きや立体感を与える視覚効果です。Webデザインにおいては、要素の境界線を強調したり、視覚的な階層を表現したりする効果的な手法として活用されています。

SVGはベクター画像のため、ドロップシャドウを画像自体に直接適用することはできません。しかし、CSS3を用いることで、SVG要素にリアルなドロップシャドウを簡単に追加することができます。

CSS3によるドロップシャドウの実装方法

CSS3では、主に2つのプロパティを用いてSVGにドロップシャドウを適用できます。

filterプロパティは、SVG要素にさまざまな視覚効果を適用するために使用されます。ドロップシャドウを表現するには、feDropShadowフィルタを使用します。

.svg-element {
  filter: drop-shadow(
    <オフセットx> <オフセットy> <ぼかし> <色>
  );
}

各プロパティの詳細

  • <オフセットx>: 影の水平方向オフセット
  • <ぼかし>: 影のぼかし量
  • <色>: 影の色

.svg-element {
  filter: drop-shadow(5px 5px 5px rgba(0, 0, 0, 0.5));
}

このコードは、SVG要素に右下方向に5pxオフセットされた、ぼかし量5px、半透明度50%の黒い影を適用します。

box-shadowプロパティは、ボックス要素に影を適用するために使用されます。SVG要素もボックス要素として扱えるため、box-shadowプロパティを用いてドロップシャドウを表現できます。

.svg-element {
  box-shadow: <オフセットx> <オフセットy> <ぼかし> <拡散> <色>;
}
  • <拡散>: 影の拡散量
.svg-element {
  box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.5);
}

このコードは、filterプロパティの例と同様の影を適用します。

以下のコードは、CSS3を用いてSVGボタンにドロップシャドウを適用する例です。

<button class="button">
  <svg viewBox="0 0 100 100">
    <rect x="10" y="10" width="80" height="40" rx="5" />
  </svg>
</button>
.button {
  width: 100px;
  height: 50px;
  border: none;
  background-color: #fff;
  cursor: pointer;

  svg {
    width: 100%;
    height: 100%;
  }

  



サンプルコード:SVGボタンにドロップシャドウを適用

HTMLコード

<button class="button">
  <svg viewBox="0 0 100 100">
    <rect x="10" y="10" width="80" height="40" rx="5" />
  </svg>
  ボタンテキスト
</button>

CSSコード

.button {
  width: 100px;
  height: 50px;
  border: none;
  background-color: #fff;
  cursor: pointer;

  svg {
    width: 100%;
    height: 100%;
  }

  /* ドロップシャドウ */
  box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);

  /* ボタンのスタイル */
  border-radius: 5px;
  color: #333;
  font-size: 16px;
  font-weight: bold;

  /* ホバー時のスタイル */
  &:hover {
    background-color: #ddd;
  }
}

コード解説

  • HTMLコード: ボタン要素内にSVG要素を配置し、ボタンテキストを表示します。
  • CSSコード:
    • .buttonセレクタ: ボタンのスタイルを定義します。
    • svgセレクタ: ボタン内のSVG要素のスタイルを定義します。
    • box-shadowプロパティ: ボタンにドロップシャドウを適用します。
    • その他のスタイル: ボタンの背景色、テキストの色、フォントサイズなどを設定します。

実行結果

上記のコードを実行すると、以下のようなドロップシャドウ付きのボタンが表示されます。

box-shadowプロパティは複数回指定することで、複数のドロップシャドウを重ねることができます。

.button {
  box-shadow:
    0 5px 10px rgba(0, 0, 0, 0.2),
    0 0 5px rgba(0, 0, 0, 0.1);
}

このコードは、2つの異なる影を重ねることで、より複雑なドロップシャドウを表現しています。

  • filterプロパティは古いブラウザでは対応していない場合があります。
  • box-shadowプロパティは、一部のブラウザでぼかしや拡散の表現に違いが生じる場合があります。
  • ドロップシャドウの色やぼかし量などは、デザインに合わせて調整してください。

まとめ

CSS3を用いることで、SVG要素に簡単にドロップシャドウを適用できます。filterプロパティとbox-shadowプロパティを使いこなすことで、さまざまな表現が可能になります。

本記事を参考に、ぜひ実践的なデザインにドロップシャドウを取り入れてみてください。




SVGドロップシャドウ:その他の方法

feGaussianBlur フィルタはぼかし効果、feOffset フィルタはオフセット効果をそれぞれ表現できます。これらのフィルタを組み合わせることで、ドロップシャドウを表現できます。

<svg viewBox="0 0 100 100">
  <rect x="10" y="10" width="80" height="40" rx="5" />
  <filter id="drop-shadow">
    <feGaussianBlur in="SourceGraphic" stdDeviation="5" />
    <feOffset dx="5" dy="5" />
    <feComponentTransfer>
      <feFuncA type="linear" slope="0.5" />
    </feComponentTransfer>
  </filter>
</svg>
rect {
  filter: url(#drop-shadow);
}

clip-path とグラデーションの組み合わせ

clip-path を使って影の形を定義し、グラデーションを使って影の色を表現できます。

<svg viewBox="0 0 100 100">
  <rect x="10" y="10" width="80" height="40" rx="5" />
  <defs>
    <clipPath id="drop-shadow">
      <rect x="5" y="5" width="90" height="45" />
    </clipPath>
  </defs>
</svg>
rect {
  clip-path: url(#drop-shadow);
}

#drop-shadow {
  fill: url(#shadow-gradient);
}

#shadow-gradient {
  xlink:href="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSI+PGxpbmVhdyB4MT0iMCUiIHkxPSIwJSIgeDI

html css svg


flexbox vs position vs margin: 徹底比較で最適な方法を見つける

position: absoluteを使うこの方法は、divを絶対位置に配置する方法です。親要素に対してdivの位置を指定できます。HTMLCSSこのコードでは、position: relative を使って親要素 . container を相対位置に設定しています。そして、position: absolute を使って子要素...


【CSSチュートリアル】font-synthesisでフォントのウェイトを合成する方法

初心者でもYouTubeで成功するためには、いくつかの重要なポイントがあります。自分のニッチを見つけるまず、自分が何について話したいのか、どんな動画を作りたいのかを明確にすることが重要です。世の中にはたくさんの動画があるので、埋もれないためには自分のニッチを見つけることが重要です。自分の興味や得意分野を活かせるテーマを選びましょう。...


CSS '>' セレクタ vs. 子孫セレクタ:違いを理解して使い分けよう

例:この例では、.container 要素の直下にある p 要素のみが赤色になります。<h1> 要素は影響を受けません。ポイント:> は 直近の子要素のみを選択複数の階層を指定したい場合は、> を繋げて記述他のセレクタと組み合わせて、より精度の高い選択が可能...


初心者でも安心! DOM 操作の基本: 特定要素からの HTML、CSS、JavaScript コードの抽出

このガイドでは、HTML、CSS、および JavaScript コードを DOM の特定要素から選択的にコピーするためのツールと方法について説明します。この方法は、Internet Explorer を使用して行うことができます。ツールこのタスクを実行するために、以下のツールを使用します。...


ドラッグでゴーストが出ないのはなぜ?CSSとJavaScriptでドラッグゴースト画像を非表示にする仕組み

ここでは、CSSとJavaScriptを使用して、ドラッグゴースト画像を非表示にする方法を解説します。方法 1: CSS のみを使用するCSSのみでドラッグゴースト画像を非表示にするには、以下のプロパティを要素に設定します。上記のコードは、主要なブラウザでドラッグゴースト画像を非表示にします。...