Предварительная загрузка шрифтов @font-face?
-
19-09-2019 - |
Вопрос
Можно ли предварительно загрузить или иным образом кэшировать шрифты @font-face, скорее всего, с помощью javascript, перед загрузкой страницы, чтобы не получить этот уродливый скачок, когда страница наконец загрузится?
Решение
Мне не известен какой-либо текущий способ избежать мерцания при загрузке шрифта, однако вы можете свести его к минимуму, отправив правильные заголовки кэша для вашего шрифта и убедившись, что этот запрос выполняется как можно быстрее.
Другие советы
Простой метод — поместить это где-нибудь в ваш индекс:
<div class="font_preload" style="opacity: 0">
<span style="font-family: 'myfontface#1font-family', Arial, sans-serif;"></span>
<span style="font-family: 'myfontface#2font-family', Arial, sans-serif;"></span>
...
</div>
Протестировано на Chrome 34, Safari 7, FF 29 и IE 11.
Здесь есть несколько методов «предзагрузки»:http://paulirish.com/2009/fighting-the-font-face-fout/
В основном обманом заставляет браузер загрузить файл как можно быстрее.
Вы также можете доставить его как data-uri, что очень помогает.а также вы можете скрыть содержимое страницы и показать его, когда оно будет готово.
2017:Теперь у вас есть предварительная загрузка
МДН:Значение предварительной нагрузки атрибута Element REL позволяет вам писать декларативные запросы избрать в свой HTML, указав ресурсы, которые ваши страницы потребуют очень скоро после загрузки, что вы хотите начать предварительно загружать в начале жизненного цикла нагрузки страницы, до браузера Основная рендеринг -механизм начинается.Это гарантирует, что они становятся доступными ранее и с меньшей вероятностью заблокируют первое рендеринг страницы, что приводит к улучшению производительности.
<link rel="preload" href="/fonts/myfont.eot" as="font" crossorigin="anonymous" />
Проверять совместимость браузера.
Это наиболее полезно для предварительной загрузки шрифта (не дожидаясь, пока браузер найдет его в CSS).Вы также можете предварительно загрузить некоторые логотипы, значки и скрипты.
Обсуждаются плюсы и минусы других методов. здесь (не мой блог).
Правильная предварительная загрузка шрифтов — это большая дыра в спецификации HTML5.Я прошел через все это, и самое надежное решение, которое я нашел, — использовать Font.js:
http://pomax.nihongoresources.com/pages/Font.js/
Вы можете использовать его для загрузки шрифтов, используя тот же API, который вы используете для загрузки изображений.
var anyFont = new Font();
anyFont.src = "fonts/fileName.otf";
anyFont.onload = function () {
console.log("font loaded");
}
Это намного проще и легче, чем Огромный загрузчик веб-шрифтов от Google
Вот репозиторий Font.js на Github:
Этот должно решить вашу проблему.
Чтобы ответить на ваш первоначальный вопрос: Да, ты можешь.Однако в настоящее время его поддерживают только браузеры Gecko и WebKit.
Вам просто нужно добавить теги ссылок в голове:
<link rel="prefetch" href="pathto/font">
<link rel="prerender" href="pathto/page">
Через Google веб-шрифтлоадер
var fontDownloadCount = 0;
WebFont.load({
custom: {
families: ['fontfamily1', 'fontfamily2']
},
fontinactive: function() {
fontDownloadCount++;
if (fontDownloadCount == 2) {
// all fonts have been loaded and now you can do what you want
}
}
});
Я сделал это, добавив букву в свой основной документ, сделав его прозрачным и назначив шрифт, который я хотел загрузить.
например
<p>normal text from within page here and then followed by:
<span style="font-family:'Arial Rounded Bold'; color:transparent;">t</span>
</p>
Используйте стандарт API загрузки шрифтов CSS.
Ждать (все) шрифты для загрузки, а затем покажите свой контент:
document.fonts.ready.then((fontFaceSet) => {
console.log(fontFaceSet.size, 'FontFaces loaded.');
document.getElementById('waitScreen').style.display = 'none';
});
Недавно я работал над игрой, совместимой с CocoonJS, с DOM, ограниченным элементом холста. Вот мой подход:
Использование fillText со шрифтом, который еще не загружен, будет выполняться правильно, но без визуальной обратной связи — поэтому плоскость холста останется нетронутой — все, что вам нужно делать, — это периодически проверять холст на наличие каких-либо изменений (например, прокручивая getImageData в поисках любых непрозрачный пиксель), что произойдет, если шрифт загрузится правильно.
Я объяснил эту технику немного подробнее в своей недавней статье. http://rezoner.net/preloading-font-face-using-canvas,686
У Google есть хорошая библиотека для этого: https://developers.google.com/webfonts/docs/webfont_loaderВы можете использовать практически любые шрифты, и библиотека добавит классы в тег html.
Он даже выдает вам события javascript, когда определенные шрифты загружаются и активны!
Не забудьте сохранить файлы шрифтов в сжатом виде!это, безусловно, ускорит процесс!
Как я обнаружил, лучший способ — это предварительно загрузить таблицу стилей, содержащую шрифт, а затем позволить браузеру загрузить ее автоматически.Я использовал шрифт в других местах (на html-странице), но затем я мог кратко наблюдать эффект изменения шрифта.
<link href="fonts.css?family=Open+Sans" rel="preload stylesheet" as="style">
затем в файле font.css укажите следующее.
@font-face {
font-family: 'Open Sans';
font-style: normal;
font-weight: 400;
src: local('Open Sans Regular'), local('OpenSans-Regular'),
url('open-sans-v16-latin-regular.woff2') format('woff2'); /* Super Modern Browsers */
}
Вы не можете присвоить имя шрифту, если он предварительно загружен через тег ссылки (поправьте меня, если я ошибаюсь, я пока не нашел способа), и поэтому вам придется использовать font-face, чтобы присвоить имя шрифту.Несмотря на то, что шрифт можно загрузить через тег ссылки, это не рекомендуется, поскольку с его помощью нельзя присвоить имя шрифту.Без имени, как в случае со шрифтом-face, вы не сможете использовать его где-либо на веб-странице.Согласно gtmetrix, таблица стилей загружается вначале, затем остальные скрипты/стили по порядку, затем загружается шрифт перед dom, и поэтому вы не видите эффекта изменения шрифта.
Ваша голова должна включать предварительную нагрузку следующим образом:
<head>
...
<link rel="preload" as="font" href="/somefolder/font-one.woff2">
<link rel="preload" as="font" href="/somefolder/font-two.woff2">
</head>
Таким образом, woff2 будет предварительно загружен браузерами, поддерживающими предварительную загрузку, и все резервные форматы будут загружаться как обычно.
И ваш шрифт CSS должен выглядеть примерно так:
@font-face {
font-family: FontOne;
src: url(../somefolder/font-one.eot);
src: url(../somefolder/font-one.eot?#iefix) format('embedded-opentype'),
url(../somefolder/font-one.woff2) format('woff2'), //Will be preloaded
url(../somefolder/font-one.woff) format('woff'),
url(../somefolder/font-one.ttf) format('truetype'),
url(../somefolder/font-one.svg#svgFontName) format('svg');
}
@font-face {
font-family: FontTwo;
src: url(../somefolder/font-two.eot);
src: url(../somefolder/font-two.eot?#iefix) format('embedded-opentype'),
url(../somefolder/font-two.woff2) format('woff2'), //Will be preloaded
url(../somefolder/font-two.woff) format('woff'),
url(../somefolder/font-two.ttf) format('truetype'),
url(../somefolder/font-two.svg#svgFontName) format('svg');
}