Ist es möglich, @ font-face-Schriftarten vorzuladen oder auf andere Weise zwischenzuspeichern, höchstwahrscheinlich mit Javascript, bevor die Seite geladen wird, damit Sie diesen hässlichen Sprung nicht bekommen, wenn die Seite endlich geladen wird?
Ist es möglich, @ font-face-Schriftarten vorzuladen oder auf andere Weise zwischenzuspeichern, höchstwahrscheinlich mit Javascript, bevor die Seite geladen wird, damit Sie diesen hässlichen Sprung nicht bekommen, wenn die Seite endlich geladen wird?
Antworten:
Mir ist keine aktuelle Technik bekannt, mit der das Flimmern beim Laden der Schriftart vermieden werden kann. Sie können sie jedoch minimieren, indem Sie die richtigen Cache-Header für Ihre Schriftart senden und sicherstellen, dass diese Anforderung so schnell wie möglich ausgeführt wird.
Seit 2017 hast du Vorspannung
MDN: Mit dem Preload-Wert des rel-Attributs des Elements können Sie deklarative Abrufanforderungen in Ihren HTML-Code schreiben und Ressourcen angeben, die Ihre Seiten sehr bald nach dem Laden benötigen. Sie möchten daher frühzeitig im Lebenszyklus eines Seitenladens mit dem Preload beginnen Die Haupt-Rendering-Maschinerie des Browsers wird aktiviert. Dadurch wird sichergestellt, dass sie früher verfügbar gemacht werden und das erste Rendern der Seite mit geringerer Wahrscheinlichkeit blockiert wird, was zu Leistungsverbesserungen führt.
<link rel="preload" href="/fonts/myfont.eot" as="font" crossorigin="anonymous" />
Überprüfen Sie immer die Browserkompatibilität .
Es ist am nützlichsten für das Vorladen von Schriftarten (ohne darauf zu warten, dass der Browser es in einigen CSS findet). Sie können auch einige Logos, Symbole und Skripte vorladen.
crossorigin
ist auch dann erforderlich, wenn die Schriftart vom selben Ursprung geladen wird . Auch gut, um einen Typ-Hinweis zu geben.
Eine einfache Technik besteht darin, dies irgendwo in Ihren Index aufzunehmen:
<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>
Getestet auf Chrome 34, Safari 7 und FF 29 und IE 11
Hier gibt es einige Techniken zum "Vorladen": http://paulirish.com/2009/fighting-the-font-face-fout/
Meistens den Browser dazu bringen, die Datei so schnell wie möglich herunterzuladen.
Sie können es auch als Daten-Uri liefern, was sehr hilfreich ist. Außerdem können Sie den Seiteninhalt ausblenden und anzeigen, wenn er fertig ist.
Ihr Kopf sollte die Vorspannung rel wie folgt enthalten:
<head>
...
<link rel="preload" as="font" href="/somefolder/font-one.woff2">
<link rel="preload" as="font" href="/somefolder/font-two.woff2">
</head>
Auf diese Weise wird woff2 von Browsern vorinstalliert, die das Vorladen unterstützen, und alle Fallback-Formate werden wie gewohnt geladen.
Und Ihre CSS-Schriftart sollte ähnlich aussehen
@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');
}
Das richtige Vorladen von Schriftarten ist eine große Lücke in der HTML5-Spezifikation. Ich habe all diese Dinge durchgearbeitet und die zuverlässigste Lösung, die ich gefunden habe, ist die Verwendung von Font.js:
http://pomax.nihongoresources.com/pages/Font.js/
Sie können damit Schriftarten mit derselben API laden, mit der Sie Bilder laden
var anyFont = new Font();
anyFont.src = "fonts/fileName.otf";
anyFont.onload = function () {
console.log("font loaded");
}
Es ist viel einfacher und leichter als Googles riesiger Webfont Loader
Hier ist das Github-Repo für Font.js:
Über den Webfontloader von 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
}
}
});
Dies sollte Ihr Problem lösen.
Um Ihre erste Frage zu beantworten: Ja, das können Sie . Derzeit wird dies jedoch nur von Gecko- und WebKit-Browsern unterstützt.
Sie müssen nur Link-Tags in Ihrem Kopf hinzufügen:
<link rel="prefetch" href="pathto/font">
<link rel="prerender" href="pathto/page">
prerender
nicht preload
? Es ist eine Schriftart, keine HTML-Datei, es gibt nichts zu rendern
Verwenden Sie die Standard- API zum Laden von CSS-Schriftarten .
Warten Sie, bis ( alle ) Schriftarten geladen sind, und zeigen Sie dann Ihren Inhalt an:
document.fonts.ready.then((fontFaceSet) => {
console.log(fontFaceSet.size, 'FontFaces loaded.');
document.getElementById('waitScreen').style.display = 'none';
});
font-display
: font-display
Wie ich festgestellt habe, ist es am besten, ein Stylesheet vorzuladen, das die Schriftart enthält, und es dann vom Browser automatisch laden zu lassen. Ich habe das Schriftbild an anderen Stellen (auf der HTML-Seite) verwendet, aber dann konnte ich den Effekt des Schriftwechsels kurz beobachten.
<link href="fonts.css?family=Open+Sans" rel="preload stylesheet" as="style">
Geben Sie dann in der Datei font.css Folgendes an.
@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 */
}
Sie können Schriftarten keinen Namen zuweisen, wenn sie über das Link-Tag vorinstalliert sind (korrigieren Sie mich, wenn ich falsch lag, konnte ich noch keinen Weg finden). Daher müssen Sie Schriftart verwenden, um der Schrift den Namen zuzuweisen. Obwohl es möglich ist, eine Schriftart über ein Link-Tag zu laden, wird dies nicht empfohlen, da Sie der Schriftart damit keinen Namen zuweisen können. Ohne einen Namen wie bei font-face können Sie ihn nirgendwo auf der Webseite verwenden. Laut gtmetrix wird das Stylesheet am Anfang geladen, dann die restlichen Skripte / Stile nach Reihenfolge, dann die Schriftart vor dem Laden von dom, und daher sehen Sie keinen Effekt zum Ändern der Schriftart.
Kürzlich habe ich an einem Spiel gearbeitet, das mit CocoonJS kompatibel ist, wobei DOM auf das Canvas-Element beschränkt ist - hier ist mein Ansatz:
Die Verwendung von fillText mit einer Schriftart, die noch nicht geladen wurde, wird ordnungsgemäß ausgeführt, jedoch ohne visuelles Feedback. Die Canvas-Ebene bleibt also intakt. Sie müssen lediglich den Canvas-Bereich regelmäßig auf Änderungen überprüfen (z. B. eine Schleife durch getImageData, um nach Änderungen zu suchen (nicht transparentes Pixel), das auftritt, wenn die Schriftart ordnungsgemäß geladen wird.
Ich habe diese Technik in meinem letzten Artikel http://rezoner.net/preloading-font-face-using-canvas,686 etwas näher erläutert
Google hat dafür eine schöne Bibliothek: https://developers.google.com/webfonts/docs/webfont_loader Sie können fast alle Schriftarten verwenden und die Bibliothek fügt dem HTML-Tag Klassen hinzu.
Es gibt Ihnen sogar Javascript-Ereignisse, wenn bestimmte Schriftarten geladen und aktiv sind!
Vergessen Sie nicht, Ihre gezippten Schriftdateien zu bedienen! es wird sicherlich die Dinge beschleunigen!