资讯专栏INFORMATION COLUMN

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

Heier / 3368人阅读

摘要:下载或在项目中引入一般情况在中引入设置标签视情况而定安装或在中配置,在项目文件中找到,将添加到中,,下的根据设计稿而定具体如下编译新加由于设计稿是添加到里面省略项目中使用假设设计稿和分别是,具体代码

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标签(视情况而定)


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 = {}));

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/102167.html

相关文章

  • webpack手动构建vuevue-cli构建使用 px2rem-loader ,全局自动转换px

    摘要:做移动端时,适配是必须的。使用单位,可在不同屏幕上完美显示相同的布局。文件首先要把转成正常的,在交给来做,所以是外还需要加上一个设计稿宽度表示转换过程小数保留几位。安装配置结束后,重启项目。会发现自己设置的被转为了。 做移动端时,适配 是必须的。使用rem单位,可在不同屏幕上完美显示相同的布局。px2rem 插件方便的将px单位转为了rem。 1. 自己手动构建vue webpck配置...

    AWang 评论0 收藏0
  • vue-cli 配置flexible

    摘要:一般需用这个在后面添加会根据的不同,生成三套代码。如果明白了这些方法,就没必要再配置的了,因为下面的方法更容易控制外部引入的是否需要转,而更改就控制不了了,它会强制转换。能正常转换不能正常转换不能正常转换 基于vue-cli配置手淘的lib-flexible + rem,实现移动端自适应 没接触过flexible的建议先看看大漠的这篇文章这样你才会知道长度为什么用rem,而字体要用px...

    caoym 评论0 收藏0
  • vuevue-cli构建使用 px2rem-loader ,全局自动转换px单位,完美解决引入第三

    摘要:使用的小伙伴儿会用到淘宝的开源的适配方案去轻松的完成适配,这也是我最喜欢的,但是使用这个方案时,你引入第三方库时样式会变小。。这个坑难的我不行,各种百度,各种想法,差一点就放弃了这个方案。 最近公司的的项目赶,作为前端的小白懒出新的高度,使出专业的技能 --复制粘贴!!(改别人的代码也是煎熬)我经常做一些H5页面,这样就会遇到适配这个头疼的问题,我分享下我用经常用到的适配方案: 这里...

    CodeSheep 评论0 收藏0
  • vuevue-cli构建使用 px2rem-loader ,全局自动转换px单位,完美解决引入第三

    摘要:使用的小伙伴儿会用到淘宝的开源的适配方案去轻松的完成适配,这也是我最喜欢的,但是使用这个方案时,你引入第三方库时样式会变小。。这个坑难的我不行,各种百度,各种想法,差一点就放弃了这个方案。 最近公司的的项目赶,作为前端的小白懒出新的高度,使出专业的技能 --复制粘贴!!(改别人的代码也是煎熬)我经常做一些H5页面,这样就会遇到适配这个头疼的问题,我分享下我用经常用到的适配方案: 这里...

    monw3c 评论0 收藏0
  • vuevue-cli构建使用 px2rem-loader ,全局自动转换px单位,完美解决引入第三

    摘要:使用的小伙伴儿会用到淘宝的开源的适配方案去轻松的完成适配,这也是我最喜欢的,但是使用这个方案时,你引入第三方库时样式会变小。。这个坑难的我不行,各种百度,各种想法,差一点就放弃了这个方案。 最近公司的的项目赶,作为前端的小白懒出新的高度,使出专业的技能 --复制粘贴!!(改别人的代码也是煎熬)我经常做一些H5页面,这样就会遇到适配这个头疼的问题,我分享下我用经常用到的适配方案: 这里...

    loostudy 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<