美文网首页
移动端 rem 布局

移动端 rem 布局

作者: 前端小白的摸爬滚打 | 来源:发表于2021-07-28 08:03 被阅读0次

    关于移动端布局的一些思考:

    问题 1:为什么设计师给的设计稿总是 640px 或 750px(现在一般以 Phone6 为基准,给的 750px)

    问题 2:为什么我们拿到 640px 和 750px 的设计稿,在编码的时候都要除以 2,

    (比如设计稿上有一个图标宽高是 4040,我们需要先除以 2,实际编码时候宽高要写成 2020)

    1033257-20180906100351775-1261095461.png

    关键就是要搞清楚 px 和 pt

    • pt:逻辑像素或逻辑分辨率

    相当于我们用浏览器模拟调试移动端时看到的各手机的像素,如下图 iPhone6 看到的宽高 375*667,

    这个就是逻辑像素,也可以看做是一个长度单位 (我们在 CSS 中设置的像素也是逻辑像素)

    • px:物理像素或物理分辨率,又被称为设备像素

    图中的 750*1334 就是物理像素,它不能看做是一个长度单位,可以看做是一个点,即像素点

    • 结论:pt 和 px 的关系就是—— 1pt 里面有几个像素点

    (比如 1pt 里面有 1 个 px,也可以有 2 个,3 个,分别对应上图的@1x,@2x,@3x

    所以为什么设计稿 640px 和 750px 要除以 2,就是因为设计师给的 640px 和 750px 是物理像素

    而我们在浏览器模拟调试移动端的时候看到的像素是逻辑像素

    (function (doc, win) {
      var docEl = doc.documentElement, //document文档对象
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize', //窗口旋转或者大小改变 事件
        recalc = function () {
          var clientWidth = docEl.clientWidth; //页面宽度
          if (!clientWidth) return;
          // 1rem 就是 50px (对于宽度是375px的设备来说) === 物理像素的100px 优点就是在设备宽度是375的设备上 我们的 rem的值可以直接
          // 使用设计稿的像素/100即可
          docEl.style.fontSize = 100 * (clientWidth / 750) + 'px';
        };
    
      if (!doc.addEventListener) return;
      win.addEventListener(resizeEvt, recalc, false); //绑定窗口变化事件(设置根字体)
      doc.addEventListener('DOMContentLoaded', recalc, false);//绑定页面装载成功的事件(设置根字体)
    })(document, window);
    

    我们想要的结果很简单: 一个元素的宽度(px) / 屏幕宽度(px) = 定值 (这个定值就是设计稿上面的值比例定值);

    ——所以要做就是:屏幕变宽,要让元素宽度就变宽。

    移动端适配 rem 和 vw

    vw 是屏幕宽度的百分之一

    1. 就是开发的时候用的 750 设计稿的尺寸;单位是 px;

    2. 然后编译工具,如 postcss 会自动将 px 单位转成对应 rem 和 vw 单位;

    3. 如果是 vw 很好转,比如写的 40px;40/750 vw 就完了;

    4. 如果是 rem 就多一步罢了;要用 js 计算出根字体大小,并设置给 html;

    正常是屏幕大小 375px ,字体大小 16px;所以比例常数就是 : 屏幕尺寸/750*32 ,也就是 html 根字体 大小

    40px 的 rem 就是: 40/(屏幕尺寸/750*32)

    动态改变(屏幕尺寸/750*32) 这个 根字体 就可以动态适应屏幕了

    这是方案的基础理论,在这个基础上,我们还要搞明白,到底要干一件什么事情!

    目标一 、手机适配:就是页面上的尺寸,无论高度,还是宽度,还有字体,随屏幕的宽度变化!这里是屏幕宽度!是不是想到了 vw,对,就是这个意思;——最大程度在各个尺寸屏幕上还原设计稿

    目标二、px 转换成 rem:一般 UI 给的设计稿宽度大小是 750,所以,我们想直接写上面 UI 标记的尺寸;——最大程度减少工作

    为什么选择 rem?

    很久之前没有 vw,怕 vw 的兼容问题,就用了 rem;也就是:rem 的兼容性>vw 的兼容性;(vw 的适配方案!非常简单!);

    结合 postcss 自动帮我们计算 rem

    在项目根目录下添加.postcssrc.js 文件,在里面写上

    module.exports = { plugins: { 'postcss-pxtorem': { rootValue: 32, propList: ['*'], minPixelValue: 2 } }};
    

    就完了。简单解释下,免得你们百度半天,建议自己在 npm 官网上看 postcss-pxtorem 的文档。rootValue,这里就是根目录的字体大小是 32px,这里为啥设置成 32 呢,因为一般设计稿是 750,比 iphone6 的大一倍,所以设置成 16 的两倍,就是 32px 这样我们就可以直接在代码里写设计稿上的 css 大小了;proplist 就是那些属性需要转换成 rem,这里是全部的意思;

    minPixelValue 就是最小转换单位,这是最小转换单位是 2px 的意思;

    或者使用 vscode 插件 cssrem,默认是1rem = 16px

    修改rootFontSize为32px


    1423556-20200815004429739-573251919.png

    注意:修改之后需要重启vscode

    (function() {
    
        function autoRootFontSize() {
    
            document.documentElement.style.fontSize =        Math.min(screen.width,document.documentElement.getBoundingClientRect().width)  /  750 * 32 + 'px';
    
              // 取screen.width和document.documentElement.getBoundingClientRect().width的最小值;除以750,乘以32;懂的起撒,就是原本是750大小的32px;如果屏幕大小变成了375px,那么字体就是16px;也就是根字体fontSize大小和屏幕大小成正比变化!是不是很简单
    
        }
    
        window.addEventListener('resize', autoRootFontSize);
    
        autoRootFontSize();
    
    })();
    

    相关文章

      网友评论

          本文标题:移动端 rem 布局

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