首页 > 代码库 > rem的自适应

rem的自适应

关于字体大小的自适应,最近用的很火的就是rem。自从认识了rem,我也用的很起劲,可是在项目实践中,也踩过了一些坑,整理如下,最终发现有一个相对而言比较完美的解决方案。

1、什么是rem?
rem是一种长度单位,任何能定义XXpx的地方,都能定义为XXrem。和px固定大小不同,rem是 相对于根元素<html>的相对单位,简单说明下:

技术分享

 PS:瞧见没,p标签里面的文字大小是相对于根元素html的而不是相对于其父元素div的。

 

2、rem响应式方案1:通过JS检测屏幕大小自动改变根元素html字体大小的值
既然所有标签都是相对于html的,那就可以通过JS检测屏幕大小而自动改变根元素html字体大小的值呀,这样不就实现了字体大小的响应式吗~~

JS如下:

(function(doc, win) {//根据屏幕尺寸自动调整根元素字体大小var docEl = doc.documentElement,resizeEvt = orientationchange in window ? orientationchange : resize, //监听屏幕变化    recalc = function() {            var clientWidth = docEl.clientWidth;            if (!clientWidth) {return;}            docEl.style.fontSize = 10 * (clientWidth / 320) + px; //以320宽,10px为基准        };    if (!doc.addEventListener) {return;}    win.addEventListener(resizeEvt, recalc, false);    doc.addEventListener(DOMContentLoaded, recalc, false);})(document, window);

这段JS的关键语句就是:`docEl.style.fontSize = 10 * (clientWidth / 320) + ‘px‘;其中clientWidth在iPhone5或5S下是320px,iPhone6下是375px,iPhone6P下是414px等等...在前期的项目中,我一直都是这个JS控制的,但是发现木有,页面宽度越来越大,根元素也会越来越大,木有上限,当超过了某个临界值时,页面展示就会越来越不好看了,show如下:

技术分享

技术分享

其实到这,就差不多兼容手机的各种大小屏幕了,但是屏幕在大点(比如各种pad屏幕)就不是那么好看了...继续

技术分享

技术分享

so,有木有更好的解决方案呢?那肯定有啦...

2、rem响应式方案2:通过css3 media媒体查询,在一定的屏幕尺寸范围内,给根元素设定一个值。

CSS如下:

 

@media only screen and (max-width: 375px) {    html{font-size: 10px;} /*手机小屏幕*/}@media only screen and (min-width: 376px) and (max-width: 480px) {    html{font-size: 12px;} /*手机中屏幕*/}@media only screen and (min-width: 481px) and (max-width: 540px) {    html{font-size: 14px;}/*手机大屏幕*/}@media only screen and (min-width: 541px) and (max-width: 768px){    html{font-size: 16px;}/*手机大屏幕*/}@media only screen and (min-width: 769px) and (max-width: 920px){    html{font-size: 18px;}/*pad屏幕*/}@media only screen and (min-width: 921px){    html{font-size: 20px;}/*PC屏幕*/}

 

技术分享技术分享

PS:上面的CSS中对于各种屏幕尺寸范围及相应的字体大小,可根据项目自己的喜好及项目实际自行编辑设定。

3、总结一下

上面两种方案究其原因都是根据屏幕的大小对根元素字体大小设值,各有弊端:

 

JS动态设置弊端

 

  • 需要额外加载解析,有时加载缓慢的话,会在页面打开时,页面上字体会很大,排版错乱,然后加载完后,一下子就好了...造成不好的用户感知;

  • 字体没有上限,会造成越来越大的窘境(当然,也可以写个更复杂的方程控制下,但是基于其第1个弊端,我还是舍弃他了)

 

CSS媒体查询设置弊端:

 

随着屏幕缩小或拉大,在屏幕尺寸临界值,会突然出现卡顿的现象,但是考虑到用户实际使用过程中,不会那么无聊去故意拉动屏幕,特别是在手机端,用户无法随意改变屏幕尺寸大小,所有这个小小的弊端完全可以忽略不计。所以,所以,个人还是觉得,这方案最好啦!

 

rem的自适应