ios11以前と以降での、-apple-systemの表示

iOSのsafariでは、`font-family:-apple-system;` でSan Franciscoフォントを表示させることができます。この`-apple-system`の挙動が、iOS11以前と以降で微妙に変更になっています。

## iOS10と11での表示の違い
以下、iOSシミュレーターでキャプチャした画像です。(左がiOS10、右がiOS11)

### "Hiragino Kaku Gothic ProN"; で指定した場合
<img width="769" alt="ec7e45d26203ca38dd1edbefe9965a45.png" src="https://qiita-image-store.s3.amazonaws.com/0/5323/e0a19293-0846-1cd2-ab7b-3608d8e7b904.png">

ヒラギノだけ指定している場合、半角英数は当然ヒラギノのグリフになります。同じ字体のため、半角と全角が混ざっても高さが揃っていて自然な見た目になります。

### -apple-system, "Hiragino Kaku Gothic ProN"; で指定した場合
<img width="779" alt="9f3d590b9a42bb38e60af9f74a5adce7.png" src="https://qiita-image-store.s3.amazonaws.com/0/5323/ef3f5385-cb1f-0af4-abcf-d295f7980d88.png">

ヒラギノから半角英数だけSFにした状態です。数字と「円」の部分の高さが顕著ですが、SFのほうがグリフの高さが小さいため、iOS10では半角と全角が混ざった部分で高さが変わります。

iOS11では、ヒラギノのフォントサイズが**1px縮小される**ため、グリフの高さが揃い、半角/全角混じりでも違和感がありません。


### -apple-systemだけ指定した場合
<img width="776" alt="4a81da69911b9c437eeb06dbf52e430f.png" src="https://qiita-image-store.s3.amazonaws.com/0/5323/058bc6f9-783f-e995-41e4-e2f7d7c0c718.png">

iOS10でも、ヒラギノの高さが縮小されました。


### font未指定の場合
<img width="774" alt="aca9e719f586d855b304be6a69787ee5.png" src="https://qiita-image-store.s3.amazonaws.com/0/5323/13fd0548-79c4-31d8-3b61-76659a7b39c2.png">

iOS10では、英数字:serif、日本語:ゴシックなのでチグハグな感じでしたが、iOS11では日本語が明朝体になり、自然な見た目になります。

### 各ウェイトを指定した場合
`Hiragino Kaku Gothic ProN`では2種類しかないはずのweightが、iOS10,11ともに~~数値に応じたweightで~~いくつか追加され表示されるようになります。
<img width="780" alt="18e7fea7299dbacba2d9f7bb12af1416.png" src="https://qiita-image-store.s3.amazonaws.com/0/5323/c4a4a1bc-1d39-5d45-c58b-09fce1bbcc10.png">
*左から、ios10 / -apple-system
ios10 / -apple-system,'Hiragino Kaku Gothic ProN'
ios11 / -apple-system
ios11 / -apple-system,'Hiragino Kaku Gothic ProN'*

iOS10では、`-apple-system`のあとに`Hiragino Kaku Gothic ProN`があると、weightが2種類に戻ってしまうようです。




## まとめ
全体としてみると、どんなパターンでもiOS11のほうがグリフの高さや字体が揃い、見た目の違和感が軽減されるようになっています。

`-apple-system`で表示されるヒラギノは、`Hiragino Kaku Gothic ProN`とは別の、以下の性質をもったヒラギノ表示されているように見えます。（以降、便宜的に隠しヒラギノと呼称）

* 通常のヒラギノよりグリフ高さが1px小さい
* weightが通常のヒラギノよりも多く用意されている

隠しヒラギは、日本語フォントの第一候補として`-apple-system`が指定されていた場合有効になります。
iOS11では第二候補以降の日本語フォントは無視されるのに対し、**iOS10では第二候補に日本語フォントがある場合そちらが優先されます**。



## -apple-systemの注意点

### iOS11からは、-apple-systemの指定だけで全角文字のフォントが決定されてしまう

前述のとおり、iOS10と11で、`-apple-system`以降の日本語フォント指定で決定されるフォントが異なります。

`-apple-system, "Hiragino Mincho ProN"` のような指定では、iOS11では明朝体にはならず、ゴシック体で表示されます。


### フォントサイズはCSSの値だが、描画されるフォントは1px小さい
隠しヒラギノは表示上の文字サイズが1px小さいものの、行ボックスの高さなどはCSS上のfont-sizeで計算されます。そのため、行ボックスの上辺に1pxほどのleading(スペーサー)が差し込まれるようになります。


その結果、通常のヒラギノと比べて行間が広がったり、行の上辺を基準に位置を合わせていたアイコンが、テキストに対して1px上がっているように見えるようになります
<img width="765" alt="2d0127c9d21f36cdad7d84026208ade0.png" src="https://qiita-image-store.s3.amazonaws.com/0/5323/4a12016c-b79a-87ee-6ad6-0f14ab4b7f93.png">

また、1em=1文字ではなくなるため、例えば10文字を表示するボックスに対してwidth:10em;を指定した場合、右側に余白ができることになります。
<img width="554" alt="d10f47068b8b6efa5962b5251ad4f322.png" src="https://qiita-image-store.s3.amazonaws.com/0/5323/80598e91-c53a-0e89-070c-481cd86a1b4b.png">



## SFとヒラギノ角ゴを併用したい場合のフォント指定

### -apple-systemのみで指定する（日本語フォントの指定はしない）

ios10でも11でも小さいヒラギノ角ゴで表示されるので、バージョン違いで表示に差分が出ることはありません。
ただしandroidと比べるとiOSのほうが1px小さくなります。


### すでに-apple-system,"Hiragino Kaku Gothic ProN"してたり、別の日本語フォントを指定したい場合

```
@font-face {
    font-family: "-apple-system-subset";
    src: local(-apple-system);
    unicode-range: U+0000-05C7;
}
hoge{
    font-family:-apple-system-subset,`Hiragino Kaku Gothic ProN`;
}
```
参考:[Google ChromeでＭＳ ＰゴシックをArial+メイリオに置換する](https://hail2u.net/blog/software/replace-ms-pgothic-with-arial-plus-meiryo-in-chrome.html)

unicode-rangeでapple-systemから記号部分だけ抜き出すことで、日本語フォントにapple-systemが当たらないようにすることで回避できます。

このパターンでは隠しヒラギノは有効にならないため、高さ調整や、追加されたweightの表示はできなくなります。