使用 Autoprefixer 自動處理瀏覽器兼容性
最近更新時間 2020-12-02 14:33:25
Autoprefixer 插件是最流行的 CSS 處理工具之一,用於自動處理瀏覽器兼容性問題,比如自動添加 CSS 屬性前綴。
安裝
使用下面的命令安裝:
npm install autoprefixer postcss postcss-cli
下載安裝完成後,需要在 package.json 中配置一個 script 命令,如下所示,css-prefix 表示自動格式化 css 文件。下面的配置文件有個隱藏的 bug 沒有達到預期修改,下面詳細講解。
{
"name": "npm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"css": "npm-run-all css-compile css-prefix",
"css-compile": "sass ./src/main.scss:./dist/main.css",
"css-prefix": "postcss dist/*.css --use autoprefixer -d dist/"
},
"author": "",
"license": "ISC",
"dependencies": {
"autoprefixer": "^10.0.4",
"npm-run-all": "^4.1.5",
"postcss": "^8.1.10",
"postcss-cli": "^8.3.0",
"sass": "^1.29.0"
}
}
運行 npm run 執行 css 命令,如下所示:
npm run css
上面的命令會第一步執行 sass 命令,把 scss 文件編譯為 css 文件。第二步 執行 postcss 命令,處理編譯後的 css 文件,處理結果如下所示:
::placeholder {
color: gray;
}
.flex {
display: flex;
transition: 1s;
}
編譯後的結果如下:
::-moz-placeholder {
color: gray;
}
:-ms-input-placeholder {
color: gray;
}
::placeholder {
color: gray;
}
.flex {
display: flex;
transition: 1s;
}
上面結果顯示 ::placeholder 屬性已經自動替換,但是 display 的 flex 屬性和 transition 沒有自動處理,沒有達到預期效果。
默認情況下 Autoprefixer 只會兼容瀏覽器當前主版本的前一瀏覽器版本,隱藏根據當前瀏覽器主版本不會自動生成 -webkit-。需要在 package.json 文件中添加 browserslist 屬性值,如下所示:
{
"name": "npm",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"css": "npm-run-all css-compile css-prefix",
"css-compile": "sass ./src/main.scss:./dist/main.css",
"css-prefix": "postcss dist/*.css --use autoprefixer -d dist/"
},
"author": "",
"license": "ISC",
"browserslist": "last 4 versions",
"dependencies": {
"autoprefixer": "^10.0.4",
"npm-run-all": "^4.1.5",
"postcss": "^8.1.10",
"postcss-cli": "^8.3.0",
"sass": "^1.29.0"
}
}
添加 browserslist 參數後編譯的結果如下所示:
::-webkit-input-placeholder {
color: gray;
}
::-moz-placeholder {
color: gray;
}
:-ms-input-placeholder {
color: gray;
}
::-ms-input-placeholder {
color: gray;
}
::placeholder {
color: gray;
}
.flex {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-transition: 1s;
-o-transition: 1s;
transition: 1s;
}
另外一種方法是在下面下添加 .browserslistrc 文件設置兼容的瀏覽器版本,Autoprefixer 會根據配置自動決定兼容的瀏覽器
# https://github.com/browserslist/browserslist#readme
>= 1%
last 1 major version
not dead
Chrome >= 60
Firefox >= 60
# needed since Legacy Edge still has usage; 79 was the first Chromium Edge version
# should be removed in the future when its usage drops or when it's moved to dead browsers
not Edge < 79
iOS >= 10
Safari >= 10
Android >= 6
not Explorer <= 11
注:.browserslistrc 和 package.json 文件的 browserslist 不能同時使用,同時使用報錯誤:contains both .browserslistrc and package.json with browsers