动态 REM

作者: lyp82nkl | 来源:发表于2019-07-01 01:01 被阅读0次

    什么是 REM ?

    说到rem自然就会想到em,我们知道em是相对于父元素的字体大小的单位,那么rem则是相对于根元素也就是<html>元素的字体大小的单位。

    CSS中常用的长度单位:

    • px:即像素,最最常用
    • rem:即root em,表示根元素的font-size,根元素一般指<html></html>
    • em:一个“M”的宽度(但实际面试中我们回答一个汉字的宽度比较好)
    • vh:即viewport heigh,100vh表示当前视口高度
    • vw:即viewport width,100vw表示当前视口的宽度(兼容性太差,不建议使用)
    • 网页中:一般默认字体宽度为16px。
    • 在chrome浏览器中,默认最小字体大小为12px,即设置更小的字体大小也不会有任何效果。

    em 和 rem 的区别

    • 其实二者除了长得比较像,没有太大的联系

    • em指的是当前元素的font-size,rem指的是根元素的font-size。
      举例说明:

    html{
      font-size:32px;
    }
    body{
      border:1px solid red;
      font-size:16px;
      height:2em; 
      /*此时高度为32px*/
      height:2rem;
      /*此时高度为64px*/
    }
    

    为什么要使用动态REM技术

    • 在pc端中,网页是可以大致知道要写多宽的(比如980px),而在移动端,每一款手机的屏幕分辨率都不一样,虽然宽度的大致范围都是在300px和500px之间,但细微的差别是很明显的,只要没做好适配,就很难优雅的向用户展示网站效果。

    • 现在在不同分辨率的手机上展示相同的网页,要求网页的布局大体上看着要差不多,最常用的有以下两种适配方案:
      1.不固定每一个元素的宽度,都用百分比来表示。但是这么写我们无法确定宽度的确切值,如果想让某个元素的高度随着宽度的缩放而缩放就实现不了啦。
      2.所以我们更希望的效果是:保持每一个元素宽高比例不变,根据设备的宽度将元素整体放大或缩小,而能实现这种效果的最佳方案,就是动态REM。

    动态REM的使用

    • 动态REM的思路:一切单位以设备宽度为基准,就能保证完美的还原设计稿。

    • 在css中我们无法获取当前设备的宽度,所以需要在JS中需要写:

     var pageWidth = window.innerWidth
     document.write('<style>html{font-size:'+pageWidth+'px;}</style>')
    

    即让<html></html>的font-size = 设备宽度,即 1 rem = 1 pageWidth
    然后在css中,就可以优雅的使用rem作为单位啦。

    • 注意别忘了禁止移动端的自动缩放:
    <meta name="viewport" content="width=device-width, user-scalable=no,
     initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    

    栗子:

    body {
      font-size: 16px
    }
    .content {
      background: #ddd;
      margin: 10px 0;
    }
    .content {
      float: left;
      width: 0.4rem;            /* 128(div的宽度) / 320(设计稿屏幕的宽度) = 0.4rem */
      height: 0.2rem;           /* 0.4rem的一半 = 0.2rem  =  设计稿的 64px */
      margin: 0.05rem 0.05rem;  /* 0.2rem 的一半为 0.1rem => 32px */
                                /*因为设计稿为16px,所以再 0.1rem的一半 0.05rem*/
    }
    
    

    然而这么写有点不对劲呀,每个长度的数值都是用好几位小数来表示,看着不太爽,或许可以让100 rem = 1 pageWidth,比如margin就可以改写成margin: 5rem 5rem; 看起来貌似舒服多了。

    但是!!每个长度都要去计算,如果css多的话那么工作量就会很大,所以使用scss让px自动转化成rem。

    使用scss让px自动转化成rem

    安装scss(Mac用户)
    // 使用淘宝镜像
    $ npm config set registry https://registry.npm.taobao.org/   
    
    $ touch ~/.bashrc
    
    $ echo 'export SASS_BINARY_SITE="https://npm.taobao.org/mirrors/node-sass"' >> ~/.bashrc
    
    $ source ~/.bashrc
    
    $ npm i -g node-sass
    
    使用PX2REM
    //在当前文件新建scss和css文件夹
    $ mkdir scss css  
    
    //新建style.scss 文件
    $ touch scss/style.scss 
    
    //重点
    $ node-sass -wr scss -o css
    

    css:

    //在style.scss写入 
    
    //重点
    @function px($px) {
      @return $px / $designWidth * 10 + rem;
      //注意这里的10是为了省小数点,对应script
    }
    
    $designWidth: 320;   //设计师给你设计稿的宽度
    
    * {
      margin: 0;
      padding: 0;
    }
    
    body {
      font-size: 16px
    }
    .content {
      background: #ddd;
      margin: 10px 0;
    }
    .content {
      float: left;
      width: px(128);  // 128 / 320 * 10 = 4rem
      height: px(64);
      margin: px(16);
    }
    .clearfix::after {
      content: '';
      display: block;
      clear: both;
    }
    

    js:

    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    
    <script>
      var pageWidth = window.innerWidth
      document.write('<style>html{font-size:' + pageWidth/10 + 'px}</style>')
    </script>
    

    相关文章

      网友评论

        本文标题:动态 REM

        本文链接:https://www.haomeiwen.com/subject/eeoicctx.html