zoukankan      html  css  js  c++  java
  • rem

    移动端rem必备

    不会讲什么屏幕像素等等知识,网上太多了。

    推荐这个下面这个。

    devicePixelRatio简单介绍:http://www.zhangxinxu.com/wordpress/2012/08/window-devicepixelratio/

    然后再分享两段rem代码。

    以iphone6为准,dpr(devicePixelRatio)是2,手机宽度是375px。  

    设计稿的宽度是750。   所以1rem等于40px。

    下面分享代码

    代码1:

     1 ;(function (doc, win) {
     2     var docEl = doc.documentElement,
     3         resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
     4         recalc = function () {
     5             console.log(doc);
     6             var clientWidth = docEl.clientWidth;
     7             console.log(clientWidth);
     8             // if(typeof(clientWidth)=='number' && clientWidth < 750){  //手机端自适应,   基础20
     9             if(typeof(clientWidth)=='number' && clientWidth < 750 && clientWidth>319){  //手机端自适应,   基础20
    10                 docEl.style.fontSize = 20 * (clientWidth / 375) + 'px';
    11             }else if(typeof(clientWidth)=='number' && clientWidth>750){   //pc端基础为40/2  20 手机端的适配
    12                 docEl.style.fontSize = '40'+'px';
    13             }
    14         };
    15 
    16     if (!doc.addEventListener) return;
    17     win.addEventListener(resizeEvt, recalc, false);
    18     doc.addEventListener('DOMContentLoaded', recalc, false);
    19     recalc();
    20 })(document, window);
    21 
    22 
    23 /*
    24  *
    25  * 以750为准。
    26  * 当宽度大于等于750时
    27  * 1rem =40px
    28  * */
    View Code

    代码2:

     1 ;(function(win) {
     2     var remCalc = {};
     3     var docEl = win.document.documentElement,
     4         tid;
     5 
     6     function refreshRem() {
     7         // 获取当前窗口的宽度
     8         var width = docEl.getBoundingClientRect().width;
     9         // 大于640px 按640算
    10         if (width > 750) { width = 750 }
    11         // 把窗口的宽度固定分为10份 也就是10rem
    12         // 按视觉稿640算  640/10=64px  那么1rem = 64px
    13         // 640视觉中 80px*80px的按钮 转换为rem  80/64 = 1.25rem
    14         // 按钮的宽高固定为  1.25rem * 1.25rem
    15         // 当窗口宽度缩放为 320px的时候
    16         // 那么 1rem = 32px
    17         // 原来 80px*80px的按钮现在变为 1.25rem * 32px = 40px
    18         // 按钮变为 40px * 40px
    19         // 其他宽度也类似
    20         //
    21         // cms做法也类似
    22         // 只是我们把窗口宽度固定分为 6.4份,即6.4rem
    23         // 所以 1rem = 100px
    24         // 640视觉中 80px*80px的按钮 转换为rem  80/100 = 0.8rem
    25         // ....其他也差不多
    26         //
    27         //
    28         // 对比
    29         // 其实也就是计算rem的问题 视觉稿量出来的值  除64 或 100的问题
    30         // 除100 总比 除64 好口算
    31         // 就算用sass写个 @function px2rem代替口算
    32         // .8rem 总比输入 px2rem(80)少几个字符
    33         //
    34         //
    35         var rem = width / 18.75;  // cms 只要把这行改成  var rem = width /640 * 100
    36         docEl.style.fontSize = rem + "px";
    37         remCalc.rem = rem;
    38         //误差、兼容性处理
    39         var actualSize = parseFloat(window.getComputedStyle(document.documentElement)["font-size"]);
    40         if (actualSize !== rem && actualSize > 0 && Math.abs(actualSize - rem) > 1) {
    41             var remScaled = rem * rem / actualSize;
    42             docEl.style.fontSize = remScaled + "px"
    43         }
    44     }
    45 
    46     //函数节流,避免频繁更新
    47     function dbcRefresh() {
    48         clearTimeout(tid);
    49         tid = setTimeout(refreshRem, 100)
    50     }
    51 
    52     //窗口更新动态改变font-size
    53     win.addEventListener("resize", function() { dbcRefresh() }, false);
    54 
    55     //页面显示的时候再计算一次   难道切换窗口之后再切换来窗口大小会变?....
    56     win.addEventListener("pageshow", function(e) {
    57         if (e.persisted) { dbcRefresh() }
    58     }, false);
    59     refreshRem();
    60     remCalc.refreshRem = refreshRem;
    61     remCalc.rem2px = function(d) {
    62         var val = parseFloat(d) * this.rem;
    63         if (typeof d === "string" && d.match(/rem$/)) { val += "px" }
    64         return val
    65     };
    66     remCalc.px2rem = function(d) {
    67         var val = parseFloat(d) / this.rem;
    68         if (typeof d === "string" && d.match(/px$/)) { val += "rem" }
    69         return val
    70     };
    71     win.remCalc = remCalc
    72 })(window);
    73 
    74 
    75 /*
    76 *
    77 * 以750为准。
    78 * 当宽度大于等于750时
    79 * 1rem =40px
    80 * */
    View Code
  • 相关阅读:
    django admin日期变为可以修改
    djangoadmin模块
    mac添加oh my zsh
    Dockerfile文件详解
    CC++初学者编程教程(4) 安装Oracle12c于Windows Sever2012
    Keli Linux与网络安全(2)——初探Keli
    Keli Linux与网络安全(1)——在VMWare中安装Keli系统
    C语言的本质(12)——指针与函数
    C语言的本质(11)——指针与数组
    C语言的本质(10)——指针本质
  • 原文地址:https://www.cnblogs.com/huoan/p/7684199.html
Copyright © 2011-2022 走看看