WebアプリのためのSVGアイコン作成ガイド:設計から本番まで
モダンWebアプリケーション向けのスケーラブルなSVGアイコンシステムの完全ガイド。設計・最適化からReact、Vue、本番環境への実装まで解説します。
Founder of VectoSolve
Self-taught developer, founder and sole developer of VectoSolve since 2024. He builds the conversion engine and the cutting, embroidery and 3D printing exports.
How this article was made: drafted with AI assistance, then edited and fact-checked before publication. About the author
Key Takeaways
- SVGアイコンは解像度に依存しないため、1x/2x/3xのラスター画像が不要
-
SVGで
currentColorを使えば、CSSのcolorプロパティでアイコンの色を制御可能 — 1ファイルで無限の色に対応 - インラインSVGは最大の制御性、SVGスプライトは大規模アイコンセットのキャッシュに最適
-
デコレーティブアイコンには
aria-hidden="true"、意味のあるアイコンにはrole="img"と<title>を追加 - Heroicons、Lucide、Tabler Iconsなど、数千のプロダクション対応SVGアイコンが利用可能
なぜWebアプリにSVGアイコンなのか?
モダンWebアプリケーションに必要なアイコンの条件:
- スケーラブル:あらゆるデバイス・画面密度で完璧に表示
- 高パフォーマンス:高速読み込み、最小限の帯域幅
- 柔軟:スタイリングやアニメーションが容易
- アクセシブル:スクリーンリーダーに対応
SVGアイコンはこれらすべてを満たします。
アイコンフォントとラスター画像の問題点
アイコンフォントの問題
- 読み込み遅延(FOIT — テキストが見えなくなる現象)
- アンチエイリアシングの問題
- マルチカラー対応の制限
- アクセシビリティの課題
- HTTPリクエストのオーバーヘッド
- CSS依存
ラスター画像(PNG)の問題
- 異なる密度用に複数バージョン(1x, 2x, 3x)
- ファイルサイズが大きい
- スタイルカスタマイズ不可
- 色の固定
- 複数のHTTPリクエスト
SVGアイコンの利点
- 全サイズに1ファイル
- HTMLにインライン(HTTPリクエストなし)
- CSSスタイリング
- JavaScriptアニメーション
- あらゆる画面で完璧
- 極小ファイルサイズ
- マルチカラー対応
- 完全なアクセシビリティ
Pro Tip: Font Awesomeなどのアイコンフォントから移行する場合、一度に全部変換しないでください。まずファーストビューのアイコンをインラインSVGに置き換えましょう — LCPの即座の改善とFOITの解消を実感できます。
プロジェクトでのSVGアイコン設定
方法1:インラインSVG(推奨)
メリット:完全な制御、HTTPリクエストなし、スタイル・アニメーション可能
<svg class="icon icon-check" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M20 6L9 17L4 12" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
.icon {
width: 24px;
height: 24px;
color: #1cb721;
}
方法2:SVGスプライト
メリット:再利用可能、キャッシュ可能、整理しやすい
sprite.svgを作成:
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="icon-check" viewBox="0 0 24 24">
<path d="M20 6L9 17L4 12" stroke="currentColor" stroke-width="2"/>
</symbol>
<symbol id="icon-close" viewBox="0 0 24 24">
<path d="M18 6L6 18M6 6l12 12" stroke="currentColor" stroke-width="2"/>
</symbol>
</svg>
HTMLで使用:
<svg class="icon">
<use href="/sprite.svg#icon-check"/>
</svg>
方法3:IMGタグ
メリット:シンプル、キャッシュ可能
デメリット:スタイリング不可、色の変更不可
<img src="/icons/check.svg" alt="チェックアイコン" width="24" height="24">
方法4:CSS背景
メリット:HTMLがすっきり、キャッシュ可能
デメリット:柔軟性に制限
.icon-check {
width: 24px;
height: 24px;
background: url('/icons/check.svg') no-repeat center;
background-size: contain;
}
A Full Year of Conversions for $49
Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime
Get the Annual DealSVGアイコンをゼロから作成
デザイン原則
1. ピクセルグリッドへの整列
- 24x24グリッドで設計(最も一般的)
- 整数ピクセルに整列
- サブピクセルポジションを避ける
2. 統一されたスタイル
- 均一なストローク幅(通常2px)
- 統一された角丸半径
- 同じ視覚的ウェイト
3. Viewbox規則
- 標準:
viewBox="0 0 24 24"
デザインツール
無料:Figma(ブラウザベース)、Inkscape(デスクトップ)、SVG Edit(ブラウザ)
有料:Adobe Illustrator($20.99/月)、Sketch($99/年)、Affinity Designer(2025年9月から無料、以前は$69.99の買い切り)
既存アイコンのSVG変換
PNG/JPEGから
VectoSolveで高品質な変換:
const icons = ['check', 'close', 'menu', 'search'];
async function convertIcons() {
for (const icon of icons) {
const pngPath = `./icons/png/${icon}.png`;
const svgPath = `./icons/svg/${icon}.svg`;
// VectoSolve APIにアップロード
// 最適化されたSVGをダウンロード
}
}
SVGアイコンの最適化
1. 不要なコードの削除
SVGOで自動最適化:
npm install -g svgo
svgo input.svg -o output.svg
2. currentColorの使用
CSSで制御可能に:
.icon {
color: #1cb721;
}
Free SVG Tools for Crafters
Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG
Check Your SVG FreeCSSでSVGアイコンをスタイリング
.icon {
width: 24px;
height: 24px;
stroke: currentColor;
fill: none;
stroke-width: 2;
stroke-linecap: round;
stroke-linejoin: round;
}
/* サイズバリエーション */
.icon-sm { width: 16px; height: 16px; }
.icon-md { width: 24px; height: 24px; }
.icon-lg { width: 32px; height: 32px; }
/* カラーバリエーション */
.icon-primary { color: #1cb721; }
.icon-danger { color: #dc3545; }
.icon-warning { color: #ffc107; }
ホバーエフェクト
.icon-button {
color: #666;
transition: color 0.2s, transform 0.2s;
}
.icon-button:hover {
color: #1cb721;
transform: scale(1.1);
}
Reactコンポーネントパターン
interface IconProps {
name: string;
size?: number;
className?: string;
color?: string;
}
export function Icon({ name, size = 24, className, color }: IconProps) {
return (
<svg
className={`icon icon-${name} ${className || ''}`}
width={size}
height={size}
viewBox="0 0 24 24"
fill="none"
style={{ color }}
>
<use href={`/sprite.svg#icon-${name}`} />
</svg>
);
}
Vueコンポーネントパターン
<template>
<svg :class="['icon', `icon-${name}`]" :width="size" :height="size" viewBox="0 0 24 24" fill="none">
<use :href="`/sprite.svg#icon-${name}`" />
</svg>
</template>
コンポーネントライブラリを構築する際は、スプライトアプローチと併せてツリーシェイキング可能な個別アイコンインポートもエクスポートしましょう。
A Full Year of Conversions for $49
Starter Annual: 25 conversions every month, $49 for the whole year. That is about $4.08 a month · Cancel anytime
Get the Annual Dealパフォーマンス最適化
1. クリティカルなアイコンをインライン化
ファーストビューのSVGスプライトをHTMLに直接インライン化。
2. 非クリティカルなアイコンを遅延読み込み
async function loadIconSprite() {
const response = await fetch('/sprite.svg');
const svg = await response.text();
document.body.insertAdjacentHTML('afterbegin', svg);
}
3. バンドルサイズ最適化
@svgr/webpackやvite-plugin-svgrでSVGをコンポーネントとして自動インポート。
4. 圧縮
サーバーでimage/svg+xmlに対してGzip/Brotliを有効化。
アクセシビリティ
<!-- デコレーティブアイコン -->
<svg aria-hidden="true" focusable="false">
<use href="#icon-check"/>
</svg>
<!-- インタラクティブアイコン -->
<button>
<svg role="img" aria-labelledby="check-title">
<title id="check-title">完了にする</title>
<use href="#icon-check"/>
</svg>
</button>
アイコンライブラリ
オープンソース
- Heroicons (heroicons.com) — Tailwind CSS公式アイコン、2スタイル、MIT
- Lucide (lucide.dev) — Feather Iconsのフォーク、24x24グリッド、MIT
- Tabler Icons (tabler-icons.io) — 4,000以上、カスタマイズ可能、MIT
- Bootstrap Icons (icons.getbootstrap.com) — 1,800以上、MIT
VectoSolveでの変換
カスタムアイコンやブランド固有デザインに:
- 高解像度PNGで作成
- VectoSolveにアップロード
- SVGに変換
- SVGOで最適化
- プロジェクトに統合
Free SVG Tools for Crafters
Design Checker · Color Separator · Mat Preview · Offset Generator · Text to SVG
Check Your SVG Free本番チェックリスト
- 全アイコンをSVGOで最適化
- ViewBoxを統一
- 動的スタイリングにcurrentColorを使用
- インタラクティブアイコンに適切なARIAラベル
- デコレーティブアイコンにaria-hidden="true"
- キーボードナビゲーション用フォーカスインジケーター
- 異なる画面サイズでテスト済み
- ライト/ダークモードでテスト済み
- ファイルサイズ最小化済み
- 共通アイコン用スプライト作成済み
まとめ
SVGアイコンは、比類のない柔軟性、パフォーマンス、スケーラビリティを提供するWebアプリケーションのモダンスタンダードです。このガイドに従って、プロフェッショナルなアイコンシステムを構築しましょう。
VectoSolveで既存アイコンをSVGに変換して、真のベクターグラフィックスの違いを体感してください。
| SVGアイコン方式 | HTTPリクエスト | CSSスタイリング | キャッシュ | 最適な用途 |
|---|---|---|---|---|
| インラインSVG | 0 | 完全(fill, stroke, アニメーション) | なし(HTML内) | インタラクティブ、アニメーション |
| SVGスプライト(<use>) | 1(スプライトファイル) | 制限あり(currentColor) | あり(外部ファイル) | 大規模セット、静的サイト |
| React SVGコンポーネント | 0(バンドル内) | 完全(props + CSS) | バンドルキャッシュ | React/Next.jsアプリ |
| アイコンフォント(レガシー) | 1(フォントファイル) | 色のみ | あり | レガシープロジェクトのみ |
| 外部<img> SVG | アイコンごとに1 | なし | あり | シンプルな静的表示 |
参考資料
- MDN Web Docs — SVG — SVG要素と属性の完全リファレンス
- CSS-Tricks — Practical SVG Guide — SVGスプライトとインラインSVGの実践チュートリアル
- web.dev Performance — SVG最適化に関するGoogleのガイダンス
- Can I Use — SVG機能のブラウザ対応状況