资讯专栏INFORMATION COLUMN

如何在vue中实现px自动转换成rem,实现多手机的尺寸适配问题?

xiaoxiaozi / 2269人阅读

摘要:安装插件在终端执行在中配置使用适配倍屏,倍屏的封装的将根据已有的标签来设置缩放比例下,对于和的屏,用倍的方案,其余的用倍方案其他设备下,仍旧使用倍的方案在入口文件中引入在中就可以愉快的编写啦,使用,下面上传

1.安装插件postcss-px2rem
在终端执行:npm install postcss-px2rem --save
2.在build/vue-loader.conf.js 中配置使用postcss-px2rem

module.exports = {
  loaders: utils.cssLoaders({
    sourceMap: isProduction
      ? config.build.productionSourceMap
      : config.dev.cssSourceMap,
    extract: isProduction
  }),
  postcss: [
    require("autoprefixer")({browsers: ["iOS >= 7", "Android >= 4.1"]}),
    require("postcss-px2rem")({remUnit: 75, "baseDpr":2})

  ],
  transformToRequire: {
    video: "src",
    source: "src",
    img: "src",
    image: "xlink:href"
  }
}

3.适配2倍屏,3倍屏的封装的flex.js

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

4.在入口文件main.js中引入flex.js

import "@/assets/js/flex.js";
import Vue from "vue";

import App from "./App";

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: "#app",
  render: h => h(App)
})

5.在css 中就可以愉快的编写css啦,使用px ,下面上传使用代码;

#app {
  width: 200px;
  height: 400px;
  background: red;
}

职场小白south Joe,望各位大神批评指正,祝大家学习愉快!

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

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

相关文章

  • 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
  • rem, vw, 还是...? 各凭本事移动端适配方案

    摘要:另一种就是不缩放,对等问题单独引入处理方案。彩蛋部分相信大多数同学也是有想法在实际开发中把融入到现有的移动端适配方案中的。 前言 2018年最后的法定假期都已经结束了,我相信大部分正在进行或曾经进行过移动端页面开发的同学都或多或少的了解过使用rem进行移动端页面适配的方案以及使用vw的方案,(没了解过的同学可以参见大漠老师的这两篇文章 使用Flexible实现手淘H5页面的终端适配和再...

    wangbinke 评论0 收藏0

发表评论

0条评论

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