在Safari 12.0.2和Mac Mojave 10.14.2上的Chrome 71.0.3578.98中,使用font-size
单位设置rem
时,实际大小不会低于9px
。
请参见以下示例:
https://codepen.io/stephenjwatkins/pen/OrbGxL
我的浏览器的字体大小设置为默认(16px
),最小字体大小设置为6px
:
将text-size-adjust
设置为none
不会影响该问题。 Firefox可以正确显示尺寸。
我发现唯一可以解决此问题的方法是将font-size: 0;
设置为父元素。例如,如果将font-size: 0;
添加到.container
,则将呈现正确的字体大小。
有人知道为什么它不遵守某个特定阈值以下的rem
大小吗?
答案 0 :(得分:10)
Chrome及其Blink呈现引擎似乎具有一些不明显的字体缩放规则。我不知道任何正式的综合文档,因此让我们看一下源代码。
(请注意,我一般不是Chromium内部结构专家,也不是Blink渲染器专家。我只是在跟踪源代码,并推测出所提出问题的最可能答案。)
在我看来,引擎在重绘期间会调用the FontBuilder
class。此类具有各种分配方法,这些方法将DOM,缩放和其他相关因素传递给看似至关重要的方法:FontSize :: getComputedSizeFromSpecifiedSize
。通过这种方法,我们看到了一些多汁的评论,可以解决您提出的问题:
1。为什么将font-size: 0;
设置为父元素可以解决该问题?
// Text with a 0px font size should not be visible and therefore needs to be
// exempt from minimum font size rules. Acid3 relies on this for pixel-perfect
// rendering. This is also compatible with other browsers that have minimum
// font size settings (e.g. Firefox).
2。为什么不尊重rem大小低于某个阈值?
// We support two types of minimum font size. The first is a hard override
// that applies to all fonts. This is "minSize." The second type of minimum
// font size is a "smart minimum" that is applied only when the Web page can't
// know what size it really asked for, e.g., when it uses logical sizes like
// "small" or expresses the font-size as a percentage of the user's default
// font setting.
// With the smart minimum, we never want to get smaller than the minimum font
// size to keep fonts readable. However we always allow the page to set an
// explicit pixel size that is smaller, since sites will mis-render otherwise
// (e.g., http://www.gamespot.com with a 9px minimum).
3。出于好奇,给定相对单位(例如x-small
)时这些最小值是多少?
// Strict mode table matches MacIE and Mozilla's settings exactly.
static const int strictFontSizeTable[fontSizeTableMax - fontSizeTableMin +
1][totalKeywords] = {
{9, 9, 9, 9, 11, 14, 18, 27}, {9, 9, 9, 10, 12, 15, 20, 30},
{9, 9, 10, 11, 13, 17, 22, 33}, {9, 9, 10, 12, 14, 18, 24, 36},
{9, 10, 12, 13, 16, 20, 26, 39}, // fixed font default (13)
{9, 10, 12, 14, 17, 21, 28, 42}, {9, 10, 13, 15, 18, 23, 30, 45},
{9, 10, 13, 16, 18, 24, 32, 48} // proportional font default (16)
};
// HTML 1 2 3 4 5 6 7
// CSS xxs xs s m l xl xxl
// |
// user pref
有趣的是,FontBuilder
类分派给TextAutosizer :: computeAutosizedFontSize来缩放字体大小。此方法使用硬编码值和可变比例因子:
// Somewhat arbitrary "pleasant" font size.
const float pleasantSize = 16;
// Multiply fonts that the page author has specified to be larger than
// pleasantSize by less and less, until huge fonts are not increased at all.
// For specifiedSize between 0 and pleasantSize we directly apply the
// multiplier; hence for specifiedSize == pleasantSize, computedSize will be
// multiplier * pleasantSize. For greater specifiedSizes we want to
// gradually fade out the multiplier, so for every 1px increase in
// specifiedSize beyond pleasantSize we will only increase computedSize
// by gradientAfterPleasantSize px until we meet the
// computedSize = specifiedSize line, after which we stay on that line (so
// then every 1px increase in specifiedSize increases computedSize by 1px).
const float gradientAfterPleasantSize = 0.5;
根据这些事实,我们看到有很多硬编码的像素值,其中9
和16
通常散布在相关代码上。这些硬代码,一些将字体缩小到一定限度的规则的存在,以及使用字体大小进行覆盖的能力似乎都与观察结果相符,并暗示它的行为符合预期-不一定是直观的。
此外,我发现Chrome bug #319623中发布的最新评论与您的报告非常相似。
可能相关:在html标记上使用相对单位时,在其他位置定义的基于rem的值的下限为9px。
请参阅CodePen:http://codepen.io/larrybotha/pen/wKYYXE
解决方法:html上的绝对单位,body上的em单位。雷姆斯在其他地方。
谨慎地观察该错误的进一步发展,尽管可能无法屏住呼吸。最后一次更新是在2015年。