rem適配flexible.js解決方案

1某寶方案

1.1 某寶的flexible.js

// i6為基準(zhǔn),設(shè)計(jì)圖是i6二倍圖,二倍圖中32px = 1rem, 我在variables.less 寫(xiě)了變量 @baseFontSize 1rem=37.5px(蘋(píng)果6下)
// JavaScript Document
(function flexible (window, document) {
  var docEl = document.documentElement;     //獲取文檔根節(jié)點(diǎn)并保存到變量docEl中(相當(dāng)于獲取到html對(duì)象)
  var dpr = window.devicePixelRatio || 1;   //獲取像素比,如果window.devicePixelRatio為false是dpr為1,如果window.devicePixelRatio大于1,那么dpr賦值取大的數(shù)

  function setBodyFontSize () {
    if (document.body) { //獲取到body對(duì)象是否存在,個(gè)人覺(jué)得啰嗦
      document.body.style.fontSize = (12 * dpr) + 'px';
    }  
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize);
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10
  function setRemUnit () {
    var rem = docEl.clientWidth / 10
    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))

1.2 .less 通過(guò)函數(shù)方式封裝,然后傳進(jìn)去名字和值(重點(diǎn))

.rem(@name,@px) {
    @{name}: unit(@px / 75, rem);
 }

2 本人方案

2.1本人設(shè)計(jì)的flexible.js方案

// vue: 在入口頁(yè)(定義Vue實(shí)例的頁(yè)面)將其引入即可
function setRem () {
  const baseSize = 16
  const scale = document.documentElement.clientWidth / 375
  // 設(shè)置頁(yè)面根節(jié)點(diǎn)字體大小
  document.documentElement.style.fontSize = (baseSize * Math.min(scale, 2)) + 'px'
}

// 初始化
setViewport()
setRem()

window.onresize = function () {
  setRem()
}

2.2 .less 文件使用

@baseFontSize: 32;


/* 通過(guò)函數(shù)方式封裝,然后傳進(jìn)去名字和值 */
.rem(@name,@px) {
 @{name}: unit(@px / @baseFontSize, rem);
}


//使用
.page-item {
 margin: 0 auto;
 .rem(max-width,750);
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容