アイコンフォントをサイトごとに作成し、デザイン、コーディングをスムーズにする

Adobe XD ってインストールしていないフォントは表示されませんよね…
Photoshop はテキストを編集しなければ表示されたのに…

Adobe XD のデータをもらって、いざコーディングをしようとするも…
「あ！アイコンフォントが見えない！」なんてことが…

というわけで、アイコンフォントをサイトごとに作成し、デザイン、コーディングをスムーズにしたいと思います！

## アイコンフォントを作成する

アイコンフォントを作成するには、神サイト Fontello を利用します。

https://fontello.com/

### 1. アイコンを選択する

ずらっと並んだアイコンの中から利用したいアイコンをクリックして選択します。

:::note info
矢印のような上下左右のパターンがあるアイコンは、利用しない場合でも上下左右を選択しておくことをオススメします。
後でアイコンを追加すると、アイコンの順番がめちゃめちゃになり、管理しづらくなります。
:::

![fontello_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/d8d4b40b-b9b1-e623-eb41-d727b9649809.png)

自分で作ったアイコンを利用したい場合は、SVGファイルとして作成しておきます。
一番上の `Drag custom SVG icons or SVG font here.` と書いてあるグレーの部分にSVGファイルをドラッグします。

![fontello_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/32c8e773-6e38-6ab3-7eaa-7eaaae67e15d.png)

### 2. アイコンの名前を設定する

利用したいアイコンを選択すると上部のタブ `Customize Names` が選択できるようになります。
クリックすると、アイコンと名前の一覧画面が表示されます。

デフォルトで名前は設定されていますが、変更したい場合はクリックすると接頭辞の `icon-` 以降が編集できます。

![fontello_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/0795bc54-a679-bdfa-2468-81c2e28f465f.png)


### 3. アイコンの unicode を設定する

利用したいアイコンを選択すると上部のタブ `Customize Codes` が選択できるようになります。
クリックすると、アイコンと unicode の一覧画面が表示されます。

デフォルトで unicode は設定されていますが、変更したい場合はクリックすると接頭辞の `U+` 以降が編集できます。

![fontello_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/b43456e5-5e64-f808-7824-a670e4d968bb.png)

:::note info
ここで設定した unicode は CSS で利用するため、E000、E001、E002…のように連番にしておくと管理が楽になります。
E000～F8FFは私用領域となり、文字は割り当てられていません。
そのため、アイコンフォントに割り当てることが可能となります。
[Unicode一覧 E000-EFFF - Wikipedia](https://ja.wikipedia.org/wiki/Unicode%E4%B8%80%E8%A6%A7_E000-EFFF)
:::

### 4. アイコンフォントの名前を変更する

サイトごとにアイコンフォントを管理するため、作成するフォント名を変更します。
`ico-+サイト名` のように変更することをオススメします。

![fontello_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/54d7119d-2f2c-27ad-98d5-b76df69ba42b.png)

:::note warn
何も入力しない場合は `fontello` という名前になります。
:::

### 5. アイコンフォントをダウンロードする

右上の `Download webfont` ボタンをクリックしてダウンロードします。

![fontello_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/7488b6ec-6547-7914-3891-554e4168859b.png)

ダウンロードしたファイル構造は以下のようになっています。

```:fontelloダウンロードファイル
fontello-xxxxxxxx/
├── css/
│   ├── animation.css
│   ├── ico-sitename-codes.css
│   ├── ico-sitename-embedded.css
│   ├── ico-sitename-ie7-codes.css
│   ├── ico-sitename-ie7.css
│   └── ico-sitename.css
├── font/
│   ├── ico-sitename.eot
│   ├── ico-sitename.svg
│   ├── ico-sitename.ttf
│   ├── ico-sitename.woff
│   └── ico-sitename.woff2
├── config.json
├── demo.html
├── LICENSE.txt
└── README.txt
```

:::note info
複数のフォントファイルが格納されていますが、IEも考慮しているためです。
IEなき今、必要なフォントは以下の2種類だけで十分です。

* デザイン
  * ico-sitename.ttf
* Web
  * ico-sitename.woff2
:::

## デザインする

### 1. アイコンフォントをインストールする

ダウンロードした `ico-sitename.ttf` をインストールします。

### 2. 利用したいアイコンをコピーする

1. ダウンロードしたファイルの中に格納されている `demo.html` をブラウザで開く
2. アイコンフォントの一覧が表示されるので、利用したいアイコンを選択しコピーする

![fontello_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/104675a6-ed84-6700-cc0a-08caf10dafae.png)

### 3. アイコンフォントをデザインに表示する

デザインツールのテキスト入力時、フォント名に `ico-sitename` を選択し、コピーしたアイコンをペーストするとアイコンが表示されます。

![fontello_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/8f986d92-45d6-be9a-930f-829db5ecc654.png)

## コーディングする

### 1. CSS でアイコンフォントを読み込む

```css:CSS
@font-face {
  font-family: icons;
  src: url(ico-sitename.woff2) format('woff2');
}
```

### 2. 利用したいアイコンの unicode をコピーする

1. ダウンロードしたファイルの中に格納されている `demo.html` をブラウザで開く
2. アイコンフォントの一覧が表示されるので、右上の `show codes` をクリック
3. アイコン名が unicode に切り替わるので、利用したいアイコンの unicode をコピーする

![fontello_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492675/f0246869-2126-0e9b-ccc2-ff248ab3111d.png)

### 3. アイコンフォントをブラウザに表示する

コピーした unicode を 疑似要素 `::before` の `content` プロパティに設定して表示させます。

```css:CSS
@font-face {
  font-family: icons;
  src: url(ico-sitename.woff2) format('woff2');
}
.hoge::before {
  font-family: icons;
  content: '\e801';
}
```
### Sass を利用する

Sass を利用するとアイコンの管理と記述が楽になります。

```scss:Sass
@use 'sass:map';

// アイコンの名前と unicode をマップで定義
$icon-font-map: (
  up-open: 'e800',
  down-open: 'e801',
  left-open: 'e802',
  right-open: 'e803',
  angle-up: 'e804',
  angle-down: 'e805',
  angle-right: 'e806',
  angle-left: 'e807',
  angle-circled-up: 'e808',
  angle-circled-down: 'e809',
  angle-circled-left: 'e810',
  angle-circled-right: 'e811',
  angle-double-up: 'e812',
  angle-double-down: 'e813',
  angle-double-right: 'e814',
  angle-double-left: 'e815',
  twitter: 'e816',
  instagram: 'e817',
  facebook: 'e818'
);

// アイコンの unicode を返す関数
@function ico($icon-name) {
  // 引数に指定した名前のアイコンがある
  @if map-has-key($icon-font-map, $icon-name) {
    @return #{"'\\" + map-get($icon-font-map, $icon-name) + "'"};
  }

  // 引数に指定した名前のアイコンがない
  @warn 'iconfont name "#{$icon-name}" not found.';
  @return null;
}

// CSS に出力する内容
@font-face {
  font-family: icons;
  src: url(ico-sitename.woff2) format('woff2');
}
.hoge {
  &::before {
    content: ico(down-open);
  }
}
```

```css:CSS（コンパイル結果）
@font-face {
  font-family: icons;
  src: url(ico-sitename.woff2) format('woff2');
}
.hoge::before {
  font-family: icons;
  content: '\e801';
}
```

## アイコンを編集する

アイコンの追加や削除、アイコン名を変更したい…
そんな時は、

1. Fontello のサイトを表示する
2. ダウンロードしたファイルの中に格納されている `config.json` をサイト上にドラッグする

するとアイコンの選択状態が復元されます！

## まとめ

いかがでしたでしょうか？
Fontello を利用すると、アイコンフォントの作成、利用、管理がとっても楽になります。
サイトごとに作成し、ダウンロードしたファイルをバージョン管理することをオススメします。