SVGの属性について理解する

# はじめに
ロゴやアイコン、テキストなど昨今のWeb制作では当たり前に使われているSVGですが、その属性については意外と把握できていない部分が多いのではないでしょうか。（自分もその1人）
また、SVGをデザインツールから書き出した場合、しばしば必要のない属性が付与されます。不要な属性なら僅かながらも軽量化にもつながるので削除しておきたいですよね。
ということで、SVGにおいて必要・不要な属性を概要とともにまとめたいと思います。


# 必須属性
SVGに最低限必要な属性は以下の2つです。
属性の詳細については**よく使われる属性**として後述します。
1. `xmlns`
2. `viewBox`




# よく使われる属性


## xmlns
- 外部ファイルとして使用する場合には必須
- インラインで使用する場合は省略可能
- `xmlns="http://www.w3.org/2000/svg"`

名前空間を宣言するための属性で、HTMLとSVGにある同名の要素を区別するために必要な属性です。
例えば、SVGには独自にリンクを指定するためのa要素があります。HTMLのa要素と同じ名前ですが別の要素で、意味合いの異なるこれらを区別するために`xmlns`という仕組みが存在しています。
URLの参照先に意味はありませんが、全世界で一意であることを保証するために慣例としてURL風の文字列（`http://www.w3.org/2000/svg`）を設定します。

```
<svg xmlns="http://www.w3.org/2000/svg">...</svg>
```




## viewBox
- 必須
- `viewBox="X座標の最小値 Y座標の最小値 X軸の幅 Y軸の高さ"`

SVGにはビューポート（表示エリア）とビューボックス（描画エリア）という概念があり。
ビューポートは`width`属性と`height`属性で、ビューボックスは`viewBox`属性で指定します。
`viewBox`属性を指定すると、描画エリアのグラフィックが表示エリアにぴったり収まるよう拡縮されます。
省略すると表示崩れの原因となるため必ず記述しなければなりません。

```
<svg viewBox="0, 0, 600, 400">...</svg>
```




## width・height
- 省略可能
- `width="横幅"`・`height="縦幅"`

SVGのビューポートサイズを指定します。
単位を省略した場合`px`が適用されます。

```
<svg width="400" height="200">...</svg>
```




## version
- 省略可能
- SVG2以降は非推奨
- `version="SVGのバージョン"`

SVGドキュメントが準拠するバージョンを指定します。
有効な選択肢は`1.0`もしくは`1.1`のいずれかで、省略した場合は`1.0`として認識されます。

```
<svg version="1.1">...</svg>
```




## xmlns:xlink
- SVG要素内でハイパーリンクを使用する場合は必須
- ハイパーリンクを使用しない、もしくはインラインで使用する場合は省略可能
- SVG2以降は非推奨
- `xmlns:xlink="http://www.w3.org/1999/xlink"`

xmlnsとは別の名前空間宣言で、SVG内の要素にハイパーリンクを使用する際に必要な属性です。
`xlink`は「名前空間接頭辞」と呼ばれ、`xlink:href`のような形で属性名の前に接頭辞をつける必要があります。
`<use>`タグと組み合わせることで、一度定義したグラフィックを再利用する（使い回す）こともできます。

```
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <a xlink:href="http://example.com">
    <circle cx="100" cy="100" r="50"></circle>
  </a>
</svg>
```

```
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <def>
    <circle cx="50" cy="50" r="50" id="foo"></circle>
  </def>
  <use xlink:href="#foo" />
  <use x="120" y="80" xlink:href="#foo" />
</svg>
```




## xml:space
- 省略可能
- SVG2以降は非推奨
- `xml:space="default"`・`xml:space="preserve"`

SVG内の空白を保持するかどうかを指定する属性で、`default`および`preserve`のみが値として指定できます。
`preserve`を指定すると、すべての改行とタブ文字がスペース文字に置き換えられ、スペース文字は先頭・末尾および連続したものも残さず描画されます。HTMLの`<pre>`タグに似た挙動となります。

```
<svg xml:space="preserve">...</svg>
```




## preserveAspectRatio
- 省略可能
- `preserveAspectRatio="none"`

SVGグラフィックのアスペクト比の取り扱いを指定できます。
通常`viewBox`の値によってSVGのアスペクト比が定義されますが、こちらの属性に`none`を指定することでアスペクト比を非固定にできます。

```
<svg preserveAspectRatio="none">...</svg>
```




## fill
- 省略可能
- `fill="Hexカラーコード"`

SVGグラフィックの塗り色をHex値で指定します。
省略した場合`#000`が適用されます。

```
<svg fill="##f00">...</svg>
```

```
<svg>
  <circle cx="100" cy="100" r="50" fill="##f00"></circle>
</svg>
```




## stroke
- 省略可能
- `stroke="Hexカラーコード"`

SVGのアウトラインの色をHex値で指定します。

```
<svg stroke="#0f0">...</svg>
```

```
<svg fill="#f00" stroke="#0f0">
  <circle cx="100" cy="100" r="50"></circle>
</svg>
```




## stroke-width
- 省略可能
- `stroke-width="数値"`

SVGのアウトラインの線幅を指定します。
単位を省略した場合`px`が適用されます。
前述の`stroke`を省略した場合、アウトラインの色は`#000`が適用されます。

```
<svg stroke-width="3" fill="#f00" stroke="#0f0">
  <circle cx="100" cy="100" r="50"></circle>
</svg>
```




# SVG標準の歴史
2020年11月現在のSVGバージョン最新版は`SVG 1.1`で、`SVG 2`が勧告候補になっています。

### 沿革
2001年9月4日   : SVG 1.0がW3C勧告
2003年1月14日  : SVG 1.1と、SVG Tiny・SVG Basic（モバイルSVGプロファイル）がW3C勧告
2008年12月22日 : SVG Tiny 1.2がW3C勧告
2011年8月16日  : 誤記を修正したSVG 1.1 (Second Edition)がW3C勧告
2018年10月4日  : SVG 2がW3C勧告候補




# 参考URL

- MDN SVG 属性リファレンス
  https://developer.mozilla.org/ja/docs/Web/SVG/Attribute

- サンプルコードで学ぶ SVGの読み方、書き方
  https://ascii.jp/elem/000/001/014/1014703/

- Scalable Vector Graphics（Wikipedia）
  https://ja.wikipedia.org/wiki/Scalable_Vector_Graphics