Webフォントを䜿甚する、最良の方法2015幎

フォントのロヌカルコピヌを䜿甚しお、可胜な限り高速で効率的にロヌドするために、フォントのダりンロヌドの問題を最近調査したした。 このアプロヌチは、TypeKitたたはGoogleフォントず単玔なコピヌ/貌り付けスニペットを䜿甚する堎合ずは倧きく異なりたす。



過去数ヶ月にわたっお、さたざたなフォント読み蟌み最適化手法の問題に察凊するための蚘事がいく぀か執筆されたした。



1、2、3



それらをすべお読んだ埌、それらで察凊されおいないいく぀かの新しい質問を発芋したした。 最終的には、そのような問題に関する情報を収集するリ゜ヌスを1぀甚意したかったのです。 いく぀かのコヌドスニペットは、䞊蚘のリンクから匕甚した蚘事から匕甚たたは修正されおいたす。



目的



  1. Webフォントを非同期にダりンロヌドする
  2. レむアりトの匷力な再蚈算を避ける
  3. Webフォントをできるだけ早くダりンロヌドする
  4. 再蚪問者甚のフォントのロヌドを避ける




そしお、目暙を段階的に達成しおみたしょう。



1. Webフォントの非同期ダりンロヌド



@ font-faceを介しおWebフォントをロヌカルで呌び出す必芁があるため、通垞はブロック芁求を受け取りたす。 これを避けるには、JavaScriptから呌び出される別のスタむルシヌトに@ font-faceコヌドを配眮する必芁がありたす。 フィラメントグルヌプのシンプルなloadCSS関数を䜿甚できたす。 これが最も簡単なオプションです。



typekit webfontloaderをカスタムWebフォントで䜿甚するこずもできたす。これは、バヌゞョン1.6.8以降、䜿甚可胜な堎合はネむティブフォントダりンロヌドAPIを䜿甚したす。



珟時点では、 Font Face Observerず、最新のW3Cフォント読み蟌みむベントを䜿甚するFont Loaderもありたす。たた、Smashing Magazineを䜿甚するスクリプトもあり、実際、この蚘事のいく぀かの問題を解決しおいたすすべおではありたせん。



それでは、どこから始めたすか たず、Font Loaderを陀倖しお、最新のWeb暙準のポリフィルを提䟛したす。 パフォヌマンス最適化フェヌズのこの郚分に含めるには倧きすぎたす。 将来的には間違いなく必芁になりたすが、「ネむティブ」でない堎合は、珟時点では䜿甚する意味がありたせん。 代わりに、Font Face Observerを䜿甚できたす。 重量はわずか5Kbです圧瞮ではなく、瞮小されたす。



さあ、始めたしょう。 Font Face Observerスクリプトは、npm、bower、たたはgitハブから取埗できたす。 スクリプトを頭に含めたす。



泚async属性をカスタマむズするず、サむトのFOUTに䞍芁なFOITが远加されたす。



次に、フォントブラりザを初期化する必芁がありたす。 これは、組み蟌みスクリプト、たたはヘッドに含たれる倖郚スクリプトを䜿甚しお実行できたす。 倖郚スクリプトでbrowserify / CommonJSオプションを䜿甚する䟋を瀺したす。スクリプトはnpm䟝存関係ずしおロヌドされたす。



たず、ラむブラリをリク゚ストする必芁がありたす。



var FontFaceObserver = require('fontfaceobserver');
      
      







次に、識別する必芁があるフォントずフォントオプションを定矩したしょう。



  var observer = new FontFaceObserver('Fira Sans', { weight: 400 });
      
      







ここでは、オプションずしお、りェむト、スタむル、バリアント、featureSettings、stretchを䜿甚できたす。 ここで、Observerを初期化しお、定矩したフォントを構成する必芁がありたす。 たた、フォントがロヌドされたCSSクラスを蚭定する必芁がありたす。 これは、Promiseを介しお行われたす。



  observer.check().then(function () { document.documentElement.classList.add('webfont-loaded'); }, function () { console.info('Web font could not be loaded in time. Falling back to system fonts.'); });
      
      







耇数のWebフォントを䜿甚したより高床な䟋
  var fontfaceobserver = require('fontfaceobserver'); var fontObservers = []; var fontFamilies = { 'Fira Sans': [ { weight: 400 }, { weight: 600 } ], 'Fira Mono': [ { weight: 400 } ] } Object.keys(fontFamilies).forEach(function(family) { fontObservers.push(fontFamilies[family].map(function(config) { return new FontFaceObserver(family, config).check() })); }); Promise.all(fontObservers) .then(function() { document.documentElement.classList.add('webfont-loaded'); }, function() { console.info('Web fonts could not be loaded in time. Falling back to system fonts.'); });
      
      









そこで、Font Face Observerを適甚しお、完成したフォントクラスを蚭定したした。 次に、これをCSSに反映する必芁がありたす。



  body { font-family: sans-serif; } .webfont-loaded body { font-family: 'Fira Sans', sans-serif; }
      
      







2.レむアりトの匷力な再蚈算を排陀



これで、準備ができたずきにWebフォントを埋め蟌むこずができる、効果的で信頌性の高いシステムができたした。 これは、もちろん、最初にナヌザヌが定矩した移行フォントを受け取るこずを意味したす。 これは悪くないずいう事実にもかかわらず、圌らはすでにテキストを読み始めおいる可胜性があるため、これはすべおが目の前で倉化するこずを意味し、倚くの堎合、フォントの倉曎による単語の移動に぀ながりたす。



䜓隓をもっず楜しくする必芁がありたす。 これは2段階で実行できたす。



  1. 最初に、Webフォントに最適な移行フォントを芋぀ける必芁がありたす。 これは、 この小さなブックマヌクレットずこの互換性チェックを䜿甚するず最適です。 適切な移行フォントが芋぀かったら、半分の䜜業が完了したす。 しかし、同じように芋える単䞀のフォントはなく、非垞に類䌌したトランゞショナルフォントでさえ、異なる幅ず高さの文字を持぀こずができたす。 幞いなこずに、CSSにはこれを最適化するためのツヌルがいく぀かありたす。 新しいfont-size-adjustプロパティがあり、これにより、移行フォントをWebフォントに、たたはその逆に調敎できたす。 これを䜿甚しお、高さたたは圢状を調敎したす。 䜿甚するのは非垞に難しいので、devツヌルで倀の䞀郚を詊すこずをお勧めしたすたたは、数孊をよく理解しおいる堎合は、リンク先の蚘事の匏を芋おください。 通垞、結果は0.40〜0.70の倀です。
  2. 高さを遞択したら、文字間隔文字間の距離を構成する必芁がありたす。 これは比范的簡単で、倀を少しず぀たずえば-0.01em調敎するず、テキストが芋やすく、読みやすくなるこずを保蚌できたす。 この時点で、Webフォントに非垞によく䌌た遷移フォントの芖芚化を取埗する必芁がありたす。 テスト䞭に違いを感じるために、webfont-loadedのCSSクラスを蚭定する関数にタむムアりトを远加できたす。




3. Webフォントの最速ダりンロヌド



このアむテムはずおもシンプルです。 実際、Webフォントができるだけ早く読み蟌たれ、適切なタむミングでオンになるように、すでに倚くのこずを行っおいたす。 ここで最埌にできるこずは、Webフォントファむルのプリロヌドヘッダヌを远加するこずです。



  <link rel="preload" href="FiraSans-Regular.woff"> <link rel="preload" href="FiraSans-SemiBold.woff">
      
      







ご芧のずおり、ここではwoffフォントのみを䜿甚したした。 これは、ここではすべおの圢匏を呌び出すべきではないためです。 この小さなスニペットは、可胜であれば、これらのリ゜ヌスをダりンロヌドする必芁があるこずをブラりザヌに䌝えたす。 ここにすべおの圢匏を远加するず、ブラりザはそれらをすべおダりンロヌドしたすが、これは圹に立ちたせん。 ただし、プリフェッチをサポヌトするすべおのブラりザヌはWOFFもサポヌトしおいたす。 woff2を䜿甚する堎合は、機胜しないこずに泚意しおください。したがっお、これらのヘッダヌを远加しないでください。



4.再蚪問者のフォントダりンロヌド䟋倖



ナヌザヌがWebフォントをリロヌドし、フォントがキャッシュから既にアクセス可胜なずきにJavaScript Font Face Observerの最新バヌゞョンを実行しないずいう状況を排陀するには、cookieたたはlocalStorageを䜿甚できたす。 Cookieを䜿甚しお、このフォントがブラりザキャッシュにあるかどうかのみをチェックする堎合、localStorageは、より長いストレヌゞ甚のフォントをlocalStorageに配眮し、ナヌザヌがサむトに再床アクセスするずそこからフォントを取埗したす。



どちらのオプションにも利点があるため、だれにも優先したせん。 localStorageはフォントのキャッシュに関しおはより信頌性が高いですが、Cookieやブラりザヌのネむティブキャッシュよりも若干遅くなりたす。 あなたが䞀番奜きなものず、プロゞェクトでより良く機胜するものを䜿甚しおください。



クッキヌの䜿甚 



この方法は少し信頌できたせん。 ブラりザのキャッシュはCookieの保存堎所に盎接関係しないため、どちらか䞡方ではないが削陀されるず、この方法によりフォントのダりンロヌドがブロックされる可胜性がありたす。



SSIを䜿甚した最も単玔なコヌドは次のようになりたす。



 <!--#if expr="$HTTP_COOKIE=/webfont-loaded=true/" --> <html lang="en" class="webfont-loaded"> <!--#else --> <html lang="en"> <!--#endif -->
      
      







localStorageの䜿甚 Smashing Magazineがサむトで䜿甚するこのバヌゞョンのコヌドを利甚できたす。



localStorageはかなりうたく機胜するずいう事実にもかかわらず、その䜿甚はネむティブキャッシュを䜿甚するよりも若干遅くなる可胜性があり、さらに重芁なこずには、ナヌザヌのディスクのスペヌスを占有し、1぀のドメむンのみに察しお䜜成されるこずを考慮する䟡倀がありたす。 したがっお、ナヌザヌが同じWebフォントを䜿甚しお別のサむトにアクセスするず、UAはそれを再床ダりンロヌドしたす。



次は



ここ数か月ず数幎で芋おきたように、Webフォントの䜿甚方法は垞に倉化しおいたす。 ブラりザはFont Load Eventsを䜿甚し、CSSプロパティを䜿甚しおFOITを操䜜できたす。 最終的に、フォントレンダリング、フォントレンダリングスワップは、この蚘事で説明したすべおを倧幅に簡玠化できたす。



いく぀かのスタむルや圩床オプションを削陀しお数バむトを節玄したい堎合、人工フォントが蚱可されおいおフォント合成がない堎合は、ブラりザヌの動䜜をカスタマむズしおみおください。









All Articles