← Back to Blog

SVGとCSSの連携ガイド:スタイリング手法と実践サンプルで学ぶ

SVGとCSSの連携方法を基礎から解説。インラインSVGと外部SVGのスタイリング、アニメーション実装、レスポンシブ対応まで、実際のコードサンプルでわかりやすく紹介します。

2 min read

SVG(Scalable Vector Graphics)とCSSを組み合わせることで、高品質でスケーラブルなベクターグラフィックスを柔軟にスタイリングできます。本記事では、SVGとCSSの連携方法を基礎から実践まで詳しく解説します。

SVGとCSSの基礎概念

SVGはXMLベースのベクター画像形式であり、CSSを使用してスタイリングすることが可能です。SVG要素はHTML要素と同様にCSSで装飾できるため、色の変更やアニメーションの追加など、多彩な表現が実現できます。

SVGの構造理解

SVGファイルはXML形式で記述され、図形要素(path, circle, rectなど)とスタイル属性で構成されています。CSSを適用する前に、SVGの基本構造を理解することが重要です。

SVGとCSSの連携手法

インラインSVGのスタイリング

HTMLファイル内に直接SVGコードを記述し、CSSでスタイリングする方法です。

<!DOCTYPE html> <html> <head> <style> .svg-container { width: 300px; height: 200px; } .icon-circle { fill: #3498db; stroke: #2980b9; stroke-width: 3; transition: fill 0.3s ease; } .icon-circle:hover { fill: #e74c3c; } </style> </head> <body> <svg class="svg-container" viewBox="0 0 100 100"> <circle class="icon-circle" cx="50" cy="50" r="40"/> </svg> </body> </html>

外部SVGファイルのスタイリング

外部SVGファイルを<img>タグやbackground-imageで読み込み、CSSで制御する方法です。

/* 背景画像としてSVGを使用 */ .svg-background { background-image: url('icon.svg'); background-size: contain; background-repeat: no-repeat; width: 100px; height: 100px; } /* フィルター効果の適用 */ .svg-filter { filter: drop-shadow(2px 2px 4px rgba(0,0,0,0.3)); }

実践的なSVG CSSスタイリング

複数要素のスタイリング

<svg viewBox="0 0 200 100" class="multi-element-svg"> <rect class="background-rect" x="10" y="10" width="180" height="80"/> <circle class="primary-circle" cx="60" cy="50" r="20"/> <circle class="secondary-circle" cx="140" cy="50" r="20"/> <text class="svg-text" x="100" y="90" text-anchor="middle">SVG CSS Example</text> </svg>
.multi-element-svg { width: 100%; max-width: 600px; } .background-rect { fill: #f8f9fa; stroke: #dee2e6; stroke-width: 2; rx: 10; /* 角丸 */ } .primary-circle { fill: #007bff; stroke: #0056b3; stroke-width: 2; } .secondary-circle { fill: #28a745; stroke: #1e7e34; stroke-width: 2; opacity: 0.8; } .svg-text { fill: #343a40; font-family: 'Arial', sans-serif; font-size: 14px; font-weight: bold; }

SVGアニメーションとCSS

CSSを使用したSVGアニメーションの実装例です。

@keyframes pulse { 0% { transform: scale(1); } 50% { transform: scale(1.1); } 100% { transform: scale(1); } } @keyframes draw { to { stroke-dashoffset: 0; } } .animated-path { stroke-dasharray: 1000; stroke-dashoffset: 1000; animation: draw 2s ease-in-out forwards; } .pulsing-circle { animation: pulse 2s infinite; transform-origin: center; } .hover-rotate { transition: transform 0.5s ease; } .hover-rotate:hover { transform: rotate(180deg); }

レスポンシブなSVG CSS実装

モバイルファーストの観点から、レスポンシブなSVG実装方法を紹介します。

.responsive-svg-container { width: 100%; height: auto; max-width: 800px; margin: 0 auto; } /* モバイル向けスタイル */ @media (max-width: 768px) { .svg-element { stroke-width: 2; } .svg-text { font-size: 12px; } } /* タブレット向けスタイル */ @media (min-width: 769px) and (max-width: 1024px) { .svg-element { stroke-width: 1.5; } } /* デスクトップ向けスタイル */ @media (min-width: 1025px) { .svg-element { stroke-width: 1; } }

よくある問題と解決策

スタイルが適用されない場合の対処法

  1. CSSの詳細度の問題: SVG要素に対してより詳細なセレクターを使用
  2. インラインスタイルの上書き: !importantの使用(最終手段)
  3. 外部SVGの制限: インラインSVGへの切り替えを検討
/* 詳細度を高めたセレクター */ svg .specific-path { fill: #ff0000 !important; /* 最終手段 */ }

ブラウザ互換性の問題

最新のブラウザでは良好なサポートがありますが、レガシーブラウザ対応が必要な場合はCan I useで確認することをお勧めします。

パフォーマンス最適化のヒント

  • SVGスプライトの使用
  • 不要なメタデータの削除
  • CSSアニメーションのハードウェアアクセラレーション活用
  • SVGOを使用した最適化

よくある質問(FAQ)

Q: SVGにCSSのbox-shadowは使えますか? A: 直接は使用できませんが、filter: drop-shadow()で同様の効果を実現できます。

Q: 外部SVGファイルの要素にCSSを適用するには? A: 外部SVGファイルの要素に直接CSSを適用するには、SVGファイル内にスタイルを記述するか、インラインSVGとして読み込む必要があります。

Q: SVGのアニメーションでCSSとSMILどちらを使うべき? A: 現在ではCSSアニメーションが推奨されます。SMILは非推奨の方向にあるため、CSSまたはJavaScriptでの実装をお勧めします。

まとめ

SVGとCSSの連携は、モダンなWebデザインにおいて不可欠なスキルです。インラインSVGのスタイリングから複雑なアニメーションまで、適切な手法を選択することで、高品質でパフォーマンスの良いビジュアルを実現できます。実際のプロジェクトでは、ブラウザ互換性やパフォーマンスを考慮した実装を心がけましょう。