Чи можна попередньо завантажити або кешувати шрифти @ font-face, швидше за все, за допомогою javascript, перед завантаженням сторінки, щоб ви не отримали такого потворного стрибка, коли сторінка нарешті завантажиться?
Чи можна попередньо завантажити або кешувати шрифти @ font-face, швидше за все, за допомогою javascript, перед завантаженням сторінки, щоб ви не отримали такого потворного стрибка, коли сторінка нарешті завантажиться?
Відповіді:
Зверніться до цієї оновленої відповіді: https://stackoverflow.com/a/46830425/4031815
Я не знаю жодної поточної техніки, щоб уникнути мерехтіння під час завантаження шрифту, однак ви можете звести це до мінімуму, надіславши належні заголовки кешу для вашого шрифту та переконавшись, що цей запит пройде якомога швидше.
З 2017 року у вас є попереднє завантаження
MDN: Значення попереднього завантаження атрибута rel елемента дозволяє вам писати декларативні запити на отримання у вашому HTML, вказуючи ресурси, які вашим сторінкам знадобляться дуже скоро після завантаження, і тому ви хочете розпочати попереднє завантаження на початку життєвого циклу завантаження сторінки, до вмикається основний механізм візуалізації браузера. Це гарантує, що вони будуть доступні раніше і з меншою ймовірністю заблокують перший візуалізацію сторінки, що призведе до підвищення продуктивності.
<link rel="preload" href="/fonts/myfont.eot" as="font" crossorigin="anonymous" />
Завжди перевіряйте сумісність браузера .
Це найбільш корисно для попередньої завантаження шрифтів (не чекаючи, поки браузер знайде його в якомусь CSS). Ви також можете попередньо завантажити деякі логотипи, піктограми та сценарії.
crossorigin
потрібно, навіть якщо шрифт завантажено з того самого джерела . Також добре надати підказку типу.
Простий прийом - помістити це десь у свій індекс:
<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, що дуже допомагає. а також ви можете приховати вміст сторінки та показати його, коли він буде готовий.
Ваша голова повинна включати попередньо навантажений рел наступним чином:
<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');
}
Правильне попереднє завантаження шрифту - це велика діра в специфікації 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
Ось репозиторій github для Font.js:
Через веб- завантажувач 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
}
}
});
Це має вирішити вашу проблему.
Щоб відповісти на ваше початкове запитання: так, ви можете . Наразі його підтримують лише браузери Gecko та WebKit.
Вам просто потрібно додати теги посилань у вашій голові:
<link rel="prefetch" href="pathto/font">
<link rel="prerender" href="pathto/page">
prerender
і ні preload
? це шрифт, а не HTML-файл, тут нічого не можна відобразити
Як я виявив, найкращий спосіб зробити це попередньо завантажити таблицю стилів, яка містить шрифт шрифту, а потім дозволити браузеру завантажувати його автоматично. Я використовував шрифт-грань в інших місцях (на сторінці 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, і тому ви не бачите ефекту зміни шрифту.
Використовуйте стандартний API завантаження шрифтів CSS .
Зачекайте, поки завантажаться ( усі ) шрифти, а потім покажіть свій вміст:
document.fonts.ready.then((fontFaceSet) => {
console.log(fontFaceSet.size, 'FontFaces loaded.');
document.getElementById('waitScreen').style.display = 'none';
});
font-display
: font-display
Нещодавно я працював над грою, сумісною з CocoonJS з DOM, обмеженим елементом canvas - ось мій підхід:
Використання fillText із шрифтом, який ще не завантажений, буде виконуватися належним чином, але без візуального зворотного зв’язку - так що площина полотна залишатиметься цілою - все, що вам потрібно зробити, - це періодично перевіряти полотно на наявність будь-яких змін (наприклад, перегляд циклу через getImageData для пошуку будь-якого непрозорий піксель), що відбудеться, коли шрифт завантажиться належним чином.
Я трохи більше пояснив цю техніку у своїй нещодавній статті http://rezoner.net/preloading-font-face-using-canvas,686
У Google є для цього приємна бібліотека: https://developers.google.com/webfonts/docs/webfont_loader Ви можете використовувати майже будь-які шрифти, і lib додасть класи до тегу html.
Це навіть надає вам події JavaScript, коли шрифти certrain завантажені та активні!
Не забудьте подати свої шрифтові файли у стислій формі! це, безумовно, пришвидшить справу!