エンジニア座談会Vol.05 JamstackとWebフォントの機能
はじめに
本記事はフロントエンドに関わる人々のためのメディア「CodeGrid」(https://www.codegrid.net/)より厳選した記事をお送りします。
前回はWebフォントがどれくらい普及されているかということや、仕組みなど基本的な知識や仕組みが話題に上がりました。日本語のフォント化は欧米のそれに比べて容量が多くなることや、その適用の高速化を図るため、さまざまな仕組みが策定されていることが話されました。 今回はJamstackとWebフォントの話題を中心にお届けします。OpenType機能などこれからのWebフォントに期待される機能の話も登場します。 引き続き、ゲストの鈴木さんとのWebフォント談義をお楽しみください。
(※本記事は、2022年1月下旬に収録した座談会をもとにしたものです。記事中で話されている情報は、座談会当時の内容になります。また、記事へのリンク先が有料記事の場合もありますので、あらかじめご了承ください)
ゲスト
鈴木 丈さん
Web開発者、タイポグラフィ研究者。Webサイトの設計や実装に携わるかたわら、Webとタイポグラフィに関する執筆や講演なども積極的に行っている。監訳に『ウェブタイポグラフィ』(著者:リチャード・ラター、ボーンデジタル発行)。フォントワークス株式会社所属。
ピクセルグリッドの参加者
参加した皆さまのプロフィール(クリックで開閉します)
中村 享介さん
2009年、JavaScriptの会社として株式会社ピクセルグリッドを設立。 多数のWebリニューアル、新規立ち上げを取り仕切った経験を持ち、情報設計、フロントエンド、クラウド活用、開発フローの効率化を得意とする。 Webをより発展させるため、新しくブラウザに実装された機能の活用事例を数多く生み出しつつ、日々、クラウドサービスを利用した効率のよい制作・開発手法の試行錯誤を続けている。現在の興味はWeb Componentsを使ったマークアップの改善とJamstack。 著書に『WebクリエイティブのためのDOM Scripting』(単著:毎日コミュニケーションズ、2007年)など。ここ数年は書籍の執筆をせず、フロントエンド技術情報メディア「CodeGrid」で精力的に執筆活動を行っている。
小原 司さん
紙媒体をメインに制作しているデザイン事務所で広告デザインの基礎を学ぶ。2000年に独立。化粧品関連媒体の販促物を中心に、店頭グラフィック、パッケージ、POP、グッズ立案など多岐にわたるデザインを担当。2007年頃からWeb媒体へのデザインにも積極的に取り組み、クロスプラットフォームアプリのデザイン、画面設計、実装に携わる。2013年にピクセルグリッドに入社。現在では利用者にストレスを与えず迷わないユーザーインターフェースの設計とデザインに励んでいる。 著書に『ノンデザイナーズ・デザインブック[第4版]』(日本語版補足解説:マイナビ出版、2016年6月30日)などがある。また、マンセル色相環とムーン&スペンサー配色理論を採用した配色アプリ『HUE360』を1人でデザインから開発まで行い公開している。
矢倉 眞隆さん
2016年10月にピクセルグリッドへ入社。Web標準技術やブラウザの実装動向に明るく、イベントでの講演や雑誌・オンラインメディアへの原稿執筆、書籍の監修・監訳などを数多く経験。 Google Developer Expertとしても活動中。
ビルド時にフォントを埋め込む問題点
中村:Jamstackの場合のフォントの埋め込みはどうでしょう。 Jamstackでは、事前にビルドプロセスでコンテンツを埋め込んだ状態のHTMLを作ってしまって、ユーザーのアクセスに対しては速いサイトを作るという手法です。 そうなってくると最終成果物は静的サイトなので、動的サブセッティングするというのはムダだなと思っていて。そういうのをビルド時に事前に埋め込んだりしたいなと思っているんです。こんなイメージですね。
Webフォントを埋め込んだ静的なHTMLを生成するイメージ
ただ、鈴木さんからもお話あったように(編集部注:前回のお話で出てきました)、ライセンスの問題があるのかなと思うのですが。
鈴木:仕組みとしては、おっしゃるようなことはできることはできるんですよ。僕が関わっているFONTPLUSの場合でもAPIがあるので、文字列を投げるとサブセット化されたものをzipで返すというようなことはできる。まあ、あんまり洗練されてはいないですけど、仕組みとしては不可能ではない。
でも、やっぱり、問題になるのはライセンスですよね。Webフォントのサービスって、どこもいろんなフォントメーカーからフォントを預かって、それを配信しているという立場なので、ちゃんとプロテクトをかけないといけない。
ビルド時に埋め込むとかそういう使い方もフォントメーカーと契約できればできると思いますけど、現状だとできていないし、もしできたとしても高くなりそうなところはありますよね。
中村:そうですよね、Jamstackのように事前に作って埋め込むのって大規模なサイト向けなので、どうしても高くなってしまうかなと。僕が個人サイトで「このおしゃれなフォントをちょっと使いたくて、お金多少かかってもいいんだけど」みたいなのだと、ちょっと難しいのかなと思います。
鈴木:そうですね。ちょっと見合わないんじゃないかなと。
僕もフォント業界に入ってみて思ったんですけど、活字の歴史に比べるとWebフォントはまだ新しい技術なので、Webでどういうニーズがあるのかというところまで、なかなか思い至ることができていないという印象があります。
なので、そういう(Webサイトで埋め込んで使いたい)話が来たときに、見積もりが難しかったり、価格感が合わなかったりしがちなんじゃないかと。もうちょっと時間が経って、Webフォントの仕様と実装が洗練されてくれば、フォントメーカーのライセンシングの考え方が変化する可能性はあるんじゃないかなと思います。
動的にサブセット化をする時間コストをどう考える?
矢倉:ビルド時に必要なもので静的サブセットのフォントがライセンス的に可能としても、僕が気になっているのが、ビルド時間はどれくらいかかるのかというところですね。
Jamstackだと、基本的に静的にビルドしてそれを配置するというのをコアな思想として持っているんですけど、ページコンテンツが増えればページを作るビルド時間も増えていくわけです。それにさらにフォントを作成する時間があってとなると、コストが全然見合わないんじゃないかなと思うんですよね。
フォントのサブセットって、それなりに短い時間で作成できるものなんでしょうか?
鈴木:そうですね、速いといっていいかわからないですけど、シンプルなサイトだったら、気にならない程度だと思います。
ただ、今FONTPLUSは動的サブセットで返しているのがWOFFなんですね、いい加減WOFF2を出しましょうよ、ということで試しているのですが、WOFFに比べて生成にかなり時間かかってしまうんです。現状、IEを考えないのであれば、WOFF2でいきたいところだと思うので、そう考えると大きいサイトだとネックになる可能性はあるかなと思っていて。
-
Webフォントで最初に共通化されたフォントフォーマットがWOFFで、WOFF2というのはWOFFの発展型です。WOFF2は圧縮の仕組みを改善したので、その結果フォントファイルの容量がWOFFよりも減らせます。 ただ、WOFF2で使われているBrotliという圧縮アルゴリズムが、WOFFのDeflateというアルゴリズムよりも時間がかかってしまいます。鈴木さんが言っているのは「毎回動的にやってしまうと実用に堪えるのかわからない」ということです。(矢倉)
矢倉:Googleが静的サブセッティングを採用しているのも、そこが理由の一つかもしれないですね。その話を聞くと。
中村:僕も動的サブセッティングは結構速いなという印象があるので、ビルドのタイミングで作ってくださいみたいなことがAPI的にできれば、Jamstackという用途でも使いやすいのかなと思っていたんですけどね。ライセンスの問題があるにしても。
鈴木:あとは、動的にサブセット化するときに、どこまで含めるか。グリフのデータだけじゃなくてOpenType機能をどこまで含めるかも多少関係してくるのかなと思っています。
現状のWebフォントサービスって、ファイルサイズとかサブセット化にかかる時間とか考えて、使わなそうなOpenType機能を落としちゃっていることがよくあるんですよ。そのあたりの、OpenTypeの機能をどこまで使うのかは関係してくると思いますね。
矢倉:なるほど。
-
OpenTypeというのはフォントの規格です。OpenType機能(OpenType features)は、同じ文字に違う字形を割り当てたり、カーニングの情報を定義したりする仕組みで、特性と訳されることもあります。
OpenType フォント特性の手引き – CSS: カスケーディングスタイルシート | MDN
たとえば、欧文だと合字やオールドスタイル文字とかがあります。日本語でも「斎藤さん」の「斎」など、標準字体以外のバリエーションとなる異体字のOpenType機能もあります。(矢倉)
日本語フォントでOpenType機能をどう活かせるのか
矢倉:OpenType機能は違う字形をフォントに含めることが多いので、機能を入れれば入れるほどフォントのファイルサイズが大きくなる。だから、鈴木さんがおっしゃったように、何を使うのか、どこまで含めるのかっていうのが課題になっているんだと思います。
たとえば、Noto Sans CJKも、インストール可能なもとのフォントファイルに比べて、Webフォントでは使えるOpenType機能が削られていますね。そうしてファイルの容量を少しでも減らしているんだと思います。
鈴木:そうですね。
矢倉:それで、そのOpenType機能をCSSから制御できる、font-feature-settings
というプロパティがあります。
小原:font-feature-settings
って、なにか一つを指し示しているんじゃなくて機能全体を指していて、その中の機能で何を使うかを指定してください、っていうことなんですよね?
矢倉:そうです。OpenType機能はいっぱい数があるんですが、font-feature-settings
はその機能ごとにオンオフできるんです。たとえば、Noto Sans CJKにはプロポーショナルメトリクスの機能palt
に対応しているんですが、それをオンにしたかったら、font-feature-settings: "palt" on
と書くとオンにできます。
中村:OpenType機能は、現場でCSS書くときに使います?
國仲:指定があれば書きますけど、なければ特に書かないですね。個人的なサイトでは場所によっては使います。ただ、font-feature-settings
ってプロパティが使いにくいんですよね。
鈴木:そう、使いづらい。
國仲:一個変えたら、全部上書きされて死ぬという。font-variant
プロパティが、それをいい感じにしてくれる。Open Type機能を個別に指定するプロパティがあるんですよ。
CJKとかは厳しいですよね。
矢倉:ですよね。ちょっと使いにくいプロパティを使わざるを得ない状況になっていますね。
-
座談会で「使いにくい」と発言していた
font-feature-settings
プロパティが使いにくい理由について、少し触れておきます。たとえば以下のようなコード例があります。
body { /* リガチャを無効にする */ font-feature-settings: "liga" 0; } article { /* 字幅をプロポーショナルに */ font-feature-settings: "palt"; } article h1 { /* 上書きしてしまったのでリガチャ無効が消えている */ }
font-feature-settings
で、リガチャを無効にし、字幅をプロポーショナルにするという2つの設定を行っているつもりでも、設定が上書きされてしまい、リガチャ無効が効きません。または、複数人でCSSを書いている場合、
body
にリガチャ無効の指定があることを知らない作業者が上書きしてしまった、ということも想定できます。これは
background
やfont
などのショートハンドプロパティで予期せぬ上書きを発生させてしまうのと似た状況です。これを避けるためには
article
においても"liga" 0
を指定する必要があります。/* こうする必要がある */ body { font-feature-settings: "liga" 0; } article { font-feature-settings: "liga" 0, "palt"; } article h1 { /* リガチャ無効、字幅プロポーショナル */ }
つまり
font-feature-settings
は適用したいセレクタに継承されているOpenTypeタグを知っていないと、新しく指定する場合に予期せぬ上書きを発生させてしまう可能性があります。また、単純にタグ名(
"palt"
など)がわかりにくいですし、続く数字の指定もわかりにくいです。タグはこんなにたくさんあります(前述のMDNからリンクされています)ので、それぞれにプロパティがあったら、それはそれで大変だろうとは思いますが……。難しいところですね。
しかし、一部の機能は単独のプロパティとして使えますので、こんなことを考える必要はなくなります。たとえばリガチャには
font-variant-ligatures
プロパティがありますので、次のようにも書けます。body { font-variant-ligatures: none; } article { font-feature-settings: "palt"; } article h1 { /* リガチャ無効、字幅プロポーショナル */ }
しかし日本語ユーザーがよく使うであろう
"palt"
などにはプロパティがありませんのでfont-features-settings
を使う必要があります。font-variant-*
自体も数は少ないですが、細かい制御がプロパティ名でわかりやすく、使いやすいです。英文で使うならば、かなり書体の制御ができるのではないでしょうか。font-variant-*
で使える機能なら、font-feature-settings
ではなく、font-variant-*
で処理したほうがいいと思います。このことは、鈴木さん監訳の『ウェブタイポグラフィ』が詳しいです。また、MDNの
font-variant-*
のページにも「ウェブ制作者は可能なかぎりfont-variant
系プロパティを使うべきである」といった解説が書かれています。(國仲)
OpenType機能はpaltだけじゃない
鈴木:現実的にはpalt
がとにかく流行りすぎちゃった、という気がしています。font-feature-settings
には、文字幅を変えるにしても、約物*だけ変えるとか、前後関係に応じて変えるとかいろいろあるんですけど、とにかく「font-feature-settings
といえばpalt
」みたいな定着の仕方をしている気がしていて。
そのあたりの機能が「もうちょっと、いろいろあるんだよ」というのがわかってもらえるといいなと思うんですけど。でもそのためにはフォントにそのOpenType機能を搭載してもらわなきゃいけないというのもあるし。
まあ、フォントにそもそも機能入っていないとか、そもそもいろいろな機能が知られていないとかが、課題かなという気がしますね。
-
約物とは言語記述に使われる、句読点(。や、)、疑問符(?)、括弧(「」 )など記号の総称です。
國仲:FONTPLUSのフォントでOpenType機能はなにが使えるかなと思ってみていたんですけど、chws
(Contextual Half-width Spacing)が使えるのはちょっとびっくりしました。
鈴木:chws
は、横書きのテキストで全角の約物が特定の組み合わせで連続した場合の空きを調整するというものですね。これはいいんですよ、すごく。
デフォルトの状態(上)と、chwsを適用した状態(下)
矢倉:これ、いつ対応したんでしたっけ?
鈴木:対応したのは2021年です。結構早かったですよ。ちょっと自慢です(笑)。
國仲:これはわりと、すごいなと思っていますね。text-spacing: trim-adjacent
的なものが、これ使えばできる。
-
2024年7月の仕様では、
text-spacing-trim
となっています。詳しくは、CodeGridの次の記事などを参照してください。
鈴木:そうなんですよね。palt
にしてもchws
にしても、こういうのが以前だとJavaScriptで無理やりやったりとか、正規表現で走査して<span>
で囲ってスタイル当てたりしてがんばってやっていたのが、最近は標準技術としてどんどんできるようにやれるようになったので楽しいですよね。
OpenType機能って、今もいろいろな機能が「こうしたいよね」と言って積極的に提案されているかんじがあって。まだまだ機能を拡張できる余地があるので、楽しみなところですね。
國仲:本文にpalt
を使っているのを見ると、MS Pゴシックを思い出すんですよね。なんでもかんでもガチガチに詰めていくみたいな。好みの問題もありますけど。
鈴木:うんうん。あれ、辛いと思うんだけどね。
中村:僕もそう思いますね。おばらさんはデザインするときに、そのあたりってどこまでやっています?
小原:本文は文字詰めはやりたいとは思わないですね。とはいえ、いわゆる箱組*がWeb上でできるかというと、現状仕様上ではすんなりはできない、ブラウザの実装ではできないはずなので。そうなると、palt
するしないにかかわらず、きれいに四角くはなりづらいので悩ましいところです。
-
文字の周りに正方形の「仮想ボディ」を想定し、その正方形を並べていく組み方。DTPでは「ベタ組」とも呼ばれます。
和欧文の混植に力を発揮する仕様
小原:Web上のコンテンツって、和欧文の混植がとてもされやすいですよね。たとえばCodeGridなら、コードもあるし、仕様とかのアルファベットと日本語が混じりやすいっていうのがある。そのあたりって、箱組というか、仮想ボディの四角いリズムというのが本当に本文に対して完全に適用されるのかというと、いまいち僕はそこまで踏み込んで考えるところには至っていないので、していない。
まあ、見出しは、文字が大きくなるとやっぱり字間がパラパラしちゃうというのはあるので、そこはシュッとまとまっていてほしいので指定するんですけど。
ただ、指定したいという思いがあっても、それを上手に実装の方に伝えるのが難しくて、そのへんは悩ましいところですね。一律、全部かけてくださいというのは簡単だけど、あのときはこうでこのときはこう、という場合分けをするのは難しい。
鈴木:和欧混植の話で言うと、CSSの@font-face
のディスクリプターが結構実装されてきていて、おもしろいですね。たとえば、ascent-override
とdescent-override
でアセンダとディセンダのバランスを変えられたり、size-adjust
で数値上のフォントサイズはそのままで見た目上のサイズを変えられたりします。
そうすると、それを使うと和欧混植のサイズ調整、たとば欧文だけ5%大きくするみたいなことができるようになるんですよね。ブラウザの実装状況を見ても、あとはSafariがくれば、みたいなかんじになってきています。
@font-face
は最近いろいろ増えて、これも楽しいなという気がしていますね。
小原:もともとあのあたりって、グラフィックツール周りの混植設定の流れからきているんですかね?
鈴木:いや、これはパフォーマンス関連からみたいですね。欧文って字幅がまちまちだから、フォールバックフォントからWebフォントに切り替わったときに、行数が変わっちゃってレイアウトシフトが起こってやだよね、みたいな。それで、フォールバックフォントとWebフォントで同じ見た目、同じ字幅になるように、ということで取り上げられていることが多いみたいです。
小原:そうですよね、「I」と「W」じゃ、だいぶ字幅が違いますからね。
鈴木:ただ、実装している人たちはそういうモチベーションでやっているのかもしれないんですけど、CJKを使う僕たちの立場からすると、それってやっぱり和欧混植で力を発揮するなあと思っていて。そういう観点からの話ってあんまり見たことはないんですけど。
逆に日本語だと基本全角だから、フォールバックからWebフォントに切り替わっても実は欧文に比べるとレイアウトシフトが起こりづらいんですよね。そのあたりが、扱う文字の違いによる、アングルの違いですよね。
中村:なるほど。日本語を扱うという観点からOpeyTypeフォントや@font-face
を見ていくとおもしろいですね。
同じ観点で、バリアブルフォントはどうでしょうか? 次はこの話題を話してみたいと思います。
(後編へ続く)