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.
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.
Basic Font Properties
Issue(126):
Font family: the 'font-family!!property' property
Generic font families
In addition to the [[css-fonts-4#generic-font-families]]
in CSS Fonts Level 4, the following new generic font families are also defined.
Issue(4910):
xxx
Placeholder text for the xxx generic font family.
Issue(4566):
Font weight: the 'font-weight!!property' property
Issue(2690):
Font style: the 'font-style!!property' property
Issue(4044):
Relative sizing: the 'font-size-adjust' property
Name: font-size-adjust
Value: none | [ ex-height | cap-height | ch-width | ic-width | ic-height ]? [ from-font | <> ]
Initial: none
Applies to: all elements and text
Inherited: yes
Percentages: N/A
Computed value: the keyword ''font-size-adjust/none'', or a pair of a metric keyword and a <>
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.
font-size-adjust-ic-height.html
Issue(8792):
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!!property' adjustment is applied.
Specifies the font metric to normalize,
defaulting to ''font-size-adjust/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.
ISSUE(6384):
If the required font metric cannot be derived from a font,
then that font’s size is not adjusted.
<>
Each font’s [=used value|used=] size is normalized
to match the chosen font metric to
this specified proportion of the [=computed value|computed=] 'font-size!!property'.
In other words,
for each glyph,
the adjusted font size to use u
is calculated as:
u = ( m / m′ ) s
where:
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 use
Negative values are invalid.
from-font
Computes to the <> corresponding to
the specified metric of the [=first available font=].
ISSUE(6384): Shouldn't this be the first available font
that can provide the required metric?
The style defined below defines Verdana as the desired font family,
but if Verdana is not available Futura or Times will be used.
One paragraph also has font-size-adjust specified.
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.
Text with and without the use of 'font-size-adjust'
The value of 'font-size-adjust' affects the [=used value|used=] value of 'font-size!!property'
but does not affect the [=computed value|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 value|computed=] size of 'font-size!!property',
'font-size-adjust' also does not affect the [=used value|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 (m/m′) term in the adjustment formula
will resolve to 1 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'.
Authors can calculate the aspect value for a given font
by comparing spans with the same content
but different 'font-size-adjust' properties.
If the same font-size is used, the spans will match
when the 'font-size-adjust' value is accurate for the given font.
Two spans with borders are used to determine the aspect value of a font.
The 'font-size!!property' 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.
Futura with an aspect value of 0.5
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.
Font Resources
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=].
Font reference: the 'src' descriptor
Parsing the 'src!!descriptor' descriptor
The 'src!!descriptor' descriptor value must be parsed
according to section [[css-syntax#parse-comma-separated-list-of-component-values]].
Then each component value is parsed according to this grammar:
If a component value is parsed correctly
and is a supported [[css-fonts-4#font-format-definitions]] or
[[css-fonts-4#font-tech-definitions]],
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' 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.
For example,
when incremental transfer is not supported,
a woff2 compressed version of the font
is supplied,
for optimal performance.
Then, for
incremental transfer,
the raw uncompressed OpenType font is provided,
portions of which will be loaded on demand.
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!!property'.
All metrics associated with this font--
including glyph advances, baseline tables, and overrides provided by ''@font-face'' descriptors--
are scaled by the given percentage,
as are the rendered glyph images.
Consequently,
any values derived from font metrics
(such as ''ex'' and ''ch'' units,
or the ''text-decoration-thickness/from-font'' value of 'text-decoration-thickness')
are also affected when sourced from this font.
However, the [=computed value|computed=] 'font-size!!property'
(and thus any values that derive from it,
such as ''em'' units, percentages in 'text-underline-offset', etc.)
remains unaffected.
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 value|computed=] 'font-size!!property'.
font-size-adjust-metrics-override.html
size-adjust-01.html
size-adjust-02.html
size-adjust-03.html
Line Height Font Metrics Overrides:
the 'ascent-override', 'descent-override', and 'line-gap-override' descriptors
Name: ascent-override
Value: [ normal | <> ]{1,2}
For: @font-face
Initial: normal
Name: descent-override
Value: [ normal | <> ]{1,2}
For: @font-face
Initial: normal
Name: line-gap-override
Value: [ normal | <> ]{1,2}
For: @font-face
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 ''ascent-override/normal'' if omitted).
normal
The corresponding metric value is obtained from the font as usual,
as if this descriptor were absent from the @font-face block.
Note: Since there are multiple sources of such metrics in some font formats,
this can result in text layout that varies across UAs/platforms.
<>
The corresponding metric is replaced by
the given percentage multiplied by the effective font size after adjustment.
ascent-descent-override.html
font-size-adjust-metrics-override.html
line-gap-override.html
metrics-override-normal-keyword.html
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 [=computed value|computation=] of
'font-size!!property', '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=].
The percentage is resolved against different font sizes for different elements.
The outer span uses an ascent value of
10px, whereas the inner span uses 15px.
We may override the metrics of a local fallback font to match the primary font, which
is a web font. This reduces layout shifting when switching from fallback to the
primary font.
@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).
Superscript and subscript metrics overrides:
the 'superscript-position-override', 'subscript-position-override','superscript-size-override' and 'subscript-size-override' descriptors
Name: superscript-position-override
Value: [ normal | from-font | <> ]{1,2}
For: @font-face
Initial: normal
Name: subscript-position-override
Value: [ normal | from-font | <> ]{1,2}
For: @font-face
Initial: normal
Name: superscript-size-override
Value: [ normal | from-font | <> ]{1,2}
For: @font-face
Initial: normal
Name: subscript-size-override
Value: [ normal | from-font | <> ]{1,2}
For: @font-face
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 ''superscript-position-override/normal''.)
<>
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=].
Font Feature Properties
Font language override: the 'font-language-override' property
Issue(5484):
Font Feature and Variation Resolution
Issue(5635):
Font Variation Properties
Optical sizing control: the 'font-optical-sizing' property
Issue(5466):
Security Considerations
No new security considerations have been reported on this specification.
Privacy Considerations
No new privacy considerations have been reported on this specification.
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
Bernhard Fey from RealObjects,
Xiaocheng Hu from Google,
and
Jonathan Kew from Mozilla,
for their contributions to the improvements in this Level 5.