移動(dòng)端適配方案--flexible解讀

有的沒(méi)的知識(shí)儲(chǔ)備

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

em —— 基準(zhǔn)是 當(dāng)前元素的字號(hào)(font-size)大小坛吁,實(shí)際值取決于在哪個(gè)元素上應(yīng)用劳殖。

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

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

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

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

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)該使用多少屏幕實(shí)際像素來(lái)繪制單個(gè)css像素,

  // adjust body font size
  // 調(diào)整body標(biāo)簽的fontsize碉就,fontsize = (12 * dpr) + 'px'
  // 設(shè)置默認(rèn)字體大小盟广,默認(rèn)的字體大小繼承自body,如果子元素沒(méi)有設(shè)置font-size就繼承父元素設(shè)置的這個(gè)默認(rèn)字號(hào)(這個(gè)地方有個(gè)疑問(wèn)瓮钥,為什么以12位基準(zhǔn)筋量,是因?yàn)闉g覽器的最小顯示的字號(hào)是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純粹是為了計(jì)算方便)這個(gè)地方也可以直接寫10vw(表示可視窗口的寬度的十分之一)
  function setRemUnit () {
    var rem = docEl.clientWidth / 10
    docEl.style.fontSize = rem + 'px'
  }

  setRemUnit()

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

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

/*
*@const 根據(jù)1080p分辨率來(lái)設(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í)際的設(shè)計(jì)尺寸px轉(zhuǎn)為相對(duì)的rem)
* @param $origLen 設(shè)計(jì)圖上的實(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)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末性誉,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茎杂,更是在濱河造成了極大的恐慌错览,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煌往,死亡現(xiàn)場(chǎng)離奇詭異倾哺,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門羞海,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)忌愚,“玉大人,你說(shuō)我怎么就攤上這事扣猫〔搜” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵申尤,是天一觀的道長(zhǎng)癌幕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)昧穿,這世上最難降的妖魔是什么勺远? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮时鸵,結(jié)果婚禮上胶逢,老公的妹妹穿的比我還像新娘。我一直安慰自己饰潜,他們只是感情好初坠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著彭雾,像睡著了一般碟刺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上薯酝,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天半沽,我揣著相機(jī)與錄音,去河邊找鬼吴菠。 笑死者填,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的做葵。 我是一名探鬼主播占哟,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜂挪!你這毒婦竟也來(lái)了重挑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤棠涮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刺覆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體严肪,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驳糯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片篇梭。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酝枢,靈堂內(nèi)的尸體忽然破棺而出恬偷,到底是詐尸還是另有隱情,我是刑警寧澤帘睦,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布袍患,位于F島的核電站,受9級(jí)特大地震影響竣付,放射性物質(zhì)發(fā)生泄漏诡延。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一古胆、第九天 我趴在偏房一處隱蔽的房頂上張望肆良。 院中可真熱鬧,春花似錦逸绎、人聲如沸惹恃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)巫糙。三九已至,卻和暖如春陨帆,著一層夾襖步出監(jiān)牢的瞬間曲秉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工疲牵, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留承二,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓纲爸,卻偏偏與公主長(zhǎng)得像亥鸠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子识啦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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