¿Precargar fuentes @font-face?


¿Es posible precargar o almacenar en caché las fuentes @font-face, muy probablemente con javascript, antes de que se cargue la página para que no reciba ese feo salto cuando la página finalmente se cargue?

Author: Gabriel Hurley, 2009-08-26

11 answers

No conozco ninguna técnica actual para evitar el parpadeo a medida que se carga la fuente, sin embargo, puede minimizarlo enviando encabezados de caché adecuados para su fuente y asegurándose de que esa solicitud se realice lo más rápido posible.

 1
Author: Gabriel Hurley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-08-25 20:43:31

Una técnica simple es poner esto en algún lugar de su índice:

<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>

Probado en Chrome 34, Safari 7 y FF 29 e IE 11

 26
Author: Rafouille,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-16 14:48:40

Hay algunas técnicas para" precarga " aquí: http://paulirish.com/2009/fighting-the-font-face-fout /

Principalmente engañando al navegador para que descargue el archivo lo más rápido posible..

También puede entregarlo como un uri de datos, lo que ayuda mucho. y también puedes ocultar el contenido de la página y mostrarlo cuando esté listo.

 22
Author: Paul Irish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-24 18:19:09

2017: Ahora tienes precarga

MDN: El valor de precarga del atributo rel del elemento le permite escribir solicitudes de recuperación declarativas en su HTML, especificando recursos que sus páginas necesitarán muy pronto después de la carga, que usted por lo tanto, desea comenzar a precarga temprano en el ciclo de vida de una página cargar, antes de que la maquinaria de renderizado principal del navegador entre en funcionamiento. Este asegura que se ponen a disposición antes y son menos propensos a bloquear la página primer renderizado, lo que lleva a mejoras de rendimiento.

<link rel="preload" href="/fonts/myfont.eot" as="font" crossorigin="anonymous" />

Compruebe la compatibilidad del navegador.

Es más útil para la precarga de fuentes (sin esperar a que el navegador la encuentre en algún CSS). También puede precarga algunos logotipos, iconos y scripts.

Otras técnicas pro/cons se discuten aquí (no es mi blog).

 9
Author: Christophe Roussy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-05 12:23:34

La carga previa de la fuente adecuada es un gran agujero en la especificación HTML5. He pasado por todo esto y la solución más confiable que he encontrado es usar la fuente.js:

Http://pomax.nihongoresources.com/pages/Font.js /

Puede usarlo para cargar fuentes utilizando la misma API que usa para cargar imágenes

var anyFont = new Font();
anyFont.src = "fonts/fileName.otf";
anyFont.onload = function () {
  console.log("font loaded");
}

Es mucho más simple y más ligero que El enorme cargador Webfont de Google

Aquí está el repositorio de github para Letra.js:

Https://github.com/Pomax/Font.js

 5
Author: d13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-13 20:29:58

Esto debería resolver su problema.

Para responder a tu pregunta inicial: sí puedes. Solo los navegadores Gecko y WebKit lo soportan actualmente.
Solo necesita agregar etiquetas de enlace en su cabeza:

<link rel="prefetch" href="pathto/font">
<link rel="prerender" href="pathto/page">
 3
Author: Knu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-06 04:31:44

Hice esto agregando alguna letra en mi documento principal y lo hice transparente y asigné la fuente que quería cargar.

Por ejemplo

<p>normal text from within page here and then followed by:
<span style="font-family:'Arial Rounded Bold'; color:transparent;">t</span>
</p>
 2
Author: Trent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-14 03:35:37

A través de Google webfontloader

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
        }
    }
});
 1
Author: Razan Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-24 03:53:05

Recientemente estaba trabajando en un juego compatible con CocoonJS con DOM limitado al elemento canvas-aquí está mi enfoque:

El uso de fillText con una fuente que aún no se ha cargado se ejecutará correctamente, pero sin retroalimentación visual - por lo que el plano del lienzo permanecerá intacto - todo lo que tiene que hacer es comprobar periódicamente el lienzo para cualquier cambio (por ejemplo, bucear a través de getImageData buscando cualquier píxel no transparente) que ocurrirá cuando la fuente se cargue correctamente.

I he explicado esta técnica un poco más en mi reciente artículo http://rezoner.net/preloading-font-face-using-canvas,686

 0
Author: rezoner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-03 19:04:46

Google tiene una buena biblioteca para esto: https://developers.google.com/webfonts/docs/webfont_loader Puedes usar casi cualquier tipo de letra y la lib agregará clases a la etiqueta html.

¡Incluso te da eventos de javascript cuando las fuentes certrain están cargadas y activas!

No se olvide de servir sus archivos de fuentes gzipped! sin duda va a acelerar las cosas!

 0
Author: Miguel Alejandro Fuentes Lopez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 13:30:53

Utilice la API de carga de fuentes CSS estándar .

Espere a que (all) se carguen las fuentes y luego muestre su contenido:

document.fonts.ready.then((fontFaceSet) => {
    console.log(fontFaceSet.size, 'FontFaces loaded.');
    document.getElementById('waitScreen').style.display = 'none';
});

CodePen de demostración.

 0
Author: yPhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-19 10:00:51