Недавний метод, который, кажется, набирает популярность в последнее время, заключается в использовании метода, называемого поднабором, для уменьшения размера веб-шрифтов, кодирования их в base64 и хранения в локальном хранилище. Веб-шрифты, если их не использовать осторожно, могут сильно снизить производительность и заблокировать доступ к контенту вашего сайта.
Этот метод позволит вам уменьшить размер файлов шрифтов и асинхронно хранить их в локальном хранилище, показывая резервный системный шрифт во время загрузки ваших шрифтов. Это, наряду с некоторыми функциями, присущими локальному хранилищу, позволяет постоянно кэшировать ваши шрифты. Это означает, что они будут оставаться на компьютере клиента, сохраняться в течение сеансов и даже при перезапуске устройства.
Подмножество ваших шрифтов
Поднабор шрифтов — одна из самых важных вещей, которую вы можете сделать, чтобы улучшить производительность веб-шрифтов. Поднабор — это не что иное, как удаление неиспользуемых символов из файлов шрифтов. Неиспользуемые символы — это, как правило, символы из языков, которые вы не используете, или специальные символы, которые могут не понадобиться вашему веб-сайту или приложению, но часто включаются в файлы шрифтов. Поднастроив, вы можете уменьшить размер файла до 50%.
Вы можете использовать веб-генератор шрифтов Font Squirrel для подмножества и base64-кодирования ваших шрифтов в один конечный файл (не забудьте выбрать экспертную опцию для доступа к пользовательским подмножествам и выберите «Base64-кодировать» в разделе «CSS» формы).
Когда вы закончите, вы получите в одном файле таблицы стилей все ваши веб-шрифты, сжатые и готовые для последующего использования с одним запросом.
Выбор запасного шрифта
Чтобы пользователи не ждали, пока браузер попытается загрузить файл шрифта, рекомендуется показывать пользователю запасной системный шрифт. Это обеспечивает немедленный доступ к контенту (это то, к чему они приходят в конце концов).
Синхронная загрузка шрифта оставит текст пустым, пока браузер ожидает файл шрифта, и пользователь не сможет прочитать содержимое в ожидании завершения загрузки файла.
При асинхронной загрузке и хорошем выборе резервного шрифта пользователь сразу увидит текст, отображаемый в резервном шрифте, и шрифт переключится на выбранный вами веб-шрифт при загрузке файла.
Ваш резервный шрифт может быть стилизован, чтобы сделать этот переход более мягким, уменьшая переформатирование контента. Поскольку пользователь имеет доступ к вашему контенту без промедления, это является немедленным улучшением воспринимаемой производительности вашего сайта или приложения.
Чтобы узнать системные шрифты, доступные для разных ОС, вы можете проверить следующие источники:
- CSS Font Stack — полная коллекция веб-безопасных стеков шрифтов CSS для Mac и Windows.
- Шрифты iOS — перечисляет каждый шрифт для каждой версии iOS.
На Android сложнее сказать, какие системные шрифты используются из-за количества вилок и разных брендов, которые его используют. Однако наиболее распространенными шрифтами на Android являются: Droid Serif, Droid Sans, Droid Mono и Roboto.
Использование локального хранилища для сохранения веб-шрифтов
Сначала давайте добавим класс в узел <html>
Используя JavaScript, это позже будет заменено классом, который имеет стили загруженного шрифта. Мы также сохраним путь, указывающий на файл шрифта, в переменную для последующего повторного использования.
document.documentElement.className = 'fallback';
var css_href = '../path/fonts.css';
Затем нам нужно проверить поддержку локального хранилища, пытаясь установить и поместить элемент в локальное хранилище. Некоторые браузеры не могут хранить что-либо в приватном режиме, но window.localStorage
Нам нужен этот дополнительный запрос, чтобы убедиться, что наш скрипт будет работать правильно:
var localStorageSupported = function() {
try {
localStorage.setItem('test', 'test');
localStorage.removeItem('test');
return true;
} catch(e) {
return false;
}
}
Если браузер localStorageSupported
style
injectRawStyle()
injectFontsStylesheet()
Если браузер не проходит тест, мы вызываем onLoad
if (localStorageSupported() && localStorage.webFonts) {
injectRawStyle(localStorage.webFonts);
} else {
window.onload = function() {
injectFontsStylesheet();
}
}
injectFontsStylesheet()
Функция xhr
injectRawStyle
function injectFontsStylesheet() {
var xhr = new XMLHttpRequest();
xhr.open('GET', css_href, true);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
injectRawStyle(xhr.responseText);
localStorage.webFonts = xhr.responseText;
}
xhr.send();
}
}
style
Это функция, которая создает тег head
text
Также на этом этапе мы заменяем резервный класс классом шрифтов, который имеет стили веб-шрифтов:
function injectRawStyle(text) {
var style = document.createElement('style');
style.innerHTML = text;
document.getElementsByTagName('head')[0].appendChild(style);
document.documentElement.className = 'webFont';
}
Теперь нам нужны реальные стили для отступления и веб-шрифт. Вы можете проверить эти стили, обновив свой браузер и наблюдая за перекомпоновкой контента. Цель состоит в том, чтобы максимально приблизить стили резервных шрифтов к реальным стилям, чтобы восприятие изменений стало практически незаметным.
.fallback {
font-family: Verdana, sans-serif;
line-height: 1.58em;
letter-spacing: 0px;
font-size: 9px;
}
.webFont {
font-family: 'Proxima-Nova', sans-serif;
line-height: 1.3em;
letter-spacing: 2px;
font-size: 13px;
}
Демо и подведение итогов
Если вы хотите взглянуть на код, вы можете просмотреть панель JavaScript в CodePen ниже.
Обратите внимание, что демонстрационная версия использует внешний CodePen в качестве исходного CSS, как описано в блоге CodePen .
Благодаря этому решению вы теперь можете асинхронно хранить свои шрифты в локальном хранилище, обеспечивая при этом хороший и надежный резервный шрифт.
Вы можете продолжать экспериментировать с этой техникой, пытаясь улучшить внешний вид резервного шрифта, чтобы он соответствовал выбранному вами веб-шрифту, или вы можете попытаться повторно использовать этот сценарий для других ресурсов, таких как файлы CSS или JavaScript.