rem适配总结

170 阅读3分钟

一、px、em、rem的区别

1.px:
例:一个盒子是100px * 100px  
   px指的是逻辑像素,也叫css像素。
   
例如:div{
            font-size: 37.5px;
      }
        

在适配时,使用px作为单位并不合适。

2.em:

指的是一个汉字的宽度,2em表示两个汉字的宽度。

1em = 1个font-size的大小

如:font-size:20px; 
1em = 20px   
10em = 200px

em不足:font-size有继承性,它是相对于父元素的font-size来说的。

假设给body设置了font-size,它里面的所有的子标签都可以继承。
但如果给div设置了font-size,继承的font-size就不起作用。 

适配使用em也不合适,因为它一直是相对于父元素的font-size来说的。

3.rem:

r表示root , root是根的意思 ,指html标签 。

1rem ==> html标签中的font-size的大小  
1em  ==> 父标签中的font-size的大小

如:html标签的font-size设置成了34px 
1rem = 34px  
2rem = 68px 
3rem = 102px

二、适配

1.什么是适配?

在移动端的页面开发中,需要根据不同的手机去适配页面,让页面可以自适应的展示。

即适配是:如果是大屏,盒子或字体大上设置的大一点。
         如果是小屏,盒子或字体大小设置的小一点。

例如:假设页面有10个字,令其在不同的手机,都是撑满一行。
2.使用媒体查询+rem,实现适配:

媒体查询 类似于 编程语言中的if else

假设有一张设计图,一行文字,10个字,在750屏上,是撑满一行的。
还有一张图片,占手机屏的一半。

需要利用媒体查询+rem来适配,步骤如下:

1)得到设计稿  一般情况下,设计稿的尺寸是750px。
2)通常我们把浏览器的模拟器也调整成750px
3)严格按照设计稿,以rem为单位,把设计稿还原出来。
4)开始写样式,需要确定html标签的font-size,通常我会把fontsize,定成100px,叫rem的基准值。  

    有一个盒子,width是20px  1rem = 100px。 
    盒子是20px,换成rem  换成0.2rem。
    又量出一个盒子的宽度是55px,换成rem就是0.55rem。
    
    说白了,量设计稿,量出来的Px单位,只需要除于100,就成rem单位。 
    到此,你先不要管适配,你就在750px的屏上,还原750的设计稿。

5)最后一步,把写好的页面,迁移到其它屏上的,完成适配。
    在迁移时,也需要换算。 换算如下: 
        在750px的屏上,html的font-size的大小为100px。
        在375px的屏上,html的font-size的大小为50px。
        在320px的屏上,html的font-size的大小为42.6666666px。
        在414px的屏上,html的font-size的大小为55.2px。
        

如果使用媒体查询+rem来适配,需要写如下代码:

    @media only screen and (width:750px) { html{ font-size: 100px; } }
    @media only screen and (width:375px) { html{ font-size: 50px; } }
    @media only screen and (width:320px) { html{ font-size: 42.6666px; } }
    @media only screen and (width:414px) { html{ font-size: 55.2px; } }
    // ....
    // ....
    // ....
    // ....
    // ....
    // ....
    // ....

缺点: 如果我们写要适配的屏比较多,那么我们需要写大量的媒体查询的代码。

3.使用JS+rem,实现适配

步骤如下:

<script>
        let docEle = window.document.documentElement; // 表示获取窗口

        // 此函数是计算不同屏的html标签的font-size
        function refresh(){
            // width 表示手机屏的宽度
            let width = docEle.getBoundingClientRect().width; // 一屏的宽度 
            if(width>750){  width=750 }
            let fs = width / 7.5
            document.querySelector("html").style.fontSize = fs + "px"
        }

        refresh();  

        // window叫事件源   addEventListenere用来绑定事件的
        // resize叫浏览器窗口大小改变事件  ()=>{}叫事件监听器
        window.addEventListener("resize",()=>{
            refresh()
        })
        // pageshow 页面显示出来
        window.addEventListener("pageshow",()=>{
            refresh()
        })
    </script>