Murga

個人的に言いたいコト・主張・気持ち。

Unicode 記号で Glyphicon みたいなフラットアイコンを表示したかった

世界の文字と記号の大図鑑 ー Unicode 6.0の全グリフ

世界の文字と記号の大図鑑 ー Unicode 6.0の全グリフ

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

プログラマのための文字コード技術入門 (WEB+DB PRESS plus) (WEB+DB PRESS plusシリーズ)

Twitter Bootstrap の Glyphicon とか Font Awesome とかみたいな、フラットな記号文字を、標準的な記号文字だけでできないものかなぁ〜と思っていた。

こういうのはパイフォントと呼ばれるようで、Symbols や Dingbats といった修飾文字をまとめたフォントということになる。

古くは Webdings や Wingdings みたいなモノがあって、Unicode の中でも記号文字が登録されていることから、コレを使えないかなーと思って色々調べた。

Wingdings などは font-family に指定してもうまく使えない

Wingdings などの古くからあるパイフォントは、文字のマッピングが Unicode に沿っていない。Chrome だと font-family を指定して利用できるが、Firefox だとフォントが適用されず、イマイチ使えない。

Wingdings のアイコンに対応する Unicode のコードを指定すれば、必ずしも Wingdings などを使う必要はない。しかし、Wingdings の見た目を利用したい時は使えないが…。

Unicode 記号は絵文字になる?

Unicode 記号を � のように HTML に入力すると、色の付いた絵文字になってしまう。何か良いフォントを指定したらフラットなテキストスタイルになるかなぁと思ったが、どうもそういうフォントはないようだった。

  • 参考:絵文字のショートカット・ファミリー - Hail2u
    @font-face でクロスプラットフォームに絵文字フォントを指定する
  • 参考:絵文字😇を含むテキストを表示する @font-face 設定(Unicode 10.0対応版) | ダーシマ・ヱンヂニヤリング
    もう少し細かく指定した場合と、その他の話。

    Unicodeの規格によると、「テキストで出す」「絵文字で出す」を明示する方法がある

    本来は、CSSで絵文字のためにがんばるべきではない、という結論となります。すべてはOSとブラウザの処理に任せるべきで、テキストで表示したいか、絵文字で表示したいかはユーザー側で制御すべきである

    とはいえ、どうやら絵文字バリエーション・シーケンス(規格上はEmoji Presentation Sequences)はまだOSやブラウザのサポートが十分ではないようで

  • 参考:絵文字バリエーション・シーケンスとは何か - Mac OS Xの文字コード問題に関するメモ  

    テキスト・スタイル」で表示したければ、「☎」の直後にU+FE0E(VS-15)を入力する。
    逆に「絵文字スタイル」で表示したいなら、U+FE0F(VS-16)を入れればいい。

    「絵文字スタイル」側はすべてAppleカラー絵文字でカバーできるが、「テキスト・スタイル」側の表示はインストールされているフォントに依存する。また、「テキスト・スタイル」を指示するU+FE0E(VS-15)が付いていても、Appleカラー絵文字でしか表示できない文字は、Appleカラー絵文字で表示される。

  • 参考:🔣 Symbols Emoji Meanings
    プラットフォームごとのアイコンが画像でプレビューできるサイト。

…というワケで、テキストスタイル表示と絵文字スタイルを選ぶための文字コードがあるのだが、まだ対応するフォントがかなり少ないようだ。

記号を選べば、絵文字ではないテキストスタイルの記号もあるが、Glyphicon や Font Awesome ほどの自由度はなく。

絵文字を CSS で白黒表示して誤魔化す

予め色の付いた絵文字を使うとなると、Glyphicon のように自分で色を決めたりできない。これでは自由度が低いので、もう少し誤魔化し方を考えてみる。

CSS の filter プロパティを使うと、要素をモノクロ化したりできる。コレが絵文字テキストにも効くので、コレで絵文字を白黒化してみようということ。

.monochrome-emoji {
  /* サンプルのため絵文字フォントを確実に適用させる */
  font-family: "Apple Color Emoji", "Android Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "Noto Sans Emoji", "Noto Sans Symbols", "Noto Emoji", "Gecko Emoji";
  /* 少しコントラストを上げてからグレースケール化する */
  filter: contrast(110%) grayscale(100%);
}

単に filter: grayscale(100%) でも白黒にはなるが、contrast() で少しコントラストを上げておくと、グラデーションな部分をもう少しフラットにできるかなと思う。

See the Pen Monochrome Emoji by Neos21 (@Neos21) on CodePen.

…ウーンイマイチ。

やっぱりフォントファイルに容量食ったとしても、Glyphicon とか Font Awesome とか使うのが手っ取り早いか…。