Дмитрий Рычков, Wrike
Дмитрий Рычков
13/04/2016
это одно из важнейших действий для улучшения производительности страницы
FOUT – Flash Of Unstyled Text
FOIT – Flash Of Invisible Text

| отображает текст только после того, как шрифт загружен |
| задерживают отрисовку до 3 сек, после чего используют фолбэк |
| сразу показывает текст с помощью фолбэка, и заново отображает страницу после загрузки шрифта |
при медленном соединении
в первые 3 секунды
при медленном соединении
до тех пор, пока не загрузятся шрифты
ради чего пользователи приходят на ваш сайт
может приводить пользователей в ярость, а вам приносить убытки
Это хорошо, но мало контроля
@font-face {font-family: 'Open Sans';font-display: swap;src: url(...) format('woff2');}
auto | block | swap | fallback | optional
@font-face {font-family: 'Open Sans';font-style: normal;font-weight: 400;src: local('Open Sans'),url(...) format('woff2'),url(...) format('woff');}
Подробнее:
<script src="webfont.js"></script><script>WebFont.load({google: {families: ['Open Sans:400,700:latin']}});</script>
События: loading, active, inactive
<html class="wf-opensans-n4-activewf-opensans-n7-activewf-active">
body {font-family: serif;}.wf-active body {font-family: 'Open Sans', serif;}
FOUT при каждой загрузке страницы
Чтобы этого избежать, сохраняем состояние в куках или сессии
WebFontConfig = {active: function() {sessionStorage.fonts = true;}}
<script>(function() {if (sessionStorage.fonts) {// Fonts cached. Add font class.} else {// No fonts cached.}})();</script>
Шрифты подключаются любым способом
<script src="fontfaceobserver.js"></script><script>var font = new FontFaceObserver('Open Sans', {weight: 400});font.load().then(function () {document.documentElement.classList.add('wf-loaded');});</script>
body {font-family: serif;}.wf-loaded body {font-family: 'Open Sans', serif;}
<style>@font-face {font-family: 'Open Sans';font-weight: 400;font-style: normal;src: url(base64...) format('woff2');}</style>
|
Перед отрисовкой страницы проверяем:
Если всё OK — показываем шрифт не медля При первой загрузке страницы
Если всё OK — показываем шрифт |
opensans.json
{"md5": "font-hash-sum","value": "@font-face{font-family:'Open Sans';src:url(base64) ......}
index.html
<script async>var md5 = 'font-hash-sum';function insertFont(value) {var style = document.createElement('style');style.innerHTML = value;document.head.appendChild(style);}
var cache = window.localStorage.getItem('opensans');if (cache) {insertFont(cache.value);}else {fetch('opensans.json').then(function(response) { return response.json() }.then(function(json) {insertFont(json.value);window.localStorage.setItem('opensans', json.value);}}
Пока не стандарт, но уже поддерживают все те же браузеры, которые поддерживают WOFF2
| Способ | Удобство | Эффективность |
|---|---|---|
| Google Fonts <link> | *** | * |
| Web Font Loader | ** | ** |
| Font Face Observer | ** | *** |
| localstorage | * | *** |
Слайды: corsairdnb.github.io/fonts-slides
Wrike: www.wrike.com