font-feature-settings vs font-variant
We recently did some font feature tweaks at work. For one thing, we changed the appearance of 0 (number zero) to include a slash (like 0), to make it easier to differentiate from capital letter O. I learned a few things in the process that I'd like to share!
Slashed zeros
There are two main ways to configure slashed zeros.
- font-feature-settings: "zero" 1;
- font-variant: slashed-zero;
A prerequisite for this to work is that the font you are using supports slashed zeros.
font-feature-settings
The font-feature-settings property is a bit strange. It accepts one or more font feature tags consisting of 4 ASCII characters. If a tag is followed by 1 or on, that font feature is enabled, and if followed by 0 or off, it's disabled. As mentioned, here's how to enable slashed zeros:
font-feature-settings: "zero" 1;
font-feature-settings: "zero"; works as well—if no value is provided, it defaults to 1.
In the case of slashed zeros, the tag "zero" is clear. But in other cases, it's pretty much gibberish. As an example, can you figure out what font features this enables?
font-feature-settings: "c2sc", "smcp";
Me neither!
The font-feature-settings property is also error-prone, since it sets every font feature that you don't explicitly list to it's default value.
Most font features can also be set with the font-variant property, which does not have the side effect of unsetting unlisted font features. For this reason, it's generally recommended to use font-variant instead of font-feature-settings whenever possible.
So let's explore font-variant instead!
font-variant
The font-variant property is a lot easier to understand compared to font-feature-settings. No 4 ASCII characters here—but rather describing property values! Look at this beauty:
font-variant: slashed-zero;
Super clear!
font-variant is actually a shorthand for these properties:
- font-variant-alternates
- font-variant-caps
- font-variant-east-asian
- font-variant-ligatures
- font-variant-numeric
These longhand properties can be used to target subsets of glyphs. As an example, font-variant-caps only targets capital letters.
In the case of slashed zeros, it will naturally only take effect on numbers. Therefore, it makes sense to use font-variant-numeric that only targets numbers.
font-variant-numeric: slashed-zero;
Conclusion
- Enabling font features can be done in many ways.
- Prefer font-variantoverfont-feature-settings. Considerfont-feature-settingsto be a backup for whenfont-variantcan't do the same thing.
- Prefer being specific with what subsets of glyphs should be targeted instead of using the font-variantshorthand. For example,font-variant-numericonly targets numbers.
References
- https://developer.mozilla.org/en-US/docs/Web/CSS/font-feature-settings
- https://developer.mozilla.org/en-US/docs/Web/CSS/font-variant
- https://developer.mozilla.org/en-US/docs/Web/CSS/font-variant-numeric
- https://pixelambacht.nl/2022/boiled-down-fixing-variable-font-inheritance/
- https://almanac.httparchive.org/en/2022/fonts
