移动端:动态REM

197 阅读4分钟

学习内容:

  1. REM是什么
  2. REM与EM的区别是什么
  3. 手机端方案的特点
  4. 使用JS动态调整REM
  5. REM可以与其他单位同时存在
  6. 在SCSS里使用PX2REM

一、REM是什么

它整体是一套手机专用的自适应方案

1.了解下REM是什么

单位全称中文解释
pxPixel像素图片或者图形的最小单位
ememphasize相对长度单位可以理解为一个m的宽度
vhviewport heiht视图高度单位100vh就是视图高度
vwview weight视图宽度单位100vw就是视图高度
remroot emphasize根元素相对长度根元素的font-size

具体的详细的全面的可以看官方文档: CSS 的值与单位 - 学习 Web 开发 | MDN (mozilla.org)

em和rem很像,但是毫无关系,就像Java和JavaScript,不要弄混了。

2.使用REM

  • font-size可以改变元素的字体大小,页面中的font-size默认是16px
  • 这个font-size也时候也和浏览器的设置有关,有些浏览器可以进行更改,Chrom可以设置最小为12px
  • rem就是一个根元素(html)的font-size

了解rem含义的示例 image.png

<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>rem</title>
    <style>
        html{
            font-size : 20px
        }
        body{
            font-s
        }
        p{
            font-size : 2rem
        }
    </style>
</head>
<body>
<p>你好,我是Yuyuan</p>
<span>第二行字</span>
</body>
</html>

所以,p中的内容会是html的font-size的两倍,就是40px;而span中的font-size先是继承html的20px,然后又被body的30px覆盖,最后呈现30px。

二、REM和EM的区别是什么?

前面我们以及REM就是一个根元素的高度,那em是什么呢,它们又有什么区别?

  • em是一个字的高度
  • rem是一个根元素的高度
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>rem</title>
    <style>       
        p{
           border:1px solid red;
           height : 2em
        }
    </style>
</head>
<body>
<p>你好,我是Yuyuan</p>
</body>
</html>

三、手机端方案的特点

需要做界面,一定需要设计图,如果是做响应式,一定需要四幅图,分别是:窄屏pc图、宽屏pc图、手机移动端图、ipad图。

什么是响应式?不同的屏幕得到不同的样子就是响应式。

但是手机的屏幕也是有不同的宽度,这就导致,展示的时候,和预想的布局出现很大的偏差。

两个方案。

  • 全部使用百分比布局
  • 按比例缩放

1.全部使用百分百布局

<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width'>
<title>百分百布局</title>
<style>
    *{
        padding:0;
        margin:0
     }
     .clearfix::after{
         content:'';
         display:block;
         clear:both
     }
     .child{
         background : #ddd;
         float : left;
         width: 40%;
         margin : 10px 5% 10px 5%;
         text-align : center
     }
</style>
</head>
<body>
    <div class='parent clearfix'>
        <div class='child'>40%</div>
        <div class='child'>40%</div>
        <div class='child'>40%</div>
        <div class='child'>40%</div>
    </div>
</body>
</html>

但是这样面临一个问题,就是当宽度取百分比的时候,高度就很难去配合宽度使用了。

于是就有了这样的思路: 元素rem ----> html的font-size ---JS---> page width

<!DOCTYPE html>
<html>
<head>
 <meta charset='utf-8'>
 <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">

 <title>rem与百分比占比</title>
 <script>
     const pageWidth = window.innerWidth
     document.write('<style>html{font-size:'+pageWidth+'px}</style>')
 </script>
 <style>
     *{
         padding:0;
         margin:0
     }
     .clearfix::after{
         content:'';
         display:block;
         clear:both
     }
     .child{
         font-size:24px;
         text-align:center;
         background:#ddd;
         float:left;
     }
     .child{
         width:0.4rem;
         height:0.2rem;
         margin:0.05rem 0.05rem
     }
 </style>
</head>

<body>
    <div class='parent clearfix'>
        <div class='child'>40%</div>
        <div class='child'>40%</div>
        <div class='child'>40%</div>
        <div class='child'>40%</div>
    </div>
</body>

</html>

这就是动态REM

  • 获取页面的宽度:window.innerWidth
  • 将html的font-size设置为页面宽度:document.write('<style>html{font-size:'+window.innerWidth+'px}</style>')
  • 将width和height都用rem做相对于html的百分比定位

四、使用JS动态调整REM

  • 在取屏幕宽度与html的font-size的时候,可以取pageWidth/100,这样写百分比的时候就不用写小数了width:40rem
  • 如果有限制最小的是12px,那么调整的时候小于12px的rem部分会被替换为12px。
  • 一些绝对的显示。要计算1px换算成rem吗?里面的文字也用rem作为单位吗?1px以及非常小了,就不用换成rem,而内部的文字可以直接写死成px。

五、在SCSS里使用PX2REM

为什么使用SCSS

  • 在使用rem作为单位之后,能使用px之类的其他单位
  • 但是,这样的换算非常麻烦,所以使用SCSS

使用SCSS的难点:

  • 图形化界面使用习惯,不会用命令行。
  • 不会英语
  • 不会看文档

安装scss mac:

  • 解决访问慢的问题:使用淘宝源,使用命令为:npm config set registry https://registry.npmmirror.com/
  • 设置变量 sass_binary_site,指向淘宝镜像地址。编辑一下zshrc:
vi ~/.zshrc  //进入目标文件
export SASS_BINARY_SITE = '
https://npm.taobao.org/mirrors/node-sass/'
:wq//保存退出
npm i -g node-sass

window:

yarn add -D node-sass@npm:sass
yarn global add sass

使用SCSS

  • 翻译scss成css
sass --watch scss-demo/scss:scss-demo/css
  • scss中使用PX2REM函数
@function px2rem($px){
    @return $px/$designWidht *100 + rem;
}
$designWidth : 640 ; //设计稿宽度

.child{
    width:px2rem(40);  //写px会自动转换为rem单位
    height:px2rem(20);
    margin:px2rem(5) px2rem(5)
}