REM字体大小未调整到任意阈值以下

时间:2018-12-19 17:58:52

标签: css blink

在Safari 12.0.2和Mac Mojave 10.14.2上的Chrome 71.0.3578.98中,使用font-size单位设置rem时,实际大小不会低于9px

请参见以下示例:

https://codepen.io/stephenjwatkins/pen/OrbGxL

Rendered font size

我的浏览器的字体大小设置为默认(16px),最小字体大小设置为6px

Browser font settings

text-size-adjust设置为none不会影响该问题。 Firefox可以正确显示尺寸。

我发现唯一可以解决此问题的方法是将font-size: 0;设置为父元素。例如,如果将font-size: 0;添加到.container,则将呈现正确的字体大小。

有人知道为什么它不遵守某个特定阈值以下的rem大小吗?

1 个答案:

答案 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;

根据这些事实,我们看到有很多硬编码的像素值,其中916通常散布在相关代码上。这些硬代码,一些将字体缩小到一定限度的规则的存在,以及使用字体大小进行覆盖的能力似乎都与观察结果相符,并暗示它的行为符合预期-不一定是直观的。


此外,我发现Chrome bug #319623中发布的最新评论与您的​​报告非常相似。

  

可能相关:在html标记上使用相对单位时,在其他位置定义的基于rem的值的下限为9px。

     

请参阅CodePen:http://codepen.io/larrybotha/pen/wKYYXE

     

解决方法:html上的绝对单位,body上的em单位。雷姆斯在其他地方。

谨慎地观察该错误的进一步发展,尽管可能无法屏住呼吸。最后一次更新是在2015年。