说说vue-cli中使用flexible和px2rem-loader

栏目: Node.js · 发布时间: 5年前

内容简介:1,在项目build文件中找到util.js,将px2rem-loader添加到cssLoaders中,2,px2rem-loader 下的 remUnit 根据设计稿而定具体如下:

1.下载lib-flexible

npm i lib-flexible --save
或
yarn add lib-flexible

2.在项目中引入lib-flexible 一般情况在(main.js中引入lib-flexible)

import 'lib-flexible/flexible'

3.设置meta标签(视情况而定)

<meta name="viewport" content="width=device-width, initial-scale=1.0">

4.安装px2rem-loader

npm install px2rem-loader   --save
或
yarn add px2rem-loader

5.在webpack中配置px2rem-loader

1,在项目build文件中找到util.js,将px2rem-loader添加到cssLoaders中,

2,px2rem-loader 下的 remUnit 根据设计稿而定

具体如下:

exports.cssLoaders = function (options) {
  options = options || {}

  const cssLoader = {
    loader: 'css-loader',
    options: {
      minimize: process.env.NODE_ENV === 'production',
      sourceMap: options.sourceMap
    }
  }
  //rem编译(新加px2)
  const px2remLoader = {
    loader: 'px2rem-loader',
    options: {
      remUnit: 75 // 由于设计稿是750
    }
  }

  function generateLoaders (loader, loaderOptions) {
    var loaders = [cssLoader,px2remLoader]//添加到loader里面
    省略.....
  }
}

6.项目中使用

假设设计稿width和font-size分别是200px,50px

具体代码:(按照设计稿写即可)

.demo{
    width: 200px;
    font-size: 50px;
}

7.单独使用flexible可直接添加一个rem.js文件,具体如下:

1,配合less,sass和stylus来做px转换rem

2,具体可参看css编译

/*
** 移动端自适应方案  FROM 手淘
*/
export const setViewport = (()=>{//此处是单独使用
    const win = window
    const lib = window.lib || (window.lib = {})
//;(function(win, lib) {//此处是直接使用
    let doc = win.document;
    let docEl = doc.documentElement;
    let metaEl = doc.querySelector('meta[name="viewport"]');
    let flexibleEl = doc.querySelector('meta[name="flexible"]');
    let dpr = 0;
    let scale = 0;
    let tid;
    let flexible = lib.flexible || (lib.flexible = {});
    
    if (metaEl) {
        //console.warn('将根据已有的meta标签来设置缩放比例');
        let match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
        if (match) {
            scale = parseFloat(match[1]);
            dpr = parseInt(1 / scale);
        }
    } else if (flexibleEl) {
        let content = flexibleEl.getAttribute('content');
        if (content) {
            let initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
            let 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) {
        //let isAndroid = win.navigator.appVersion.match(/android/gi);
        let isIPhone = win.navigator.appVersion.match(/iphone/gi);
        let 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 {
            let wrap = doc.createElement('div');
            wrap.appendChild(metaEl);
            doc.write(wrap.innerHTML);
        }
    }

    function refreshRem(){
        let width = docEl.getBoundingClientRect().width;
        if (width / dpr > 540) {
            width = 540 * dpr;
        }
        let 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() {
            doc.body.style.fontSize = 12 * dpr + 'px';
        }, false);
    }

    refreshRem();

    flexible.dpr = win.dpr = dpr;
    flexible.refreshRem = refreshRem;
    flexible.rem2px = function(d) {
        let val = parseFloat(d) * this.rem;
        if (typeof d === 'string' && d.match(/rem$/)) {
            val += 'px';
        }
        return val;
    };
    flexible.px2rem = function(d) {
        let val = parseFloat(d) / this.rem;
        if (typeof d === 'string' && d.match(/px$/)) {
            val += 'rem';
        }
        return val;
    };

});
//})(window, window.lib || (window.lib = {}));

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

SQL基础教程

SQL基础教程

MICK / 孙淼、罗勇 / 人民邮电出版社 / 2013-8-1 / CNY 69.00

本书介绍了关系数据库以及用来操作关系数据库的SQL语言的使用方法,提供了大量的示例程序和详实的操作步骤说明,读者可以亲自动手解决具体问题,循序渐进地掌握SQL的基础知识和技巧,切实提高自身的编程能力。在每章结尾备有习题,用来检验读者对该章内容的理解程度。另外本书还将重要知识点总结为“法则”,方便大家随时查阅。 本书适合完全没有或者具备较少编程和系统开发经验的初学者,也可以作为大中专院校的教材......一起来看看 《SQL基础教程》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具