htmlFontSize
为html
元素的字体大小。
首先来看方案1中,在屏宽为640px
情况下的设置:
@media screen and (min-width: 640px) {html{font-size:100px;}}
可以很明显的表现出这一点 1rem = 1 * 100px
,同我们最初的设定。那么我们要得到其它屏幕大小的 htmlFontSize
值要怎么办。很简单如方案3,因为我们的采用等比缩放的方式适配,所以计算目标屏幕宽度和设计稿的宽度的比即可:
window.innerWidth / designWidth * rem2px + ‘px’
由于浏览器默认字体大小为 16px
,所以当我们使用百分比作为根节点 html
的字体大小时,即html
元素的font-size
值设置为一个百分比值,rem
的计算方式就会改为:
defaultFontSize = 16px
1rem = 1 * htmlFontSize * defaultFontSize
如方案2中,在屏宽为640px
情况下的设置:
@media screen and (min-width: 640px) {html{font-size:625%;}}
应用上面的公式:
1rem = 1 * 625% * 16px
其中:625% * 16 = 6.25 * 16 = 100
所以:1rem = 1 * 100px
同样的可以得到所有屏幕大小下,html
的 font-size
值的计算公式,即为方案4:
window.innerWidth / designWidth * rem2px / 16 * 100 + ‘%’
通过方案3和方案4的公式,就可以很方便的生成方案1和方案2中的css。
这里只给出了方案3和方案4对应验证页面(方案1和方案2是它们的变形): scheme3.html, scheme4.html
如下面两张图,是在屏宽为360px下的效果,通过计算目标为:
1rem = 56.25px
。方案3设置值为:56.25px
,方案4设置值为:351.5625%
| 方案3 | 方案4 |
| — | — |
| | |
到目前为止貌似很完美的解决了问题,实际情况当然是出现了意外。在有些 Android 手机上,浏览器或 webview 的默认字体是随着系统设置的字体改变的。这样就会导致默认字体大于或小于 16px
。
修改默认字体大小后,我们再看方案3和方案4。
同样在屏宽为360px下,我们调大系统字体大小,如下面的效果
设置前
html
元素的字体大小的计算值
为18px
,设置后的计算值
为65px
,由于屏幕宽度没有改变,我们的目标值,即我们在html
元素上设置的font-size
值也没有变化任然为56.25px
,而最终计算值
出现了偏差。
| 方案3 | 方案4 |
| — | — |
| | |
分析偏差前,先来看在360px
屏宽下,方案3和方案4的计算过程:
方案3:
document.documentElement.style.fontSize = 56.25px
htmlFontSize = 56.25px
1rem = 1 * htmlFontSize = 56.25px
实际为:
1rem = 64.6875px
方案4:
document.documentElement.style.fontSize = 351.5625%
htmlFontSize = 351.5625%
defaultFontSize = 18px
1rem = 1 * htmlFontSize * defaultFontSize = 351.5625% * 18px = 63.28125px
351.5625% * 18 = 63.28125
实际为:
1rem = 64.6875px
貌似方案4的计算结果很接近实际效果,而方案3偏差很大。再来比较方案3和方案4的计算公式:
// 方案3
document.documentElement.style.fontSize =
window.innerWidth / designWidth * rem2px + ‘px’;
// 方案4
document.documentElement.style.fontSize =
window.innerWidth / designWidth * rem2px / 16 * 100 + ‘%’;
方案4较于方案3其实多除了一个16,可以推测浏览器在计算 rem
的具体值时,如果 html
设置的 font-size
为 px
值时会先除以 16
,然后再乘以 htmlFontSize
。
1rem = 1 * (56.25px / 16) * 18
1 * (56.25 / 16) * 18 = 63.28125
方案4存在问题,是因为系统的默认字体改为了 18px
,但是我们在计算百分比是时候,还是以 16px
为基准值进行计算,所以出现偏差(计算值和实际值之间还有一点偏差这个在后面会提到)。
而在方案3中,我们其实是不考虑浏览器默认字体大小的,但在实际使用的过程中,浏览器还是除了 16
,而此时默认字体大小为 18px
。得出如下在 html
的 fontSize
设置为 px
的情况下 rem
的计算公式为:
1rem = 1 * (htmlFontSize / 16) * defaultFontSize
在系统设置的字体大小发生改变时,defaultFontSize
会跟着改变,而 16
不会变化。所以方案3虽然表面上不考虑默认字体大小的变化,只关注屏幕与设计稿之间的宽度比,但在实际计算中还是使用到了默认字体大小,而且还有一个不变的 16
在作祟,导致方案3失败。
所谓的「
root element
」其实不是想象的那样,一个是16
,一个是18
,到底取的是那个root element
的字体大小。
ok,rem
的计算的时候,px
的方式会有一个16
不随系统字体大小改变,所以我们采用百分比的方案,绕开这个问题。
采用百分比的方案4
因为在计算时写死了默认字体大小 16px
。所以它的偏差在于没能动态的获取默认字体大小。更新如下:
方案4.1
var designWidth = 640, rem2px = 100;
var h = document.getElementsByTagName(‘html’)[0];
var htmlFontSize = parseFloat(window.getComputedStyle(h, null)
.getPropertyValue(‘font-size’));
document.documentElement.style.fontSize =
window.innerWidth / designWidth * rem2px / htmlFontSize * 100 + ‘%’;
效果如下图:
16px
的图中,设置后的html
的font-size
与1rem
的实际值有偏差,同时6.4rem
的计算值也有偏差。通过查看代码发现html
的font-size
使用的是:getPropertyValue('font-size')
而1rem
使用的是getPropertyValue('width')
,偏差出在计算font-size
的时候浏览器进行了四舍五入。rem
定义中的另一个元素「font size
」也不能按字面意思使用,宣告失守。
18px
中的偏差,以及上文中方案4在18px
实际值和计算值出现的偏差都是同样的问题。所以基准值还需要修改。
| 16px | 18px |
| — | — |
| | |
在更新一版,方案4.2:
var designWidth = 640, rem2px = 100;
var d = window.document.createElement(‘div’);
d.style.width = ‘1rem’;
d.style.display = “none”;
var head = window.document.getElementsByTagName(‘head’)[0];
head.appendChild(d);
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
最后
如果你已经下定决心要转行做编程行业,在最开始的时候就要对自己的学习有一个基本的规划,还要对这个行业的技术需求有一个基本的了解。有一个已就业为目的的学习目标,然后为之努力,坚持到底。如果你有幸看到这篇文章,希望对你有所帮助,祝你转行成功。
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】文章来源:https://www.toymoban.com/news/detail-853205.html
每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-GAjvdt5X-1711816192788)]
最后
如果你已经下定决心要转行做编程行业,在最开始的时候就要对自己的学习有一个基本的规划,还要对这个行业的技术需求有一个基本的了解。有一个已就业为目的的学习目标,然后为之努力,坚持到底。如果你有幸看到这篇文章,希望对你有所帮助,祝你转行成功。
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
文章来源地址https://www.toymoban.com/news/detail-853205.html
到了这里,关于了解真实的『REM』手机屏幕适配,独家发布的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!