为什么如果不设置viewport,会导致移动端中较长的文字字体变化?

新手上路,请多包涵

问题描述:如果不设置viewport,会导致移动端中较长的文字字体变化

简单来说,我现在有这样一段代码:

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Document</title>
    </head>
    <body>
        <div>This is not so long a piece of text.</div>
    </body>
</html>

然后我在chrome的手机模拟器里打开这个网页,一切正常。但是,如果我把内容换成下面这样(增加div内容长度):

<!doctype html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <title>Document</title>
    </head>
    <body>
        <div>This is a very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very very long piece of text.</div>
    </body>
</html>

此时,手机模拟器中的字体变得很大,用getComputedStyle获取字体发现字体变成了41.791px。

这个问题倒是很好解决,只要加上viewport meta标签就行,但是我没明白为什么同一个设备、同一个浏览器,只是内容长度不同,就会导致渲染出的字体大小不同?

录制了一段视频,如下:

[https://www.veed.io/view/a26252b7-1a3c-4ada-8b82-cbbc1e677621...]

阅读 474
3 个回答

这是个 Feature,叫 Font Boosting

这就是为啥很多 CSS Reset 里都会有类似这么一句:

html { -webkit-text-size-adjust: 100%; }
/* or */
html { -webkit-text-size-adjust: none; }

就是为了关闭这个特性。

你也可以试试在不设置 viewport 的前提下加这么个 style 看看效果。

https://developer.mozilla.org/en-US/docs/Web/CSS/text-size-ad...

移动端动态设置viewport引起的大段文字字号变大

移动端动态设置viewport引起的大段文字字号变大的原因并不是什么bug,而是 Webkit 给移动端浏览器提供的一个特性:当在手机上浏览网页时,很可能因为原始页面宽度较大,在手机屏幕上缩小后就看不清其中的文字了。这个特性叫Font Boosting(字体提升),也被称为Text Autosizer,Font Inflation。而 Font Boosting 特性在这时会自动将其中的文字字体变大,保证在即不需要左右滑动屏幕,也不需要双击放大屏幕内容的前提下,也可以让人们方便的阅读页面中的文本。

出现该特性的原因是因为:

在移动端页面缩放情况下(initial-scale!=1),chrome有可能重新调整字号;

未限定尺寸的文本流中有效

解决方案

  • Font Boosting 仅在未限定尺寸的文本流中有效,给元素指定宽高,就可以避免 Font Boosting 被触发
  • 可通过指定max-height来避免触发。比如 .class {max-height:99999px;}
  • .class{ -webkit-text-size-adjust:none;}
  • 指定initial-scale = 1

看起来像是 Chrome 对溢出内容做了一些处理 👇
图片.png

FireFox中并没有复现你的情况 👇
图片.png

大概检索了一下关键词发现有一个相关的问题,提到了Chrome做了处理。👉 html - Turn Off Chrome's Autosizing Text in Emulator Mode - Stack Overflow

Chrome (v40) has an emulator "feature" described thus:

  • Autosizes (boosts) text for pages without a defined viewport.
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏