1. Introduction
The CSS Fonts Level 4 specification ([CSS-FONTS-4]) describes the controls CSS provides for selecting and using fonts within documents, including support for variable fonts and color fonts. The ideas here are additions or modifications to the properties and rules defined in CSS Fonts Level 4.
This specification is currently a delta to the CSS Fonts Level 4 specification. Do not assume that if something is not here, it has been dropped.
1.1. Value Definitions
This specification follows the CSS property definition conventions from [CSS2] using the value definition syntax from [CSS-VALUES-3]. Value types not defined in this specification are defined in CSS Values & Units [CSS-VALUES-3]. Combination with other CSS modules may expand the definitions of these value types.
In addition to the property-specific values listed in their definitions, all properties defined in this specification also accept the CSS-wide keywords as their property value. For readability they have not been repeated explicitly.
2. Basic Font Properties
2.1. Font family: the font-family property
2.1.1. Generic font families
In addition to the CSS Fonts 4 § 2.1.3 Generic font families in CSS Fonts Level 4, the following new generic font families are also defined.
- xxx
- Placeholder text for the xxx generic font family.
2.2. Font weight: the font-weight property
2.3. Font style: the font-style property
2.4. Relative sizing: the font-size-adjust property
In only one current engine.
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
In only one current engine.
Opera?EdgeNone
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera Mobile?
Name: | font-size-adjust |
---|---|
Value: | none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | <number> ] |
Initial: | none |
Applies to: | all elements and text |
Inherited: | yes |
Percentages: | N/A |
Computed value: | the keyword none, or a pair of a metric keyword and a <number> |
Canonical order: | per grammar |
Animation type: | discrete if the keywords differ, otherwise by computed value type |
For any given font size, the apparent size and effective legibility of text varies across fonts as a function of their design. For example, for bicameral scripts such as Latin or Cyrillic that distinguish between upper and lowercase letters, the relative height of lowercase letters compared to their uppercase counterparts is a determining factor of legibility. In situations where font fallback occurs, fallback fonts might not share the same ratios as the desired font family for key typographic metrics, and will thus appear to be a different size and possibly be less readable.
The font-size-adjust property provides a way to preserve the readability and apparent size of text when font fallback occurs. It does this by adjusting the used font size so that the specified metric is the same regardless of the font used.
Values have the following meanings:
- none
- No special font-size adjustment is applied.
- ex-height | cap-height | ch-width | ic-width | ic-height
-
Specifies the font metric to normalize,
defaulting to ex-height:
- ex-height
- Normalize the aspect value of the fonts, using the x-height divided by the font size.
- cap-height
- Normalize the cap-height of the fonts, using the cap-height by the font size.
- ch-width
- Normalize the horizontal narrow pitch of the fonts, using the advance width of “0” (ZERO, U+0030) divided by the font size.
- ic-width
- Normalize the horizontal wide pitch of the font, using the advance width of “水” (CJK water ideograph, U+6C34) divided by the font size.
- ic-height
- Normalize the vertical wide pitch of the font, using the advance height of “水” (CJK water ideograph, U+6C34) divided by the font size.
- <number>
-
Each font’s used size is normalized
to match the chosen font metric to
this specified proportion of the computed font-size.
In other words,
for each glyph,
the adjusted font size to use u is calculated as:
u =
( m / m′) swhere:
s = computed
'font-size!!property' value m = metric as specified by the'font-size-adjust' property m′ = metric as specified in the actual font u = adjusted font-size to useNegative values are invalid.
- from-font
- Computes to the <number> corresponding to the specified metric of the first available font.
p{ font-family : Verdana, Futura, Times; } p.adj{ font-size-adjust : 0.545 ; } <p>Lorem ipsum dolor sit amet, ...</p> <p class="adj" >Lorem ipsum dolor sit amet, ...</p>
Verdana has a relatively high aspect value of 0.545, meaning lowercase letters are relatively tall compared to uppercase letters, so at small sizes text appears legible. Times has a lower aspect value of 0.447, and so if fallback occurs, the text will be less legible at small sizes than Verdana unless font-size-adjust is also specified.
Note: For text which uses diacritics, too large an x-height will actually decrease legibility as the diacritics become cramped.
How text rendered in each of these fonts compares is shown below, the columns show text rendered in Verdana, Futura and Times. The same font-size value is used across cells within each row and red lines are included to show the differences in x-height. In the upper half, each row is rendered in the same font-size value. The same is true for the lower half, but in this half the font-size-adjust property is also set to 0.545, so that the actual font size is adjusted to preserve the x-height of Verdana across each row. Note how small text remains relatively legible across each row in the lower half.
The value of font-size-adjust affects the used value of font-size but does not affect the computed value.
Therefore it can affect the size of relative units
that are based on font metrics
such as ex
and ch
but does not affect the size of em
units.
Since numeric values of line-height refer to the computed size of font-size, font-size-adjust also does not affect the used value of line-height.
Note: Since font-size-adjust does not factor into the line-height, specifying a line height too tightly can result in overlapping lines of text. For example, when a fallback font with a low aspect value is normalized to match one with a high aspect value, its ascenders and descenders are likely to extend outside the line box with line-height: 1.
The font-size-adjust adjustment applies to any font that is selected
but in typical usage it would be based
on the corresponding metric value
of the first (most desired) font in the font-family list.
If this is specified accurately,
the
term in the adjustment formula
will resolve to
for the first font
and no adjustment occurs for that font;
and the rest of the fonts will resolve to match.
If the value is specified inaccurately,
text rendered using the first font in the family list
will display differently in older user agents
that don’t support font-size-adjust.
Two spans with borders are used to determine the aspect value of a font. The font-size is the same for both spans but the font-size-adjust property is specified only for the right span. Starting with a value of 0.5, the aspect value can be adjusted until the borders around the two letters line up.
p{ font-family : Futura; font-size : 500 px ; } span{ border : solid1 px red; } .adjust{ font-size-adjust : 0.5 ; } <p><span>b</span><span class="adjust" >b</span></p>
The box on the right is a bit bigger than the one on the left, so the aspect value of this font is something less than 0.5. Adjust the value until the boxes align.
Note: If the specified metric has been overridden in @font-face, e.g. by size-adjust, then the overridden metric will be used in the font-size-adjust calculation. Consequently, applying font-size-adjust and size-adjust together means that size-adjust appears to have no effect.
3. Font Resources
3.1. The @font-face rule
Note: Descriptors are applied per-font rather than per-element. Multiple fonts can be used within an individual element e.g. for characters not supported by the first available font.
3.2. Font reference: the src descriptor
3.2.1. Parsing the src descriptor
The src descriptor value must be parsed according to section CSS Syntax 3 § 5.3.11 Parse a comma-separated list of component values. Then each component value is parsed according to this grammar:
<url>[ format ( <font-format>)] ?[ tech ( <font-tech>#)] ? |local ( <font-face-name>)
<font-format>=[ <string> | collection | embedded-opentype | opentype | svg | truetype | woff | woff2]
<font-tech>=[ <font-features-tech> | <color-font-tech> | variations | palettes | incremental]
<font-features-tech>=[ features-opentype | features-aat | features-graphite]
<color-font-tech>=[ color-COLRv0 | color-COLRv1 | color-SVG | color-sbix | color-CBDT]
If a component value is parsed correctly and is a supported CSS Fonts 4 § 11.2 Font formats or CSS Fonts 4 § 11.1 Font tech, add it to the list of supported sources. If parsing a component value results in a parsing error or its format or tech are unsupported, do not add it to the list of supported sources.
If there are no supported entries at the end of this process, the value for the src descriptor is a parse error.
These parsing rules allow for graceful fallback of fonts for user agents which don’t support a particular font tech or font format.
@font-face { font-family : "MyIncrementallyLoadedWebFont" ; src : url ( "FallbackURLForBrowsersWhichDontSupportIncrementalLoading.woff2" ) format ( "woff2" ); src : url ( "MyIncrementallyLoadedWebFont.otf" ) format ( opentype) tech ( incremental); }
3.3. Font property descriptors: the font-size
Name: | font-size |
---|---|
For: | @font-face |
Value: | auto | [<number>]{1,2} |
Initial: | normal |
- auto
- The font matches any font size
- <number>
- If a single <number> is given the font matches that specific font size, only. If two <number>s are given, they specify a range of font sizes which will match.
3.4. Glyph Size Multiplier: the size-adjust descriptor
Opera?Edge92+
Edge (Legacy)?IENone
Firefox for Android?iOS Safari?Chrome for Android?Android WebView?Samsung Internet?Opera MobileNone
Name: | size-adjust |
---|---|
For: | @font-face |
Value: | <percentage [0,∞]> |
Initial: | 100% |
The size-adjust descriptor defines a multiplier for glyph outlines and metrics associated with this font, to allow the author to harmonize the designs of various fonts when rendered at the same font-size.
All metrics associated with this font—
Note: The size-adjust descriptor functions similarly to the font-size-adjust property, which essentially calculates an adjustment per font by matching ex heights, but likewise does not affect the computed font-size.
3.5. Line Height Font Metrics Overrides: the ascent-override, descent-override, and line-gap-override descriptors
Name: | ascent-override |
---|---|
For: | @font-face |
Value: | [ normal | <percentage [0,∞]> ]{1,2} |
Initial: | normal |
Name: | descent-override |
---|---|
For: | @font-face |
Value: | [ normal | <percentage [0,∞]> ]{1,2} |
Initial: | normal |
Name: | line-gap-override |
---|---|
For: | @font-face |
Value: | [ normal | <percentage [0,∞]> ]{1,2} |
Initial: | normal |
The ascent-override, descent-override, and line-gap-override descriptors specify the ascent metric, descent metric, and line gap metric of the font, respectively. The first value provides the value for the x axis, and the second value provides the value for the y axis (defaulting to normal if omitted).
- normal
-
The corresponding metric value is obtained from the font as usual,
as if this descriptor were absent from the
block.@font-face Note: Since there are multiple sources of such metrics in some font formats, this can result in text layout that varies across UAs/platforms.
- <percentage>
- The corresponding metric is replaced by the given percentage multiplied by the used font size.
The font-size-adjust property is applied after the size-adjust descriptor.
Note: The consequence of applying font-size-adjust after size-adjust is that size-adjust appears to have no effect.
Note: None of these descriptors affect the computation of font-size, line-height, or font-relative lengths. They can, however, affect the behavior of line-height: normal and more generally the baseline alignment of inline-level content.
Note: Since these metrics are only applicable in the block axis, the y-axis value will only be used when typesetting upright in vertical typographic modes.
@font-face { font-family : overridden-font; ascent-override : 50 % ; ...} <span style="font-family: overridden-font; font-size: 20px;" > Outer span content <span style="font-size: 150%;" >Inner span content</span> </span>
The outer span uses an ascent value of 10px, whereas the inner span uses 15px.
@font-face { font-family : cool-web-font; src : url ( "https://example.com/font.woff" ); } @font-face { font-family : fallback-to-local; src : local ( Some Local Font); /* Override metric values to match cool-web-font */ ascent-override:125 % ; descent-override : 25 % ; line-gap-override : 0 % ; size-adjust : 96 % ; } <div style="font-family: cool-web-font, fallback-to-local" >Title goes here</div> <img src="https://example.com/largeimage" alt="A large image that you don’t want to shift" >
The image will not be shifted as much when the user agent finishes loading and switches to use the web font (assuming the override values are similar to the web font’s natural metrics).
3.6. Superscript and subscript metrics overrides: the superscript-position-override, subscript-position-override,superscript-size-override and subscript-size-override descriptors
Name: | superscript-position-override |
---|---|
For: | @font-face |
Value: | [ normal | from-font | <percentage> ]{1,2} |
Initial: | normal |
Name: | subscript-position-override |
---|---|
For: | @font-face |
Value: | [ normal | from-font | <percentage> ]{1,2} |
Initial: | normal |
Name: | superscript-size-override |
---|---|
For: | @font-face |
Value: | [ normal | from-font | <percentage [0,∞]> ]{1,2} |
Initial: | normal |
Name: | subscript-size-override |
---|---|
For: | @font-face |
Value: | [ normal | from-font | <percentage [0,∞]> ]{1,2} |
Initial: | normal |
The superscript-position-override, subscript-position-override, superscript-size-override, and subscript-size-override descriptors specify the superscript offset, subscript offset, superscript size, and subscript size metrics of the font, respectively, which are used to synthesize glyphs when required by font-variant-position. The first value provides the value for the x axis, and the second value provides the value for the y axis (defaulting to the first value if omitted).
- normal
- The UA determines what metrics value to use, whether derived from the font or from some heuristic.
- from-font
- The corresponding metric in the font data is used, if any. (If the metric is missing, same as normal.)
- <percentage>
- The corresponding metric is replaced by the given percentage multiplied by the used font size.
Note: Since these metrics are only applicable in the block axis, the y-axis value will only be used when typesetting upright in vertical typographic modes.
4. Font Feature Properties
4.1. Font language override: the font-language-override property
5. Font Feature and Variation Resolution
6. Font Variation Properties
6.1. Optical sizing control: the font-optical-sizing property
7. Security Considerations
No new security considerations have been reported on this specification.
8. Privacy Considerations
No new privacy considerations have been reported on this specification.
9. Acknowledgments
Firstly, the editors would like to thank all of the contributors to the previous level of this module.
Secondly, we would like to acknowledge DerKoun from PDFReactor, Xiaocheng Hu from Google, and Jonathan Kew from Mozilla, for their contributions to the improvements in this Level 5.
10. Changes
10.1. Changes since the WD of 2021-07-29
- Renamed technology to tech
- Security and Privacy are now separate sections
- Fixed font-technology grammar
- Copied section on parsing src descriptor from CSS Fonts 4
10.2. Changes since the FPWD of 2021-06-29
- Removed scary warning notice
- Added incremental font technology to supports