react使用插件配置px轉換為rem


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了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM