移動端適配方案--flexible解讀

有的沒的知識儲備

響應(yīng)式 —— 在css中,針對不同大小的瀏覽器窗口,用不同的方式相應(yīng)更新頁面的樣式。
1inch(英寸) = 25.4mm(毫米) = 6pc(pica,印刷術(shù)語,長度為12points) = 72pt(點) = 96px(像素)

em —— 基準(zhǔn)是 當(dāng)前元素的字號(font-size)大小,實際值取決于在哪個元素上應(yīng)用。

  • 基準(zhǔn)是當(dāng)前元素的font-size
  • 如果當(dāng)前元素的字號用的是em,那么當(dāng)前元素字號的基準(zhǔn)是其父元素
  • 先算出當(dāng)前元素的font-size的像素值,再計算其他使用em作為單位的屬性值大小

rem —— 是根em的縮寫,基準(zhǔn)是根元素的字號大小**

視口viewport —— 瀏覽器窗口中用來渲染頁面的可視區(qū)域,不包括瀏覽器的地址欄、工具欄、狀態(tài)欄等。
相關(guān)單位

  • vh ——視口高度的1/100
  • vw——視口寬度的1/100
  • vmin——視口寬度或者高度較小值的1/100
  • vmax——視口官渡或者高度較大值的1/100(橫豎屏?xí)r可以用這兩個值)

flexible源碼解讀

// 立即執(zhí)行函數(shù),入?yún)⑹莣indow和document
(function flexible (window, document) {
  var docEl = document.documentElement
  // 文檔的root元素
  var dpr = window.devicePixelRatio || 1
  // 獲取設(shè)備的dpr(返回當(dāng)前顯示設(shè)備的物理像素分辨率與css像素分辨率之比),它告訴瀏覽器應(yīng)該使用多少屏幕實際像素來繪制單個css像素,

  // adjust body font size
  // 調(diào)整body標(biāo)簽的fontsize,fontsize = (12 * dpr) + 'px'
  // 設(shè)置默認(rèn)字體大小,默認(rèn)的字體大小繼承自body,如果子元素沒有設(shè)置font-size就繼承父元素設(shè)置的這個默認(rèn)字號(這個地方有個疑問,為什么以12位基準(zhǔn),是因為瀏覽器的最小顯示的字號是12嗎?)
  function setBodyFontSize () {
    if (document.body) {
      document.body.style.fontSize = (12 * dpr) + 'px'
    }
    else {
      document.addEventListener('DOMContentLoaded', setBodyFontSize)
    }
  }
  setBodyFontSize();

  // set 1rem = viewWidth / 10
  // 設(shè)置根元素的fontsize為clientwidth/10(除以10純粹是為了計算方便)這個地方也可以直接寫10vw(表示可視窗口的寬度的十分之一)
  function setRemUnit () {
    var rem = docEl.clientWidth / 10
    docEl.style.fontSize = rem + 'px'
  }

  setRemUnit()

  // reset rem unit on page resize
  // 當(dāng)頁面展示或重新設(shè)置大小的時候,重新對rem的px值進行計算
  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轉(zhuǎn)rem方法

來做一道應(yīng)用題:
已知屏幕實際寬度為W,設(shè)計稿上的屏幕寬度為w,設(shè)計稿上的某個元素的寬度是x,求這個元素實際寬度X
解:
屏幕實際寬度和屏幕在設(shè)計稿上的寬度比與元素實際寬度和元素在設(shè)計稿上的寬度比是一樣的
即:W / w = X / x
那么 X = W * x / w
也即 X = ( W * x / w ) * ( W / 10 ) * ( 10 / W )
也即 X = x / ( w / 10) * ( W / 10 )
在上面源碼處我們設(shè)定了 var rem = docEl.clientWidth / 10
也即rem = W / 10
則 X = x / ( w / 10) rem
我們已設(shè)計稿中屏幕像素為1080px計算,也就得出下面公式中 base-design-font-size = 1080 / 10 = 108
(太難了,別說高等數(shù)學(xué)了,初中數(shù)學(xué)都已經(jīng)還給老師了......)

/*
*@const 根據(jù)1080p分辨率來設(shè)置比率
**/
$base-design-font-size:108px;

/*
* @Functions
* @description Strip units from $number(去掉數(shù)值后的單位)
* @param $number Include units number(含單位字符的數(shù)值)
* @return pure number(純數(shù)字)
*/
@function __strip-units($number){
  @if type-of($number) == 'number'{
    @return $number/($number*0 +1);
  }
  @warn 'Exception in method __stip-unit : Not a number value: #{$number}';
  @return $number;
}

/*
* @Functions
* @description Convert the px to rem (將實際的設(shè)計尺寸px轉(zhuǎn)為相對的rem)
* @param $origLen 設(shè)計圖上的實際尺寸
* @return rem
*/
@function px2rem($origLen){
  $origLen : __strip-units($origLen);
  $base-design-font-size: __strip-units($base-design-font-size);
  @return #{$origLen/$base-design-font-size}rem;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容