1. 什么是postcss
PostCSS是一个使CSS更容易,更灵活,更快速工作的工具。PostCSS 不是 一个“真正的”预处理器。PostCSS相当于一个CSS解析器,框架或API,它允许我们使用可以完成各种任务的插件。 它本身没有任何插件,为了更改原始 CSS,我们必须添加至少一个插件。
2. vue中使用postcss
postcss-loader
Loader for webpack to process CSS with PostCSS
需要安装webpack loaderpostcss-loader才能使用postcss中的插件对css进行处理
webpack中配置
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader", "postcss-loader"]
},
{
test: /\.s[a|c]ss$/,
use: ['style-loader', 'css-loader', 'postcss-loader', 'sass-loader']
}
]
}
}
2.1 vue-cli
Vue CLI 内部使用了 PostCSS。
你可以通过
.postcssrc或任何postcss-load-config支持的配置源来配置 PostCSS。也可以通过vue.config.js中的css.loaderOptions.postcss配置postcss-loader。我们默认开启了
autoprefixer。如果要配置目标浏览器,可使用package.json的browserslist字段
2.2 手动创建
都是在根目录下创建
package.json
可以在package.json里添加postcss字段
{
"postcss": {
"plugins": {
// 各种插件
"postcss-plugin": {}
}
}
}
module.exports = ({ env }) => ({
...options
plugins: {
'postcss-plugin': env === 'production' ? {} : false
}
})
.postcssrc
或者在根目录下添加文件.postcssrc
It's recommended to use an extension (e.g .postcssrc.json or .postcssrc.yml) instead of .postcssrc
{
"plugins": {
// 各种插件
"postcss-plugin": {}
}
}
.postcssrc.js or postcss.config.js
如果需要逻辑处理,可以使用js文件
module.exports = {
plugins: {
'postcss-plugin': {}
}
}
3. 常用css插件总结
3.1 autoprefixer
PostCSS plugin to parse CSS and add vendor prefixes to CSS rules using values from Can I Use.
一句话,这是用来添加css前缀的插件
Browsers
Autoprefixer uses Browserslist, so you can specify the browsers you want to target in your project with queries like > 5%
Autoprefixer使用Browserslist,所以在项目中你可以标明你需要的浏览器类型,例如>5%
The best way to provide browsers is a .browserslistrc file in your project root, or by adding a browserslist key to your package.json
最好的方法就是在项目的根目录下添加一个.browserslistrc文件,或者在package.json里增加一个key值browserslist
webpack中使用
// webpack.base.conf.js
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: ["style-loader", "css-loader", "postcss-loader"]
}
]
}
}
然后添加一个postcss.config.js
module.exports = {
plugins: [
require('autoprefixer')
]
}
// or
module.exports = {
plugins: [
autoprefixer: {}
]
}
3.2 postcss-import
PostCSS plugin to transform @import rules by inlining content.
一款通过内联内容转换@import规则的PostCSS插件
This plugin should probably be used as the first plugin of your list
这个插件应该尽可能放在插件列表的第一位
// 个人理解就是实现把各个样式文件导进一个文件里的功能
* can consume `node_modules`, `web_modules` or local modules */
@import "cssrecipes-defaults"; /* == @import "../node_modules/cssrecipes-defaults/index.css"; */
@import "normalize.css"; /* == @import "../node_modules/normalize.css/normalize.css"; */
@import "foo.css"; /* relative to css/ according to `from` option above */
@import "bar.css" (min-width: 25em);
body {
background: black;
}
3.3 postcss-url
PostCSS plugin to rebase, inline or copy on url()
一个用来重置、内联或者复制url() 的postcss插件
3.4 postcss-nano
cssnano 是一个 PostCSS 插件,可以添加到你的构建流程中,用于确保最终生成的 用于生产环境的 CSS 样式表文件尽可能的小
3.5 postcss-pxtorem
A plugin for PostCSS that generates rem units from pixel units.
在根目录下添加配置文件:(vue.config.js权重高)
vue.config.js
module.exports = {
//...其他配置
css: {
loaderOptions: {
postcss: {
plugins: [
'postcss-pxtorem': {
rootValue: 16,
minPixelValue: 2,
propList: ['*'],
}
]
}
}
},
}
postcss.config.js
module.exports = {
plugins: {
'postcss-pxtorem': {
rootValue: 16,
minPixelValue: 2,
propList: ['*'],
}
}
}
- 配置参数
{
//rootValue 结果为:设计稿元素尺寸/16,比如元素宽320px,最终页面会换算成 20rem
rootValue: 16,
// 转换成rem后保留的小数点位数
unitPrecision: 5,
// 用来存放转换单位的属性的列表
// [*] 表示全部
// ['*position*'] 会匹配 background-position-y
// Use ! to not match a property. Example: ['*', '!letter-spacing']
// ['*', '!font*'] 不匹配font开头的属性
propList: ['font', 'font-size', 'line-height', 'letter-spacing'],
// 对匹配到的选择器进行筛选
// 如果只有字符串,例如['body'] 会匹配 .body-class
// [/^body$/] will match body but not .body,只能匹配到body标签
selectorBlackList: [],
// Replaces rules containing rems instead of adding fallbacks
// 是否直接更换属性值,而不添加备用属性
replace: true,
// 媒体查询里的单位是否需要转换单位
mediaQuery: false,
// 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
minPixelValue: 0,
// 转换时排除掉这些匹配到的文件
exclude: /node_modules/i
}
3.6 postcss-px-to-viewport
将px单位转换为视口单位的 (vw, vh, vmin, vmax) 的 PostCSS 插件
- 配置参数
{
// 需要转换的单位,默认为"px"
unitToConvert: 'px',
// 设计稿的视口宽度
viewportWidth: 320,
// 单位转换后保留的精度
unitPrecision: 5,
// 能转化为vw的属性列表,匹配规则同上
propList: ['*'],
// 希望使用的视口单位
viewportUnit: 'vw',
// 字体使用的视口单位
fontViewportUnit: 'vw',
// 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位
// 匹配规则同上
selectorBlackList: [],
minPixelValue: 1,
mediaQuery: false,
replace: true,
exclude: undefined,
// 如果设置了include,那将只有匹配到的文件才会被转换
include: undefined,
// 是否添加根据 landscapeWidth 生成的媒体查询条件 @media (orientation: landscape)
landscape: false,
// 横屏时使用的单位
landscapeUnit: 'vw',
// 横屏时使用的视口宽度
landscapeWidth: 568
}
- 使用
// 在postcss.config.js添加如下配置
module.exports = {
plugins: {
// ...
'postcss-px-to-viewport': {
// options
}
}
}