SVG

SVG (Scalable Vector Graphics) is an XML-based vector image format that can be embedded inline in HTML. Inline SVG is especially useful for UI icons because you can style it with CSS, control colors with currentColor, and manage accessibility with ARIA.

SVG(Scalable Vector Graphics)

SVG は、図形(線・円・多角形など)を「数学的な情報」として持つ ベクター画像の仕組みです。写真のような「点の集まり(ピクセル)」ではないので、拡大してもギザギザしにくく、アイコンやロゴの表示に向いています。

このページでは インラインSVG(HTMLの中に <svg> を直接書く形)を基本形として扱います。理由はシンプルで、制作会社の現場で UIアイコン用途が最も多く、CSSで制御しやすく、初学者が「なぜ動かないか」をHTML/CSSの延長で理解しやすいからです。

このページでできるようになること

まずは直感:SVG って何?

「拡大してもキレイ」な画像
SVGはベクター形式です。画面の大きさが変わっても、アイコンやロゴがシャープに見えやすいです。
HTMLの中にも書ける(インラインSVG)
<svg> をHTMLに直接書くと、SVGはDOM(要素のツリー)として扱えます。だからCSSやJavaScriptで操作しやすいです。
実務の主役は「アイコン」
ボタンやナビゲーションのアイコンを、CSSで色・サイズを統一して扱えるのが強みです(単色アイコンが特に得意)。
でも「万能」ではない
写真や超リアルなイラストは、SVGよりもビットマップ(JPEG/PNG/WebP)の方が向きます。適材適所です。

直感の覚え方:SVGは「図形でできた画像」。アイコンと相性が良く、インラインならCSSで扱いやすい、でOKです。

正確な定義(仕様に沿った説明)

何のために存在するか

SVG は、2Dの図形やテキストを、解像度に依存しない形(ベクター)で表現するための仕様です。ブラウザがSVGを解釈して描画するため、同じデータでも表示サイズに合わせて滑らかにレンダリングできます。

XMLベース(ただしHTMLの中では“HTMLとして”書ける)

SVGはXMLとして定義されていますが、HTML文書の中にインラインで書く場合、ブラウザはHTML構文としても扱います。実務では「XMLの厳密さで詰まる」より、まずは HTMLの中で <svg> を書ける ことを軸に理解すると進めやすいです。

できること/できないこと(制約)

できること:図形・線・塗り・文字・簡単なフィルター
アイコンや図、ロゴの表現に向きます。単色アイコンは特に扱いやすいです。
できること:CSS・JSで制御(インラインSVG)
インラインSVGはDOM要素です。だから fillstroke をCSSで変えたり、イベントを付けたりできます。
できないこと:写真のような“高密度”表現が得意ではない
写真はピクセルの集合で表す方が自然です。SVGで写真のような表現をするとデータが巨大になりやすく、制作・運用の負担が増えます。
注意:外部SVGの参照は、インラインほど自由に操作できない
<img> でSVGを読み込む方法は壊れにくい一方、内部の図形へCSSを当てる、といった操作は基本的にできません(別物として扱われます)。

基本の書き方(最短の型)

まずは「コピペで動く」最短の型を作ります。ここでは インラインSVG + 単色アイコン + CSSで色を制御 を基本形として覚えます。

最短の型(インラインSVG)

ポイントは次の3つです。

HTML

<button type="button" class="btnIcon">
    <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
        <path fill="currentColor" d="M12 2a10 10 0 1 0 0 20a10 10 0 0 0 0-20zm1 5v4h4v2h-6V7h2z"></path>
    </svg>
    <span>履歴</span>
</button>

CSS

.btnIcon {
    display: inline-flex;
    align-items: center;
    gap: 0.5em;
}

.icon {
    width: 1.25em;
    height: 1.25em;
    vertical-align: middle;
}

.btnIcon {
    color: #0188ff;
}

コピペで動く最小デモ(このページ内で表示)

表示デモ(currentColor で色が連動する)

デモ:ボタン内のアイコン(インラインSVG)

下の2つは同じSVGです。親の文字色を変えるだけで、アイコンの色も変わります。

見どころ:SVG側の fillcurrentColor なので、CSSの color がそのまま塗り色になります。

HTML

<button type="button" class="btnIcon">
    <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
        <path fill="currentColor" d="..."></path>
    </svg>
    <span>履歴</span>
</button>

実務メモ:widthheight はSVGに直接書くより、まずはCSSで管理すると運用が安定します(ボタン、ナビ、カードなど、置き場所が変わっても統一しやすい)。

コンテンツモデル/入れ子のルール

インラインSVGを基本にすると、HTMLの理解がそのまま効きます。ただし、SVG特有の「詰まりどころ」もあります。

<svg> を置ける場所
  • 基本は フローコンテンツ として、本文・ボタン・リンクなどに置けます
  • ただし要素によっては入れ子制限があります(例:<button> の中に入れられない要素がある、など)。まずは「インラインSVGはボタンに置ける」と覚えればOKです
<svg> の中に入れるもの
  • 図形要素:<path> / <circle> / <rect> / <line> など
  • 補助要素:<title> / <desc>(情報目的のSVGで役立つ)
  • 定義:<defs>(再利用・グラデーションなどで使うが、初学者は深追いしない)
初心者が止まりがち:viewBox がない
  • viewBox がないと、拡大縮小の基準が決まりません
  • 結果として「CSSでサイズを変えたら崩れる」「切れる」「中央に来ない」などが起きやすいです
  • まずは アイコンなら viewBox="0 0 24 24" を付ける で進めるのが安全です
初心者が止まりがち:属性の書き方の差
  • SVGには stroke-width のようなハイフン区切り属性が多いです
  • CSSは stroke-width のままでOKですが、JavaScriptで操作するときはプロパティ名が変わる場合があります(このページでは深入りしません)

よくある勘違い・混同

SVGは「画像ファイル」だからCSSで中身をいじれると思ってしまう
インラインSVGならいじれますが、<img src="icon.svg"> のように外部読み込みすると、中身の <path> にはCSSを当てられません(別の文書として扱われます)。
fillstroke の違いがあいまい
fill は「塗り」、stroke は「線」です。単色アイコンでも、線で描くタイプは strokecurrentColor にする必要があります。
width / height をSVGに直書きすればOKだと思ってしまう
直書きでも動きますが、実務ではコンポーネント単位でサイズを統一したいので、CSSで制御する方が扱いやすいです。
全部のSVGに <title> が必要だと思ってしまう
装飾SVG(アイコンなど)を支援技術に読ませないなら、aria-hidden="true" で隠す判断が基本です。意味があるSVG(図・ロゴなど)は補足として扱います。

実務での使用例(アイコン用途を主軸)

制作会社の実務で最も多いのは、UIアイコンとしてのSVGです。理由は「軽い」「拡大してもキレイ」「CSSで色が統一できる」からです。

ナビゲーション・ボタン・メニューアイコン
  • 基本はインラインSVG
  • fill / strokecurrentColor にして、親の color と連動させる
  • アイコンは装飾なら aria-hidden="true"、ボタンの意味はテキストや aria-label で持たせる
ロゴ
サイズや解像度の違いに強いので便利です。ただし多色ロゴは currentColor 前提の制御には向きません(色を変えない前提で置く、が基本です)。
図(グラフ・説明図)
情報量が増えると設計が難しくなるので、まずは「装飾SVGを扱える体力」を作ってからが安全です。図はアクセシビリティ要件も強くなりがちです(補足扱い)。
(補助)<img> によるSVG参照
「差し替えが簡単」「HTMLが汚れにくい」「壊れにくい」ため、納品・運用で使われます。ただし、アイコンの色をCSSで統一するような要件には向きません。
(概要だけ)<use> による参照
同じアイコンを何度も使う場合に有効ですが、<defs> / <symbol> / 参照関係 / 同一生成元 / CSP など、初学者が詰まりやすい要素が多いです。このページでは「なぜ使われるか」「なぜ難しいか」の紹介に留めます。

実務で起きがちな事故と回避策

事故:CSSで色を変えたいのに変わらない
原因:SVG内の fill が固定色(例:#000)になっている。
対策:単色アイコンは fill="currentColor"(線なら stroke="currentColor")にする。デザインツール書き出しSVGは固定色が多いので、まずそこを確認する。
事故:アイコンが見切れる/位置がずれる
原因:viewBox がない、または図形の座標が viewBox からはみ出している。
対策:アイコンは基本的に viewBox を持つデータを使う。違和感がある場合は「座標の範囲(viewBox)」と「実際の図形(path)」のズレを疑う。
事故:クリックできるはずなのに、SVGの上だけ反応が変
原因:図形がイベントを拾ってしまい、意図した要素(ボタンやリンク)に届いていない。
対策:アイコンが装飾なら、SVGに pointer-events="none" を付けることを検討する(ただし用途次第)。
事故:装飾アイコンが読み上げで邪魔になる
原因:装飾目的なのに支援技術に拾われている。
対策:装飾SVGは aria-hidden="true"。意味を伝えるのはテキスト(または適切なARIA)に寄せる。
事故:外部SVGを読み込んだら、想定外に表示されない
原因:参照方法やCSP、同一生成元、パスの誤りなど複合要因があり得る。
対策:まずはインラインSVGで最小再現し、そこから参照方法へ広げる。現場でも「まずインラインで動かす」は強い切り分けになります。

落とし穴:「表示される」だけで安心しないでください。SVGは viewBox・色(fill/stroke)・アクセシビリティ判断の3点が揃って初めて “実務で扱いやすいデータ” になります。

アクセシビリティ/UX観点での注意

このサイトでは 装飾目的のSVG(UIアイコン) を主軸に扱います。初学者はまず「読ませない判断」を身につけた方が混乱しにくいからです。

装飾目的のSVG(主役)

基本:aria-hidden="true"
見た目の飾りなら、支援技術に読ませない方が分かりやすいです。ボタンやリンクの意味は、テキスト(可視)または aria-label(不可視)に持たせます。
テキストがないボタンの場合
  • 見た目がアイコンだけなら、<button aria-label="検索">...</button> のように名前を与えます
  • 「読ませる対象」は <button> で、SVG自体は隠す、が基本です
フォーカス・押しやすさ(UX)
アイコンは小さくしがちですが、タップしやすい領域(ボタンの余白)を確保する方が事故が減ります。見た目だけSVGで縮めない、が安全です。

情報目的のSVG(補足)

図・意味を持つロゴなど、SVG自体に情報がある場合は「読ませる」設計になります。最小の考え方だけ押さえます。

<title> / <desc>
SVGの中に <title><desc> を置くと、意味の説明を付けられます。情報目的のSVGでは候補になります。
aria-label / aria-labelledby
SVG(またはその親)に名前を与える方法です。実務では「何を読ませるか」を決めて、テキストの出どころを統一するのが大事です。

ここで止まりがち:titlearia-label を両方つけて二重に読まれる、などが起きます。まずは「装飾は隠す」「情報は名前を付ける」の2択に分けて考えると整理できます。

関連要素・属性との相互作用

viewBoxwidth / height
  • viewBox は “中の座標系” を決めます
  • width / height(またはCSSのサイズ)は “外の表示サイズ” を決めます
  • アイコン運用では「viewBox で座標を固定し、サイズはCSSで統一」が扱いやすいです
fill / strokecurrentColor
  • 単色の塗りアイコン:fill="currentColor"
  • 線で描くアイコン:stroke="currentColor"fill="none"
  • currentColor はCSSの color を参照します(親でまとめて管理しやすい)
<img> での参照とCSS
<img> は “画像としてのSVG” なので、中の図形をCSSでいじる用途には向きません。差し替えや納品で「壊れにくさ」を優先する場合に使います。
<use> と参照関係(概要)
同じSVGを再利用できるのが強みですが、参照先が見つからない・同一生成元・CSPでブロックなどの要因で詰まりがちです。初学者はまずインラインSVGで基礎体力を作ってからが安全です。
バリデーション(概念)
HTMLの中にインラインSVGを書いたときに、文法や属性のミスがあると描画が崩れます。実務では「まずHTMLとしてのミス(タグ閉じ忘れなど)を疑う」→「次にSVGの属性(viewBox・fill/stroke)を見る」の順が切り分けしやすいです。

Webデザイン技能検定で得点できる整理

この章は「試験で迷いがちな判断」を、短く言い切って整理します(学科・実技どちらにも効く形)。

用語

SVG
ベクター画像の仕様。図形の情報をもとに描画され、拡大縮小に強い。
ベクター(vector)
点や線、曲線などの“形”を数値で持つ表現。拡大しても形が崩れにくい。
ビットマップ(bitmap)
ピクセルの集まりで表現する画像(例:JPEG/PNG/WebP)。写真に強い。
viewBox
SVG内部の座標系(どの範囲を描画するか)を決める属性。サイズ調整の基準になる。
currentColor
CSSの color を参照する値。単色アイコンの fill / stroke と相性が良い。
aria-hidden
支援技術に“読ませない”ためのARIA属性。装飾SVGで重要。

ひっかけポイント

ミニ確認問題(解説付き)

Q1. ヘッダーの「検索」ボタンに虫眼鏡アイコンを置きたい。最優先の実装は?
A. インラインSVGが基本です。理由:CSSで色・サイズを統一しやすく、アクセシビリティ判断(装飾なら aria-hidden)も設計しやすいからです。
Q2. CSSの color を変えてもアイコンの色が変わらない。まず疑うべき所は?
A. SVG内の fill / stroke が固定色になっていないかです。単色アイコンなら currentColor を使います。
Q3. アイコンだけのボタンを作った。読み上げで意味が伝わるようにするには?
A. ボタン(親)に aria-label などで名前を付け、SVG自体は aria-hidden="true" にします。装飾は隠し、操作の意味は親に持たせるのが基本です。
Q4. ロゴをSVGで配置する。currentColor で色を変えるべき?
A. ケース次第です。単色アイコンなら必須級ですが、ロゴはブランドカラーが固定のことが多く、無理に色を変えるとブランドガイドラインに反することがあります。実務では「変える必要があるか」を先に確認します。

よくある質問(FAQ)

SVGはどんな場面で一番よく使われますか?
制作の現場ではUIアイコン用途が最優先です。単色アイコンなら currentColor で統一しやすく、サイズも柔軟です。
SVGを <img> で読み込むのはダメですか?
ダメではありません。壊れにくく差し替えもしやすいので実務で使われます。ただしアイコンの色をCSSで統一したい、といった用途には向きません。
viewBox は必須ですか?
アイコン運用では “必須級” と考えると安全です。viewBox がないとサイズ変更で崩れやすく、切り分けも難しくなります。
fillstroke はどう使い分けますか?
fill は塗り、stroke は線です。線アイコンは stroke="currentColor" + fill="none" が基本形です。
SVGに <title> を入れるとアクセシブルになりますか?
意味を持つSVGでは候補になりますが、装飾SVGなら隠す判断が基本です。何を読ませるかを決めないと、二重読み上げなどが起きます。

よくあるエラー早見表

CSSで色を変えたいのに変わらない
原因:SVG内の fill / stroke が固定色。
対処:単色アイコンは currentColor を使う(塗りは fill、線は stroke)。
アイコンが見切れる/位置がズレる
原因:viewBox 不備、または座標範囲のズレ。
対処:viewBox を確認し、必要ならSVGデータを見直す。
ボタン内のSVGだけクリック反応が不安定
原因:図形がイベントを拾っている。
対処:装飾ならSVGに pointer-events="none" を検討。
外部SVG(<img>)の中身をCSSで変えようとして動かない
原因:<img> は画像として扱うため。
対処:中身をCSSで制御したいならインラインSVGを使う。
<use> が参照先を見つけられず表示されない
原因:参照関係(ID/パス)、同一生成元、CSPなど複合要因。
対処:まずインラインSVGで表示を再現し、参照方式へ段階的に移す。

まとめ:迷ったときの判断軸

最後に、迷ったときに戻ってくるチェックリストです(実務でも試験でも、ここに戻って判断できます)。