移動(dòng)端適配

前言:這周工作碰到了移動(dòng)端1px的問題彩届。以前一直寫樣式也沒有特別注意著一點(diǎn)渐裂。還有就是rem的原理繁疤。這些其實(shí)就是比較常見的移動(dòng)端適配問題。現(xiàn)階段比較主流的適配方案有二種揣炕。一種是flexible + rem,另一種是vw

下面我們來看一下具體情況

1帘皿、基本概念

在了解具體方案原理前,我們先來看一下一些基本概念:

1.1畸陡、物理像素(physical pixel)

物理像素又被稱為設(shè)備像素鹰溜,他是顯示設(shè)備中一個(gè)最微小的物理部件。每個(gè)像素可以根據(jù)操作系統(tǒng)設(shè)置自己的顏色和亮度丁恭。

1.2曹动、設(shè)備獨(dú)立像素(density-independent pixel)

設(shè)備獨(dú)立像素也稱為密度無關(guān)像素,可以認(rèn)為是計(jì)算機(jī)坐標(biāo)系統(tǒng)中的一個(gè)點(diǎn)牲览,這個(gè)點(diǎn)代表一個(gè)可以由程序使用的虛擬像素(比如說CSS像素)墓陈,然后由相關(guān)系統(tǒng)轉(zhuǎn)換為物理像素。(老早在沒有 retina 屏之前第献,設(shè)備獨(dú)立像素與物理像素是相等的)

1.3跛蛋、CSS像素

CSS像素是一個(gè)抽像的單位,主要使用在瀏覽器上痊硕,用來精確度量Web頁面上的內(nèi)容赊级。一般情況之下,CSS像素稱為與設(shè)備無關(guān)的像素(device-independent pixel)岔绸,簡稱DIPs理逊。

1.4橡伞、設(shè)備像素比(device pixel ratio)

設(shè)備像素比簡稱為dpr,其定義了物理像素和設(shè)備獨(dú)立像素的對應(yīng)關(guān)系晋被。它的值可以按下面的公式計(jì)算得到:

設(shè)備像素比 = 物理像素 / 設(shè)備獨(dú)立像素

JavaScript中兑徘,可以通過window.devicePixelRatio獲取到當(dāng)前設(shè)備的dpr。而在CSS中羡洛,可以通過-webkit-device-pixel-ratio挂脑,-webkit-min-device-pixel-ratio-webkit-max-device-pixel-ratio進(jìn)行媒體查詢,對不同dpr的設(shè)備欲侮,做一些樣式適配(這里只針對webkit內(nèi)核的瀏覽器和webview)
因此在iphone 6崭闲、7、8 的 dpr 為 2的設(shè)備中威蕉,一個(gè)設(shè)備獨(dú)立像素便為 4 個(gè)物理像素刁俭,因此在 css 上設(shè)置的 1px 在其屏幕上占據(jù)的是 2個(gè)物理像素,0.5px 對應(yīng)的才是其所能展示的最小單位韧涨。

1.5牍戚、rem

簡單的理解,rem就是相對于根元素<html>font-size來做計(jì)算虑粥。而我們的方案中使用rem單位如孝,是能輕易的根據(jù)<html>ont-size計(jì)算出元素的盒模型大小。而這個(gè)特色對我們來說是特別的有益處娩贷。

2第晰、flexible實(shí)現(xiàn)方案

了解了前面一些相關(guān)概念之后,接下來我們來看實(shí)際解決方案育勺。淘寶有一個(gè)名叫lib-flexible的庫,而這個(gè)庫就是用來解決H5頁面終端適配的罗岖。
我們把屏幕分成10等分涧至,那么

  • 物理像素為 750 = 375 * 2,那么 10rem = 750px桑包,1rem = 75px;
  • 物理像素為 1125 = 375 * 3南蓬,那么 10rem = 1125px,1rem = 112.5px ;
  • 物理像素為 1242 = 414 * 3, 那么 10rem = 1242px哑了,1rem = 124.2px;
function refreshRem(){
        var width = docEl.getBoundingClientRect().width;
        if (width / dpr > 540) {
            width = 540 * dpr;
        }
        var rem = width / 10;
        docEl.style.fontSize = rem + 'px';
        flexible.rem = win.rem = rem;
    }

2.1赘方、1px的物理像素的解決方案

由此我們得到一個(gè)1px像素的解決方案。viewport 的 initial-scale 具有縮放頁面的效果弱左。對于 dpr=2 的屏幕窄陡,1px壓縮一半便可與1px的設(shè)備像素比匹配,這就可以通過將縮放比 initial-scale 設(shè)置為 0.5=1/2 而實(shí)現(xiàn)拆火。以此類推 dpr=3的屏幕可以將 initial-scale設(shè)置為 0.33=1/3 來實(shí)現(xiàn)跳夭。

<meta name="viewport" content="width=device-width, initial-scale=0.5, maximum-scale=0.5">
if (!metaEl) {
        metaEl = doc.createElement('meta');
        metaEl.setAttribute('name', 'viewport');
        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
        if (docEl.firstElementChild) {
            docEl.firstElementChild.appendChild(metaEl);
        } else {
            var wrap = doc.createElement('div');
            wrap.appendChild(metaEl);
            doc.write(wrap.innerHTML);
        }
    }

3涂圆、視口單位適配方案

將視口寬度 window.innerWidth 和視口高度 window.innerHeight 等分為 100 份,且將這里的視口理解成 idealviewport 更為貼切币叹,并不會(huì)隨著 viewport 的不同設(shè)置而改變润歉。

1、vw : 1vw 為視口寬度的 1%
2颈抚、vh : 1vh 為視口高度的 1%
3踩衩、vmin : vw 和 vh 中的較小值
4、vmax : 選取 vw 和 vh 中的較大值

如果設(shè)計(jì)稿為 750px贩汉,那么 1vw = 7.5px驱富,100vw = 750px。其實(shí)設(shè)計(jì)稿按照設(shè)么都沒多大關(guān)系雾鬼,最終轉(zhuǎn)化過來的都是相對單位萌朱,上面講的 rem 也是對它的模擬。

跟之前一樣的痛點(diǎn)策菜,我們?nèi)匀恍枰ㄙM(fèi)大量不必要的計(jì)算時(shí)間去把標(biāo)注圖中的px轉(zhuǎn)換為vw晶疼,有沒有類似于postcss-px2rem的工具呢?很榮幸能再次站在巨人的肩膀上又憨,已經(jīng)有大神寫了了類似的PostCss插件 postcss-px-to-viewport

參看資料
https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翠霍,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蠢莺,更是在濱河造成了極大的恐慌寒匙,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件躏将,死亡現(xiàn)場離奇詭異锄弱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)祸憋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門会宪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚯窥,你說我怎么就攤上這事掸鹅。” “怎么了拦赠?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵巍沙,是天一觀的道長。 經(jīng)常有香客問我荷鼠,道長句携,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任允乐,我火速辦了婚禮务甥,結(jié)果婚禮上牡辽,老公的妹妹穿的比我還像新娘。我一直安慰自己敞临,他們只是感情好态辛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挺尿,像睡著了一般奏黑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上编矾,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天熟史,我揣著相機(jī)與錄音,去河邊找鬼窄俏。 笑死蹂匹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的凹蜈。 我是一名探鬼主播限寞,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼仰坦!你這毒婦竟也來了履植?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對情侶失蹤悄晃,失蹤者是張志新(化名)和其女友劉穎玫霎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體妈橄,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庶近,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眷蚓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼻种。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖溪椎,靈堂內(nèi)的尸體忽然破棺而出普舆,到底是詐尸還是另有隱情恬口,我是刑警寧澤校读,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站祖能,受9級(jí)特大地震影響歉秫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜养铸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一雁芙、第九天 我趴在偏房一處隱蔽的房頂上張望轧膘。 院中可真熱鬧,春花似錦兔甘、人聲如沸谎碍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟆淀。三九已至,卻和暖如春澡匪,著一層夾襖步出監(jiān)牢的瞬間熔任,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工唁情, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疑苔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓甸鸟,卻偏偏與公主長得像惦费,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子哀墓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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

  • 本文首發(fā)于 https://blog.lenconda.top/posts/2018/04/11/mobile_a...
    Lenconda閱讀 1,242評(píng)論 0 5
  • 不知不覺做前端已經(jīng)兩年了趁餐,從PC端,移動(dòng)端篮绰,微信小程序一路走來到今天剛剛開放注冊的快應(yīng)用(手機(jī)廠商對抗小程序的新技...
    是ADI呀閱讀 3,095評(píng)論 0 10
  • 本文來自@dduke后雷;地址:https://juejin.im/post/5add7a44f265da0b886d...
    2729aff9f931閱讀 1,774評(píng)論 0 2
  • 又是一年一度畢業(yè)的季節(jié)了臀突。放不下的除了任性懵懂的校園時(shí)光,還有那個(gè)他或者她贾漏。 作為畢業(yè)了好幾年的人來說候学,在大學(xué)時(shí)光...
    寂音醬閱讀 349評(píng)論 0 0
  • 端午放假,帶著孩子出去玩。旭爹早就做好了打算妆绞,我向來是只負(fù)責(zé)跟著冰啃,不關(guān)心其他的。 在車上悠然地讀著書掰茶,突然聽見導(dǎo)航...
    五月荷閱讀 445評(píng)論 3 3