解决 “页面中文字增多,字号突然变大” 的问题

在之前一篇文章中,曾记录过一个开发中遇到的问题,在页面中文字增加到一定数量,或者文字大小设置为某一个值时,页面中的文字字号会突然变大,超出自己设置的字号大小。

如下图所示:

虽然我设置的字号大小是24px,但是在computed下却是28.7px,超出我所设置的大小,那么问题来源是什么?

经高人指点后,该问题终于得到了解决,主要问题在于 Font Boosting 特性。

这个特性被称做「Text Autosizer」,又称「Font Boosting」、「Font Inflation」,是 Webkit 给移动端浏览器提供的一个特性:当我们在手机上浏览网页时,

很可能因为原始页面宽度较大,在手机屏幕上缩小后就看不清其中的文字了。而 Font Boosting 特性在这时会自动将其中的文字字体变大,保证在既不需要左右滑动屏幕,

也不需要双击放大屏幕内容的前提下,也可以让人们方便的阅读页面中的文本。

下面给出几个解决方案:

1. 手动指定 viewport width=320,这时 Font Boosting 不会被触发。(后边可以知道,这个说法不严谨,在其他设置均为默认值时,这一条才有效)

2. Font Boosting 仅在未限定尺寸的文本流中有效,给元素指定宽高,就可以避免 Font Boosting 被触发。这也就解释了为什么我在给元素设置高度以后,该问题便解决了。

3. 显然第 2 条方案是有缺陷的,文本内容不可能都指定宽高。不过可以通过指定 max-height 来解决。比如 body * { max-height: 999999px; } 就可以无副作用的禁掉 Font Boosting 特性。

当然,我觉得没必要使用通用选择器,用类似 p { max-height: 999999px; } 可能更好一些。

那么浏览器是怎么计算字号并控制其大小的呢,下面是浏览器的计算逻辑:

multiplier = Math.max(1, deviceScaleAdjustment * textScalingSlider * systemFontScale * clusterWidth / screenWidth);
if (originFontSize < 16) {
    computedFontSize = originFontSize * multiplier;
}
else if (16 <= originFontSize <= (32 * multiplier - 16)) {
    computedFontSize = (originFontSize / 2) + (16 * multiplier - 8);
}
else if (originFontSize > (32 * multiplier - 16)) {
    computedFontSize = originFontSize;
}

变量名解释如下:

  • originFontSize: 原始字体大小
  • computedFontSize: 经过计算后的字体大小
  • multiplier: 换算系数,值由以下几个值计算得到
    • deviceScaleAdjustment: 当指定 viewport width=device-width 时此值为 1,否则值在 1.05 - 1.3 之间,有专门的计算规则
    • textScalingSlider: 浏览器中手动指定的缩放比例,默认为 1
    • systemFontScale: 系统字体大小,Android设备可以在「设备 - 显示 - 字体大小」处设置,默认为 1
    • clusterWidth: 应用 Font Boosting 特性字体所在元素的宽度(如何确定这个元素请参考上边两个链接)
    • screenWidth: 设备屏幕分辨率(DIPs, Density-Independent Pixels),如 iPhone 5 为 320

问题终于得到解决啦,多谢高人指点,比心!

文章参考链接:https://github.com/amfe/article/issues/10

时间: 2024-10-11 06:21:17

解决 “页面中文字增多,字号突然变大” 的问题的相关文章

页面中文字增多,字号会突然变大

我也是偶然发现这个问题,本来活动说明只有一条内容,但是后来运营想加到六条,那就加呗,我就直接把增加的文案复制到代码中 之前的内容是这样的:活动说明的内容字号设置为24px 在我加了几个文案之后,突然变成了这样: 当时我是蒙的,查看控制台代码: 字号设置依旧是24px啊,可是24px什么时候是这么大的字号了 对比其他设置为24px的字号: 上图中,"(剩余77)" 才是正常的24px字号,再看看下面的活动说明内容,明显不一样 于是开始了艰难的找bug... 把其他HTML结构注释掉,没用

防止点击页面中文字被选中

//在body中加入 onselectstart="return false;" <body onselectstart="return false;"></body>

文字排版--字号、颜色(font-size, color)

可以使用下面代码设置网页中文字的字号为12像素,并把字体颜色设置为#666(灰色): body{font-size:12px;color:#666} 示例: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>字号.颜色</title> &

如何在百度搜索页面中插入广告

郑重声明:本人发布分享是为了让更多的人知道这项技术的存在,从而寻找一些防止的方法,并不是想做一些非法的操作.我也很不喜欢在页面中植入广告.所以希望各位大神看了此文后能多提一些建议与改进.本人会虚心接受.不喜勿喷!!! 该技术是我无意中接触的能够跨域操作JS的情况,通过跨域JS操作可以实现在你使用百度搜索跳转到你所在的页面的时候会自动使得百度搜索页面也进行相应的跳转,从而实现操作者的很多目的.目前我通过研究已经弄懂实现原理,并未亲自尝试,所以该文也是起抛砖引玉的作用,希望各位前端大牛能进行一下研究

iframe ios中h5页面 样式变大

实际项目开发中,iframe在移动设备中使用问题还是很大的,说一说我的那些iframe坑 做过的这个后台管理框架,最开始的需求是PC,但随着业务需要,需要将项目兼容到ipad,后台的框架也是使用的开源框架开发,使用的是iframe嵌套页面的方式 1.内部嵌入iframe,里面的内容页面中有绝对定位的元素,会有问题! 现象:项目中嵌入 <iframe /> 并设置宽高后,发现在 Android 手机浏览器上打开可以正常运行,但是在 iOS 手机上会有 iframe 页面样式莫名变大,效果如下:

jsp页面中onsubmit=&quot;return checklogin();&quot;报错解决办法

选择Window->Preferences->MyEclipse->Validation 去掉方框里的对号,然后Apply 然后点击Yes->然后再点击ok->Yes,就好了,如果你打开了那个出现错误jsp页面的话,请关掉重现打开就ok啦 jsp页面中onsubmit="return checklogin();"报错解决办法,布布扣,bubuko.com

使用CSS3对页面中的文字添加彩色边框

<!doctype html> <html> <head> <meta charset="utf-8"> <title>使用CSS3对页面中的文字添加彩色边框</title> <style>  #boarder{  border:solid 5px blue;  border-radius:20px;  -moz-border-radius:20px;  padding:20px;  width:180

select中文字垂直居中解决办法

我们知道select标签在各个浏览器中的属性和各浏览器的支持各有些不同,从而造成select选择框在各浏览器的显示有不同,下面我们通过对主要 外形CSS属性的支持,打造全兼容select. 我对select的height.padding.line-height分别利用控制变量的方法写了个DEMO在各浏览器上测试三种情况:height.100.padding.0.height.no.padding.100.no.height.no.padding,结果如  链接图片各浏览器DEMO外观 我们可以得

使用CSS2对页面中的文字添加彩色边框

<!doctype html> <html> <head> <meta charset="utf-8"> <title>使用CSS2对页面中的文字添加彩色边框</title> <style> #boarder{  margin:3px;  width:180px;  padding-left:14px;  border-width:5px;  border-style:solid;  height:10