vue-cli中使用postcss-px-to-viewport 将px转换成vw

移动端适配方案中,可以使用vw作为页面中各元素的单位,以此来完成适配效果。下面我们来讲怎样在vue-cli 项目中使用 postcss-px-to-viewport插件。

前言

先来认识一下postcss,postcss是一个用 JavaScript 工具和插件转换 CSS 代码的工具。

postcss的作用:

  1. 兼容各个内核的浏览器,增强代码的可读性。autoprefixer 插件可以自动获取浏览器的流行度和能够支持的属性,并根据这些数据自动为 CSS 规则添加前缀。
  2. 解析浏览器不兼容的css新语法。postcss-preset-env 插件可以将现代 CSS 语法转换成大多数浏览器都能理解的东西。
  3. 避免全局css样式。通过使用postcss-modules ,不用担心命名太大众化而造成冲突太普通,只要用最有意义的名字就行了。
  4. 避免css代码中的错误。通过使用 stylelint 插件避免样式表中的错误,stylelint 是一个现代化 CSS 代码检查工具。它支持最新的 CSS 语法,包括类似 CSS 的语法,例如 SCSS 。
  5. 强大的网格系统。lostgrid 插件利用 calc() 和你所定义的分割方式来创建网格系统,无需传递大量参数。

postcss-px-to-viewport

postcss-px-to-viewport,可以将px单位自动转换成viewport单位(vw表示屏幕的1%)。

1. 安装

npm install postcss-px-to-viewport --save-dev
或者使用yarn安装
yarn add postcss-px-to-viewport -D

2. 配置

在vue-cli 项目根目录下新建vue.config.js配置文件,在该文件中写入如下内容

const pxtovw = require('postcss-px-to-viewport');

module.exports={
    css:{
        loaderOptions:{
            sass:{
                //给sass-loader传递选项
            },
            css:{
                //给css-loader传递选项
            },
            postcss:{
                //给postcss-loader传递选项
                plugins:[
                    new pxtovw({
                        unitToConvert: 'px', //需要转换的单位,默认为"px";
					    viewportWidth: 375, //设计稿的视口宽度
					    unitPrecision: 5, //单位转换后保留的小数位数
					    propList: ['*'], //要进行转换的属性列表,*表示匹配所有,!表示不转换
					    viewportUnit: 'vw', //转换后的视口单位
					    fontViewportUnit: 'vw', //转换后字体使用的视口单位
					    selectorBlackList: [], //不进行转换的css选择器,继续使用原有单位
					    minPixelValue: 1, //设置最小的转换数值
					    mediaQuery: false, //设置媒体查询里的单位是否需要转换单位
					    replace: true, //是否直接更换属性值,而不添加备用属性
					    exclude: [/node_modules/] //忽略某些文件夹下的文件
                    })
                ]
            }
        }
    }
}

设置配置文件后,需要重新启动项目。

可能遇到的问题:
插件会将所有样式的px转换成vw,如果引入了第三方UI,也会被转化。可以使用selectorBlackList 属性来进行过滤。如果个别地方不想转换为vw,可以简单的使用大写的PX或者Px或者pX。

3. 效果

使用前:
在这里插入图片描述
npm run serve 启动项目,就可以看到项目中的单位全部转换成了vw
在这里插入图片描述

4. 配置参数详解:

  • unitToConvert (String),需要转换的单位,默认为"px"
  • viewportWidth (Number),设计稿的视口宽度
  • unitPrecision (Number),单位转换后保留的精度
  • propList (Array),能转化为vw的属性列表
    • 传入特定的CSS属性;
    • 可以传入通配符""去匹配所有属性,例如:[’’];
    • 在属性的前或后添加"*",可以匹配特定的属性. (例如[‘position’] 会匹配 background-position-y)
    • 在特定属性前加 “!”,将不转换该属性的单位 . 例如: [’*’, ‘!letter-spacing’],将不转换letter-spacing
    • “!” 和 ""可以组合使用, 例如: [’’, ‘!font*’],将不转换font-size以及font-weight等属性
  • viewportUnit (String),希望使用的视口单位
  • fontViewportUnit (String),字体使用的视口单位
  • selectorBlackList (Array),需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
    • 如果传入的值为字符串的话,只要选择器中含有传入值就会被匹配
    • 例如 selectorBlackList 为 [‘body’] 的话, 那么 .body-class 就会被忽略
    • 如果传入的值为正则表达式的话,那么就会依据CSS选择器是否匹配该正则
    • 例如 selectorBlackList 为 [/^body$/] , 那么 body 会被忽略,而 .body 不会
  • minPixelValue (Number),设置最小的转换数值,如果为1的话,只有大于1的值会被转换
  • mediaQuery (Boolean),媒体查询里的单位是否需要转换单位,@keyframes和media里的px默认是不转化的,设置该属性为true,则媒体查询里的单位会转成vw。
  • replace (Boolean),是否直接更换属性值,而不添加备用属性
  • exclude (Array or Regexp),忽略某些文件夹下的文件或特定文件,例如 ‘node_modules’ 下的文件
    • 如果值是一个正则表达式,那么匹配这个正则的文件会被忽略
    • 如果传入的值是一个数组,那么数组里的值必须为正则
  • landscape (Boolean) 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
  • landscapeUnit (String) 横屏时使用的单位
  • landscapeWidth (Number) 横屏时使用的视口宽度
发布了138 篇原创文章 · 获赞 51 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Charissa2017/article/details/105420971
今日推荐