フォントが対応しているか判定する
どのブラウザでも、フォントファミリー指定がすべて失敗したときのフォールバックフォントが定義されている。
このため、わざとあり得ないフォントファミリー名を指定することでフォールバックフォントを指定させて、そのサイズと見比べることで、フォントが本当に選ばれたかどうかを判定する。
もう一つの方法は、わざとフォールバックフォントをWebフォントとして指定して、フォールバックしたときに、そのフォントがなかったことを検出する。
https://developer.mozilla.org/ja/docs/Learn/CSS/Styling_text/Web_fonts
Adobe Blank というフォントは、すべての文字を幅0とするフォント。
https://web.archive.org/web/20130331234335/http://jp.techcrunch.com/2013/03/30/20130329adobe-launches-blank-an-open-source-fallback-font-you-cant-see/
https://github.com/adobe-fonts/adobe-blank
フォントがロードされるまでの間はデフォルトフォントが使われてしまうので、document.fonts.loads で明示的にロードを待つのと、フォントすべてのロードを待つために document.fonts.ready を使う。
https://bugbearr.github.io/clientwebexp/js/font/font_detection/
Windowsで見たとき
https://gyazo.com/5e222f61f76b5ffb4b49dd325260f82a
Mac (Safari)で見たとき
https://gyazo.com/941bdaa1bb5d0e0f5a752fba1315dbad
docuement.fonts.ready がちゃんと効いていない? リロードすると正常になる。
これを使うと、フォント指定で幅が出るならフォントが存在するという判定をすることができる。
JavaScriptで特定のフォント(文字列)がインストールされているかどうかを調べる https://s8a.jp/javascript-is-installed-font
問題は「そもそもフォント名を知らなければ指定できない」という所
ユーザーが独自に追加したフォントは知りようがない。
/bbr-program-memo/プリインストールフォント
フォント名を取得するAPIは「ユーザーを特定する可能性がある」(フィンガープリント)ために実装されないことになっている。(馬鹿すぎる)
Webからローカルフォントのデータを取得する~Local Font Access APIとは~
https://zenn.dev/newt_st21/articles/local-font-access-api-chromium
https://uupaa.hatenadiary.org/entry/20100128/1264630442