react使用插件postcss-pxtorem配置px自動轉換rem
1.下載postcss-pxtorem插件
npm install postcss postcss-pxtorem --save-dev
2.下載craco ,進行webpack的配置(ant design中的),或者在webpack.config.js中,這里的話我使用antd的craco插件
npm install @craco/craco
3.在項目根目錄創建一個craco.config.js進行配置
const pxtorem = require("postcss-pxtorem");
//https://github.com/cuth/postcss-pxtorem,參考地址
module.exports = {
style: {
postcss: {
plugins: [
pxtorem({
rootValue: 3.75, // 設計稿寬度/100,即分成多少份
unitPrecision: 5, // 小數精度
propList: [
"font",
"font-size",
"line-height",
"letter-spacing",
"width",
"height",
],
selectorBlackList: [],
replace: true,
mediaQuery: false,
minPixelValue: 0,
exclude: /node_modules/i,
}),
],
},
},
};
4.如果報錯:Error: PostCSS plugin postcss-pxtorem requires PostCSS 8,因為postcss-pxtorem最高也才6.0.0版本(就2021年5月31日來說是6.0.0,往后就不知道了),只需下載指定5.1.1版本的postcss-pxtorem就行了
npm install postcss-pxtorem@5.1.1 --save-dev
5.到這里其實還會遇到一個bug,就是元素轉換的rem對了,但是展示的效果卻不一樣,這是因為我們沒有設置根標簽默認的字體大小,這里有一個根據不同設備會設置根標簽的默認字體大小,只要引進你的react入口文件就好了,拿走不謝
(function flexible (window, document) {
var docEl = document.documentElement
var dpr = window.devicePixelRatio || 1
// adjust body font size
function setBodyFontSize () {
if (document.body) {
document.body.style.fontSize = '16px'
} else {
/*
DOMContentLoaded DOM元素加載完成就觸發
load 頁面所有資源加載觸發
*/
document.addEventListener('DOMContentLoaded', setBodyFontSize)
}
}
setBodyFontSize();
// set 1rem = viewWidth / 100
function setRemUnit () {
var rem = docEl.clientWidth / 100
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
if (dpr >= 2) {
var fakeBody = document.createElement('body')
var testElement = document.createElement('div')
testElement.style.border = '.5px solid transparent'
fakeBody.appendChild(testElement)
docEl.appendChild(fakeBody)
if (testElement.offsetHeight === 1) {
docEl.classList.add('hairlines')
}
docEl.removeChild(fakeBody)
}
}(window, document))
如上步驟進行配置就不用自己對px進行rem轉換了,按照設計稿來就ok了