Autoprefixer #

Autoprefixer 是最流行的 PostCSS 插件,它根据 Can I Use 的数据自动添加浏览器前缀,让开发者无需关心浏览器兼容性问题。

什么是 Autoprefixer? #

工作原理 #

text
┌─────────────────────────────────────────────────────────────┐
│                   Autoprefixer 工作流程                      │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  CSS 输入                                                   │
│     │                                                       │
│     ▼                                                       │
│  ┌──────────────────┐                                       │
│  │  解析 CSS 属性    │                                       │
│  └────────┬─────────┘                                       │
│           │                                                 │
│           ▼                                                 │
│  ┌──────────────────┐                                       │
│  │ 查询 Can I Use   │                                       │
│  │ 数据库           │                                       │
│  └────────┬─────────┘                                       │
│           │                                                 │
│           ▼                                                 │
│  ┌──────────────────┐                                       │
│  │ 匹配浏览器列表    │                                       │
│  │ (browserslist)   │                                       │
│  └────────┬─────────┘                                       │
│           │                                                 │
│           ▼                                                 │
│  ┌──────────────────┐                                       │
│  │ 添加必要的前缀    │                                       │
│  └────────┬─────────┘                                       │
│           │                                                 │
│           ▼                                                 │
│  CSS 输出                                                   │
│                                                             │
└─────────────────────────────────────────────────────────────┘

为什么需要 Autoprefixer? #

css
/* 手动添加前缀(繁琐且容易遗漏) */
.button {
  display: -webkit-box;
  display: -webkit-flex;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -webkit-justify-content: center;
  -ms-flex-pack: center;
  justify-content: center;
  -webkit-box-align: center;
  -webkit-align-items: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

/* 使用 Autoprefixer(简洁) */
.button {
  display: flex;
  justify-content: center;
  align-items: center;
  user-select: none;
}

安装与配置 #

安装 #

bash
npm install autoprefixer --save-dev

基本配置 #

javascript
// postcss.config.js
module.exports = {
  plugins: [
    require('autoprefixer')
  ]
}

带选项配置 #

javascript
// postcss.config.js
module.exports = {
  plugins: [
    require('autoprefixer')({
      overrideBrowserslist: ['> 1%', 'last 2 versions'],
      grid: true,
      flexbox: true
    })
  ]
}

配置选项 #

overrideBrowserslist #

指定目标浏览器:

javascript
require('autoprefixer')({
  overrideBrowserslist: [
    '> 1%',           // 全球使用率大于 1%
    'last 2 versions', // 每个浏览器的最后 2 个版本
    'not dead',       // 排除已停止维护的浏览器
    'not ie 11'       // 排除 IE 11
  ]
})

常用浏览器查询 #

查询 说明
> 1% 全球使用率大于 1%
> 1% in CN 中国使用率大于 1%
last 2 versions 每个浏览器的最后 2 个版本
last 2 Chrome versions Chrome 最后 2 个版本
not dead 排除已停止维护的浏览器
not ie 11 排除 IE 11
since 2020 2020 年后发布的版本
iOS 7 iOS 7
Firefox ESR Firefox 长期支持版
defaults 默认配置(> 0.5%, last 2 versions, Firefox ESR, not dead)

grid 选项 #

控制 CSS Grid 前缀:

javascript
require('autoprefixer')({
  grid: true,  // 启用 Grid 前缀
  // 或
  grid: 'autoplace'  // 自动放置 Grid 项目
})
css
/* 输入 */
.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
}

/* 输出(grid: true) */
.container {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: 1fr 20px 1fr;
  grid-template-columns: 1fr 1fr;
  gap: 20px;
}

flexbox 选项 #

控制 Flexbox 前缀:

javascript
require('autoprefixer')({
  flexbox: true,       // 启用所有 Flexbox 前缀
  // 或
  flexbox: 'no-2009'   // 不添加 2009 年旧版 Flexbox 前缀
})

remove 选项 #

控制是否移除过时的前缀:

javascript
require('autoprefixer')({
  remove: true,   // 移除过时的前缀(默认)
  remove: false   // 保留所有前缀
})

supports 选项 #

控制是否添加 @supports 前缀:

javascript
require('autoprefixer')({
  supports: true   // 添加 @supports 前缀(默认)
})

browserslist 配置 #

配置文件方式 #

创建 .browserslistrc 文件:

text
# .browserslistrc
> 1%
last 2 versions
not dead
not ie 11

package.json 方式 #

json
{
  "browserslist": [
    "> 1%",
    "last 2 versions",
    "not dead"
  ]
}

不同环境配置 #

json
{
  "browserslist": {
    "production": [
      "> 1%",
      "last 2 versions",
      "not dead"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

查询当前配置 #

bash
# 查看当前浏览器列表
npx browserslist

# 查看特定查询的结果
npx browserslist "> 1%"

# 查看配置覆盖情况
npx browserslist --config="path/to/.browserslistrc"

支持的属性 #

常用属性 #

属性 说明
display: flex Flexbox 布局
display: grid Grid 布局
user-select 用户选择
backdrop-filter 背景滤镜
appearance 外观
text-size-adjust 文本大小调整
tab-size Tab 大小
hyphens 连字符
writing-mode 书写模式
text-orientation 文本方向
image-rendering 图像渲染
clip-path 裁剪路径
mask 遮罩
filter 滤镜

Flexbox 相关 #

css
/* 输入 */
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  flex-wrap: wrap;
  order: 1;
  flex-grow: 1;
  flex-shrink: 0;
  flex-basis: auto;
}

/* 输出 */
.container {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-box-pack: center;
  -ms-flex-pack: center;
  justify-content: center;
  -webkit-box-align: center;
  -ms-flex-align: center;
  align-items: center;
  -webkit-box-orient: vertical;
  -webkit-box-direction: normal;
  -ms-flex-direction: column;
  flex-direction: column;
  -ms-flex-wrap: wrap;
  flex-wrap: wrap;
  -webkit-box-ordinal-group: 2;
  -ms-flex-order: 1;
  order: 1;
  -webkit-box-flex: 1;
  -ms-flex-positive: 1;
  flex-grow: 1;
  -ms-flex-negative: 0;
  flex-shrink: 0;
  -ms-flex-preferred-size: auto;
  flex-basis: auto;
}

Grid 相关 #

css
/* 输入 */
.container {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: auto;
  gap: 20px;
  justify-items: center;
  align-items: center;
}

/* 输出 */
.container {
  display: -ms-grid;
  display: grid;
  -ms-grid-columns: 1fr 20px 1fr 20px 1fr;
  grid-template-columns: repeat(3, 1fr);
  -ms-grid-rows: auto;
  grid-template-rows: auto;
  gap: 20px;
  -ms-grid-row-align: center;
  justify-items: center;
  -ms-grid-column-align: center;
  align-items: center;
}

变换相关 #

css
/* 输入 */
.element {
  transform: translateX(10px) rotate(45deg);
  transform-origin: center center;
  perspective: 1000px;
}

/* 输出 */
.element {
  -webkit-transform: translateX(10px) rotate(45deg);
  -ms-transform: translateX(10px) rotate(45deg);
  transform: translateX(10px) rotate(45deg);
  -webkit-transform-origin: center center;
  -ms-transform-origin: center center;
  transform-origin: center center;
  -webkit-perspective: 1000px;
  perspective: 1000px;
}

过渡和动画 #

css
/* 输入 */
.element {
  transition: all 0.3s ease;
  animation: fadeIn 1s ease-in-out;
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

/* 输出 */
.element {
  -webkit-transition: all 0.3s ease;
  -o-transition: all 0.3s ease;
  transition: all 0.3s ease;
  -webkit-animation: fadeIn 1s ease-in-out;
  animation: fadeIn 1s ease-in-out;
}

@-webkit-keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

控制注释 #

禁用 Autoprefixer #

css
/* 禁用整个文件 */
/* autoprefixer: off */

.container {
  display: flex;
}

/* 禁用特定规则 */
.button {
  /* autoprefixer: ignore next */
  -webkit-user-select: none;
  user-select: none;
}

指定 Grid 支持 #

css
/* autoprefixer grid: on */
.container {
  display: grid;
}

指定浏览器 #

css
/* autoprefixer: > 5% */
.container {
  display: flex;
}

高级用法 #

与其他插件配合 #

javascript
// postcss.config.js
module.exports = {
  plugins: [
    require('postcss-import'),
    require('postcss-nested'),
    require('autoprefixer'),  // 在语法转换后
    require('cssnano')        // 在最后压缩
  ]
}

条件配置 #

javascript
// postcss.config.js
const isProduction = process.env.NODE_ENV === 'production'

module.exports = {
  plugins: [
    require('autoprefixer')({
      overrideBrowserslist: isProduction
        ? ['> 1%', 'last 2 versions', 'not dead']
        : ['last 1 chrome version']
    })
  ]
}

自定义数据源 #

javascript
require('autoprefixer')({
  overrideBrowserslist: ['> 1%'],
  // 使用自定义的 Can I Use 数据
  stats: './stats.json'
})

调试与验证 #

查看添加的前缀 #

javascript
const postcss = require('postcss')
const autoprefixer = require('autoprefixer')

const css = '.button { display: flex; }'

postcss([autoprefixer])
  .process(css, { from: undefined })
  .then(result => {
    console.log(result.css)
    
    // 查看警告信息
    result.warnings().forEach(warn => {
      console.warn(warn.toString())
    })
  })

在线工具 #

命令行测试 #

bash
# 安装 CLI
npm install postcss-cli autoprefixer --save-dev

# 处理文件
npx postcss input.css --use autoprefixer -o output.css

# 查看详细输出
npx postcss input.css --use autoprefixer -o output.css --verbose

常见问题 #

前缀没有添加 #

javascript
// 检查 browserslist 配置
npx browserslist

// 确保配置正确
require('autoprefixer')({
  overrideBrowserslist: ['last 2 versions']  // 确保包含目标浏览器
})

Grid 前缀问题 #

javascript
// 默认不添加 Grid 前缀
require('autoprefixer')({
  grid: true  // 显式启用
})

与 CSS 预处理器配合 #

javascript
// postcss.config.js
module.exports = {
  plugins: [
    // Less/Sass 处理后
    require('autoprefixer')  // 添加前缀
  ]
}

移除不需要的前缀 #

javascript
require('autoprefixer')({
  remove: true  // 移除过时的前缀
})

最佳实践 #

1. 使用 browserslist 配置文件 #

text
# .browserslistrc
> 1%
last 2 versions
not dead

2. 与团队共享配置 #

json
{
  "browserslist": [
    "extends @company/browserslist-config"
  ]
}

3. 定期更新 #

bash
# 更新 Autoprefixer
npm update autoprefixer

# 更新 browserslist 数据
npx browserslist@latest --update-db

4. CI/CD 中检查 #

bash
# 检查浏览器覆盖率
npx browserslist --coverage

# 输出示例
# These browsers account for 92.4% of all users globally

版本历史 #

text
v10.x ─── 支持最新 CSS 特性
    │
v9.x  ─── 改进 Grid 支持
    │
v8.x  ─── 移除对 Node.js 旧版本支持
    │
v7.x  ─── 使用 Browserslist 4.x
    │
v6.x  ─── 支持 Grid 布局
    │
v5.x  ─── 重构核心逻辑

下一步 #

现在你已经深入了解了 Autoprefixer,接下来学习 自定义插件开发 开发自己的 PostCSS 插件!

最后更新:2026-03-28