zoukankan      html  css  js  c++  java
  • Webpack px2rem-loader px转rem 前端移动端页面适配

    前端页面适配

    不同设备分辨率不一样,因此需要页面适配

    前端如何做页面适配?

    1. css媒体查询实现响应式布局
      这种方式的缺陷就是需要编写多套适配样式代码

    2. css3 rem单位
      W3C对rem的定义: font-sise of the root Element. 即根元素的fontsize大小
      rem: 相对单位
      px:绝对单位

    webpack配置px转rem

    使用px2rem-loader和手淘的lib-flexible库

    1. 安装
    npm i px2rem-loader@0.1.9 -D
    npm i lib-flexible@0.3.2 -S
    
    1. 配置webpack与flexible.js

    构建完之后px会自动转rem

    {
        loader:'px2rem-loader',
        options:{
            remUnit:75, // 1rem对应75px,比较适合750的视觉稿,750个像素对应10rem
            remPrecision:8 // px转rem小数点后面位数
        }
    }
    

    由于还不支持内联资源,因此只能将flexible.js手动导入到header标签中的script
    因为打开页面的时候需要根据页面分辨率计算根元素html的font-size,所以script标签要放在前面

    index.html

    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <script type="text/javascript">
            ; (function (win, lib) {
                var doc = win.document;
                var docEl = doc.documentElement;
                var metaEl = doc.querySelector('meta[name="viewport"]');
                var flexibleEl = doc.querySelector('meta[name="flexible"]');
                var dpr = 0;
                var scale = 0;
                var tid;
                var flexible = lib.flexible || (lib.flexible = {});
    
                if (metaEl) {
                    console.warn('将根据已有的meta标签来设置缩放比例');
                    var match = metaEl.getAttribute('content').match(/initial-scale=([d.]+)/);
                    if (match) {
                        scale = parseFloat(match[1]);
                        dpr = parseInt(1 / scale);
                    }
                } else if (flexibleEl) {
                    var content = flexibleEl.getAttribute('content');
                    if (content) {
                        var initialDpr = content.match(/initial-dpr=([d.]+)/);
                        var maximumDpr = content.match(/maximum-dpr=([d.]+)/);
                        if (initialDpr) {
                            dpr = parseFloat(initialDpr[1]);
                            scale = parseFloat((1 / dpr).toFixed(2));
                        }
                        if (maximumDpr) {
                            dpr = parseFloat(maximumDpr[1]);
                            scale = parseFloat((1 / dpr).toFixed(2));
                        }
                    }
                }
    
                if (!dpr && !scale) {
                    var isAndroid = win.navigator.appVersion.match(/android/gi);
                    var isIPhone = win.navigator.appVersion.match(/iphone/gi);
                    var devicePixelRatio = win.devicePixelRatio;
                    if (isIPhone) {
                        // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
                        if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
                            dpr = 3;
                        } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
                            dpr = 2;
                        } else {
                            dpr = 1;
                        }
                    } else {
                        // 其他设备下,仍旧使用1倍的方案
                        dpr = 1;
                    }
                    scale = 1 / dpr;
                }
    
                docEl.setAttribute('data-dpr', dpr);
                if (!metaEl) {
                    metaEl = doc.createElement('meta');
                    metaEl.setAttribute('name', 'viewport');
                    metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
                    if (docEl.firstElementChild) {
                        docEl.firstElementChild.appendChild(metaEl);
                    } else {
                        var wrap = doc.createElement('div');
                        wrap.appendChild(metaEl);
                        doc.write(wrap.innerHTML);
                    }
                }
    
                function refreshRem() {
                    var width = docEl.getBoundingClientRect().width;
                    if (width / dpr > 540) {
                        width = 540 * dpr;
                    }
                    var rem = width / 10;
                    docEl.style.fontSize = rem + 'px';
                    flexible.rem = win.rem = rem;
                }
    
                win.addEventListener('resize', function () {
                    clearTimeout(tid);
                    tid = setTimeout(refreshRem, 300);
                }, false);
                win.addEventListener('pageshow', function (e) {
                    if (e.persisted) {
                        clearTimeout(tid);
                        tid = setTimeout(refreshRem, 300);
                    }
                }, false);
    
                if (doc.readyState === 'complete') {
                    doc.body.style.fontSize = 12 * dpr + 'px';
                } else {
                    doc.addEventListener('DOMContentLoaded', function (e) {
                        doc.body.style.fontSize = 12 * dpr + 'px';
                    }, false);
                }
    
    
                refreshRem();
    
                flexible.dpr = win.dpr = dpr;
                flexible.refreshRem = refreshRem;
                flexible.rem2px = function (d) {
                    var val = parseFloat(d) * this.rem;
                    if (typeof d === 'string' && d.match(/rem$/)) {
                        val += 'px';
                    }
                    return val;
                }
                flexible.px2rem = function (d) {
                    var val = parseFloat(d) / this.rem;
                    if (typeof d === 'string' && d.match(/px$/)) {
                        val += 'rem';
                    }
                    return val;
                }
    
            })(window, window['lib'] || (window['lib'] = {}));
        </script>
    </head>
    
    <body>
        <div id="root"></div>
        <script src="./reactComp_f1b3d671.js" type="text/javascript"></script>
    </body>
    
    </html>
    

    引入完之后发现页面越宽相应的字体也就越大

  • 相关阅读:
    Yougth的最大化(好题,二分查找 0 1分数规划)
    Cable master(好题,二分)
    Can you find it?(二分 二分+STL set map)
    Can you solve this equation?(二分)
    Bridging signals(二分 二分+stl dp)
    A Bug's Life
    Is It A Tree?(并查集)
    简单计算器(栈)
    Linux学习之常用压缩命令(三)
    Linux系统之常用文件搜索命令
  • 原文地址:https://www.cnblogs.com/ltfxy/p/15328228.html
Copyright © 2011-2022 走看看