在vue中移动端适配

347 阅读2分钟

一、使用postcss-px-to-viewport

1、下载

npm install postcss-px-to-viewport --save

2、在src的同级处创建 postcss.config.js

/**
 * @Author:
 * @Date: 2020-11-13 14:49:46
 * @LastEditors:
 * @LastEditTime: 2020-11-13 14:56:09
 * @FilePath: /根目录/postcss.config.js
 * @Description: 这个是移动端 适配,把px转换为vw
 * 参考博客:https://juejin.cn/post/6844903903478153224 *
            https://blog.csdn.net/yihanzhi/article/details/107855316
 */
module.exports = {
    plugins: {
        autoprefixer: {},
        'postcss-px-to-viewport': {
            viewportWidth: 750,//设计搞宽度
            unitPrecision: 3,
            viewportUnit: 'vw',
            minPixelValue: 1,// 小于或等于`1px`不转换为视窗单位
            exclude: /(\/|\\)(node_modules)(\/|\\)/// 设置忽略文件,用正则做目录名匹配(这个是忽略了node_modules里面的所有文件,所以当你使用了vantUI的时候,它不会给你改变VantUI的适配,VantUI的设计稿是370 的)
            mediaQuery: false  // 允许在媒体查询中转换`px`
        }
    }
}

注:这样就可以 完成移动端的适配了。

这样就可以写px了,UI设计图上的px是多少,你就写多少。

二、postcss-pxtorem加amfe-flexible

1、使用amfe-flexible

/**
* 1、npm下载:
* npm install amfe-flexible --save
* 下载完成后在main.js中引入 :import 'amfe-flexible';
* 2、直接拷贝下面的js文件,在main.js中引入 :import 'amfe-flexible';
* 二选其一
*/
(function flexible(window, document) {
    var docEl = document.documentElement
    var dpr = window.devicePixelRatio || 1

    // adjust body font size
    function setBodyFontSize() {
        if (document.body) {
            document.body.style.fontSize = (12 * dpr) + 'px'
        }
        else {
            document.addEventListener('DOMContentLoaded', setBodyFontSize)
        }
    }
    setBodyFontSize();

    // set 1rem = viewWidth / 10
    function setRemUnit() {
        /**  
        * 下面这块代表是把屏幕分成二十四等份
        * 这块可以自己修改(也就是屏幕宽度为1920px,分成24等份,每份80px,即就是 1rem就是80 px)
        * 1920px也就是设计稿宽度。
       */
        var rem = docEl.clientWidth / 24//这块默认是10等份
        docEl.style.fontSize = rem + 'px'
    }

    setRemUnit()

    // reset rem unit on page resize
    window.addEventListener('resize', setRemUnit)
    window.addEventListener('pageshow', function (e) {
        if (e.persisted) {
            setRemUnit()
        }
    })

    // detect 0.5px supports
    if (dpr >= 2) {
        var fakeBody = document.createElement('body')
        var testElement = document.createElement('div')
        testElement.style.border = '.5px solid transparent'
        fakeBody.appendChild(testElement)
        docEl.appendChild(fakeBody)
        if (testElement.offsetHeight === 1) {
            docEl.classList.add('hairlines')
        }
        docEl.removeChild(fakeBody)
    }
}(window, document))

2、下载postcss-pxtorem

# 这个要装5.1.1版本的
npm i postcss-pxtorem@5.1.1  --save

3、postcss-pxtorem 配置步骤

注:在vue.config.js、.postcssrc.js、postcss.config.js其中之一配置,权重从左到右降低。

1)在vue.config.js

module.exports = {
    lintOnSave: false,
    css: {
        loaderOptions: {
            postcss: {
                plugins: [
                    require('postcss-pxtorem')({
                        // 换算基数 
                        rootValue: 37.5,
                        /**
                         * 哪些需要进行px转rem
                         * * 是全部转换
                         */
                        propList: ['*'],
                        /**
                         * 默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module)/ 。如果想把前端UI框架内的px也转换成rem,请把此属性设为默认值
                         * /(\/|\\)(node_modules)(\/|\\)/,  这个事匹配vant
                         */
                        exclude: /(node_module)/,
                        // 排除哪些开头的,如 .exclude 等等
                        selectorBlackList: ['exclude'],
                        mediaQuery: false,  //(布尔值)允许在媒体查询中转换px。
                        // 最小转换,如低于 4px的不会进行转成rem
                        minPixelValue: 4
                    })
                ]
            }
        }
    }
}

2)在.postcssrc.js或postcss.config.js中配置如下

module.exports = {
    "plugins": {
        'postcss-pxtorem': {
            rootValue: 37.5,
            propList: ['*']
        }
    }
}