2020-12-05

How I (almost) fixed my fonts

This site goes through CSS changes daily. Yes, daily. I can’t stop changing the CSS. It’s gotten to the point where I focus more on the CSS of this site than, evidently, writing posts for it.

I like web fonts. But I also like simplicity and straightforwardness. Sadly, getting webfonts and CSS to work together flawlessly is no simple task.

Google Fonts

At first I just used Google Fonts: click, click, right click, copy, paste @import URL. Done. Fixed. …or so I thought.

Using Google fonts has the unfortunate side-effect that I now depend on a 3rd-party CDN for my site to look nice. That CDN is obviously Google - that’s not ideal for me.

Self-hosting Google Fonts

So I decided to just host the fonts on this webserver. I came across this gem: google-webfonts-helper. You choose your Google fonts, it generates a zip file containing the font files, and some CSS to put on your page. Perfect! …or so I thought.

Inline stylesheets

Wait. Now my fonts flash for a second. Oh, this is the fabled FOUT I’ve been hearing about. Google Fonts didn’t seem to have this issue, though I suppose their server is far more responsive than mine, and they do some CDN tricks or something. Here’s a CSS-Tricks article I read: https://css-tricks.com/how-to-load-fonts-in-a-way-that-fights-fout-and-makes-lighthouse-happy/. I don’t recall whether it helped me in this endeavour or not since the solution requires JavaScript (eugh).

I decided to just inline the stylesheet to fetch the fonts and apply them since it took the browser a bit extra to download styles.css and since the fonts would be loaded with the webpage it shouldn’t look to bad. I added font-display: fallback for some extra peace of mind.

@font-face {
	font-family: 'Charter Regular';
	font-style: normal;
	font-weight: normal;
	font-display: fallback;
	src: local('Charter Regular'),          local('Charter-Regular'),
	     url('/fonts/charter_regular.woff') format('woff'),     /* Modern Browsers */
	     url('/fonts/charter_regular.ttf')  format('truetype'); /* Safari, Android, iOS */
}

@font-face {
	font-family: 'Charter Regular';
	font-style: normal;
	font-weight: bold;
	font-display: fallback;
	src: local('Charter Bold'),          local('Charter-Bold'),
	     url('/fonts/charter_bold.woff') format('woff'),     /* Modern Browsers */
	     url('/fonts/charter_bold.ttf')  format('truetype'); /* Safari, Android, iOS */
}

html, body {
	font-family: "Charter Regular", "Times New Roman", serif;
}

This still didn’t give the desired result. There were still weird loading times and odd font flashes.

The fix (sort of… not really)

I give up.

html, body {
	font-family: sans-serif;
}

Chances are whenever you’re reading this the site has already been changed to reflect this change.
Sans-serif looks better for this site anyways :P