Avoid flash of invisible text
This code lab shows you how to display text immediately using Font Face Observer.
Add Font Face Observer #
Font Face Observer is a script
that detects when a font loads. The
fontfaceobserver.js
file has already been saved to the project directory, so you don't need to add it
separately. However, you do need to add a script tag for it.
- Click Remix to Edit to make the project editable.
- Add a script tag for
fontfaceobserver.jstoindex.html:
<div class="text">Some text.</div>
<script src="fontfaceobserver.js" type="text/javascript"></script>
</body>
Use Font Face Observer #
Create Observers #
Create an observer for each font family that it is used on the page.
- Add the following script after the
fontfaceobserver.jsscript. This creates observers for the "Pacifico" and "Roboto" font families:
<script src="fontfaceobserver.js" type="text/javascript"></script>
<script type="text/javascript">
const pacificoObserver = new FontFaceObserver('Pacifico');
const robotoObserver = new FontFaceObserver('Roboto');
</script>
<body>
If you're ever unsure what font face observers you need to create, just look for
the font-family declarations in your CSS. Pass the font-family name of these declarations to
FontFaceObserver(). There is no need to create a font observer for
fallback fonts.
For example, if your CSS was:
font-family: "Times New Roman", Times, serif;
you would add FontFaceObserver('Times New Roman'). Times and serif are
fallback fonts, so you would not need to declare FontFaceObservers for them.
Detect font load #
The code for detecting a font load looks like this:
robotoObserver.load().then(function(){
console.log("Hooray! Font loaded.");
});
robotoObserver.load() is a promise that resolves when the font loads.
The demo site uses two different fonts, so you need to use Promise.all()
to wait until both fonts have loaded.
- Add this promise to your script, right below the FontFaceObservers that you just declared:
Promise.all([
pacificoObserver.load(),
robotoObserver.load()
]).then(function(){
/* Do things */
});
✔️Check-in #
Your script should now look like this:
<script type="text/javascript">
const pacificoObserver = new FontFaceObserver('Pacifico');
const robotoObserver = new FontFaceObserver('Roboto');
Promise.all([
pacificoObserver.load(),
robotoObserver.load()
]).then(function(){
/* Do things */
});
</script>
Apply fonts-loaded class #
- Replace the
/* Do things */comment in the script with this line:
document.documentElement.classList.add("fonts-loaded");
This adds the fonts-loaded class to the document's root element (the
<html> tag) once both fonts have loaded.
✔️Check-in #
Your completed script should look like this:
<script type="text/javascript">
const pacificoObserver = new FontFaceObserver('Pacifico');
const robotoObserver = new FontFaceObserver('Roboto');
Promise.all([
pacificoObserver.load(),
robotoObserver.load()
]).then(function(){
document.documentElement.className += " fonts-loaded";
});
</script>
Update CSS #
Your page should be styled to use a system font initially and custom fonts once
the fonts-loaded class has been applied.
- Update the CSS:
.header {
html.fonts-loaded .header {
font-family: 'Pacifico', cursive;
}
.text
html.fonts-loaded .text {
font-family: 'Roboto', sans-serif;
}
Verify #
- To preview the site, press View App. Then press
Fullscreen
.
If the page looks like this, then you've successfully implemented Font Face Observer and gotten rid of the "Flash of Invisible Text."