Дмитрий Рычков, 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-active
wf-opensans-n7-active
wf-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