使用postcss-pxtorem插件适配移动端

1,194 阅读2分钟

使用postcss-pxtorem插件适配移动端

1.安装插件postcss-pxtorem

npm install postcss-pxtorem --save-dev

2.webpack配置

// vue.config.js
module.exports = {
  css: {
        loaderOptions: {
          postcss: {
                plugins: [
                    // 兼容浏览器,添加前缀
                    require('autoprefixer')({
                        overrideBrowserslist: [
                            'Android 4.1',
                            'iOS 7.1',
                            'Chrome > 31',
                            'ff > 31',
                            'ie >= 8',
                            //'last 10 versions', // 所有主流浏览器最近10版本用
                        ],
                        grid: true,
                    }),
                    require('postcss-pxtorem')({
                        rootValue: 192, // 根标签font-size,默认1920px宽度下192px
                        exclude: /(node_module|public)/, //默认false,可以(reg)利用正则表达式排除某些文件夹的方法,例如/(node_module|src)/
                        propList: ['*'], //是一个存储哪些将被转换的属性列表,这里设置为["*"]全部,假设需要仅对边框进行设置,可以写]['*','!border*']
                        //selectorBlackList :['.box'],//,那例如fs-xl类名,里面有关px的样式将不被转换,这里也支持正则写法。
                        replace: true, //替换包含rems的规则。
                        mediaQuery: false, //(布尔值)允许在媒体查询中转换px。
                        minPixelValue: 0, //设置要替换的最小像素值(3px会被转rem)。 默认 0
                    }),
                ],
            },
        }
  }
}

3.添加rem.js

// rem.js
// 是否是移动端访问
const isMobile = /Android|webOS|iPhone|iPod|BlackBerry/i.test(
    navigator.userAgent
);
// const isMobile = true;
console.log('是否是移动端访问', isMobile);
const baseSize = isMobile ? 280 : 192; // postcss-pxtorem的基底值,如果是移动端则稍微放大比例
window.baseSize = baseSize;
// 设置rem 函数
function setRem() {
    //计算出 比例来 当前分辨率的宽%设计稿宽度
    const scale = window.screen.width / 1920;
    // 给根元素设置font-size
    document.documentElement.style.fontSize =
        baseSize * Math.min(scale, 2) + 'px';
}
/**
 * 转化行间样式为rem
 * @param {string} px
 * @returns
 */
const px2rem = px => {
    if (/%/gi.test(px)) {
        // 有百分号%,特殊处理,表述pc是一个有百分号的数,比如:90%
        return px;
    } else {
        return parseFloat(px) / 192 + 'rem'; // 和postcss-pxtorem插件配置的rootValue值对应
    }
};
setRem();
window.addEventListener('resize', () => {
    setRem();
});

export { px2rem };

4.项目入口文件main.js引入rem.js

// main.js
import '@/utils/rem.js'

注意:行间样式不会自动转化,需要手动调用

5.行间样式需要手动转化

<template>
  <div :style="styleObj"></div>
</template>

<script>
import { px2rem } from '@/utils/rem.js'
const styleObj = {
  width: px2rem('100px'),
  height: px2rem('100px')
}
</script>