我的移動(dòng)端適配方案

需要移動(dòng)端適配的根本原因:屏幕窗口的大小狂鞋,devicepixelratio值等。

簡單介紹下devicepixelratio(設(shè)備像素比,即dpr) = physicalpixel (物理像素) / density-independent pixel(設(shè)備獨(dú)立像素,即dip)验靡。

在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)。

dip或dp,(device independent pixels浇垦,設(shè)備獨(dú)立像素)與屏幕密度有關(guān)炕置。dip可以用來輔助區(qū)分視網(wǎng)膜設(shè)備還是非視網(wǎng)膜設(shè)備。

移動(dòng)端適配主要有兩大不同的方向:響應(yīng)式布局自適應(yīng)布局男韧。

響應(yīng)式布局是根據(jù)屏幕大小自動(dòng)的調(diào)整布局位置(非單純的縮放)朴摊,實(shí)現(xiàn)適配

自適應(yīng)布局則是根據(jù)屏幕大小自動(dòng)的縮放大小,實(shí)現(xiàn)適配煌抒。個(gè)人喜歡自適應(yīng)布局的這種方式仍劈。

1.純css實(shí)現(xiàn)方式 -- 媒體查詢

使用原生css來實(shí)現(xiàn)媒體查詢是很繁瑣的,因?yàn)槊總€(gè)媒體查詢都要重寫以便寡壮。推薦使用css的預(yù)編譯器(sass,less,stylus)來實(shí)現(xiàn)贩疙,至于為什么要用預(yù)編譯器,應(yīng)該不用我說吧况既。

//less版本
html {
    font-size: 20px;
}
@media only screen and (min-width: 401px) {
    html {
        font-size: 25px !important;
    }
}
@media only screen and (min-width: 428px) {
    html {
        font-size: 26.75px !important;
    }
}
@media only screen and (min-width: 481px) {
    html {
        font-size: 30px !important;
    }
}
@media only screen and (min-width: 569px) {
    html {
        font-size: 35px !important;
    }
}
@media only screen and (min-width: 641px) {
    html {
        font-size: 40px !important;
    }
}
@media only screen and (min-width: 751px) {
    html {
        font-size: 50px !important;
    }
}
@media only screen and (min-width: 1080px) {
    html {
        font-size: 60px !important;
    }
}
@unit: 50rem; //基準(zhǔn)單位,根據(jù)設(shè)計(jì)稿來確定这溅。假設(shè):設(shè)計(jì)稿尺寸為750,那么@unit設(shè)置為50rem(1rem=50px更方便下面計(jì)算)
.warp{with: 100 / @unit} // 設(shè)計(jì)稿上元素的尺寸為100px => .warp{with: 2rem}
.warp{with: 10 / @unit} // 設(shè)計(jì)稿上元素的尺寸為10px => .warp{with: 0.2rem}

這樣當(dāng)頁面展示在750的屏幕上時(shí)棒仍,html的font-size為50px悲靴,那么當(dāng)設(shè)置為2rem的元素顯示的尺寸就為2*50px=100px。在其他尺寸的設(shè)備也會(huì)根據(jù)媒體查詢設(shè)置的不同font-size進(jìn)行自動(dòng)縮放適配莫其。
當(dāng)然上面也提到了癞尚,在css中也是可以獲取到devicePixelRatio的值耸三,那么為了更精確在寫媒體查詢的時(shí)候可以把它也加上去,這里就不展開了浇揩。

2.js的實(shí)現(xiàn)方式

js的實(shí)現(xiàn)方式仪壮,參考了網(wǎng)易淘寶的實(shí)現(xiàn)方式,對他們進(jìn)行了整合胳徽。并且修復(fù)了手機(jī)端1px問題积锅。

  • 網(wǎng)易實(shí)現(xiàn)方式是通過設(shè)備尺寸動(dòng)態(tài)的設(shè)置DOM的根元素字體大小,沒有考慮devicePixelRatio的因素;
  • 淘寶實(shí)現(xiàn)方式也是通過設(shè)備尺寸動(dòng)態(tài)的設(shè)置DOM的根元素字體大小养盗,并且考慮了devicePixelRatio的因素缚陷,但淘寶在設(shè)置rem時(shí),顯得較復(fù)雜(不方便寫css把px轉(zhuǎn)化成rem);
  • 1px問題簡單點(diǎn)說就是因?yàn)?code>devicePixelRatio的存在往核,css的1px不等于移動(dòng)端的1px箫爷。
(function(doc, win, designSize) { //designSize為設(shè)計(jì)稿的尺寸(寬)

    var docEl = document.documentElement,
        devWidth = docEl.clientWidth > 1080 ? 1080 : docEl.clientWidth,
        dpr = devicePixelRatio || 1,
        scale = 1 / dpr,
        width = dpr * devWidth,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'onresize', //判斷橫屏和窗口重置
        recalc = function() {
            var clientWidth = docEl.clientWidth;
            if (!clientWidth) return;
            document.querySelector('meta[name="viewport"]')
                    .setAttribute('content','width=' + width +
                                ', initial-scale=' + scale +
                                ', maximum-scale=' + scale +
                                ', minimum-scale=' + scale +
                                ', user-scalable=no');
            docEl.style.fontSize = devWidth / (designSize / 100) * dpr + 'px';
        };

    if (!doc.addEventListener) return;
    win.addEventListener(resizeEvt, recalc, false);
    doc.addEventListener('DOMContentLoaded', recalc, false);

})(document, window, 750);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市铆铆,隨后出現(xiàn)的幾起案子蝶缀,更是在濱河造成了極大的恐慌,老刑警劉巖薄货,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翁都,死亡現(xiàn)場離奇詭異,居然都是意外死亡谅猾,警方通過查閱死者的電腦和手機(jī)柄慰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來税娜,“玉大人坐搔,你說我怎么就攤上這事【淳兀” “怎么了概行?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長弧岳。 經(jīng)常有香客問我凳忙,道長,這世上最難降的妖魔是什么禽炬? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任涧卵,我火速辦了婚禮,結(jié)果婚禮上腹尖,老公的妹妹穿的比我還像新娘柳恐。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布乐设。 她就那樣靜靜地躺著讼庇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪伤提。 梳的紋絲不亂的頭發(fā)上巫俺,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天认烁,我揣著相機(jī)與錄音肿男,去河邊找鬼。 笑死却嗡,一個(gè)胖子當(dāng)著我的面吹牛舶沛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播窗价,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼如庭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了撼港?” 一聲冷哼從身側(cè)響起坪它,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帝牡,沒想到半個(gè)月后往毡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡靶溜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年开瞭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩息。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗤详,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓷炮,到底是詐尸還是另有隱情葱色,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布娘香,位于F島的核電站苍狰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏茅主。R本人自食惡果不足惜舞痰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望诀姚。 院中可真熱鬧响牛,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贬丛,卻和暖如春撩银,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豺憔。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工额获, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恭应。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓抄邀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親昼榛。 傳聞我的和親對象是個(gè)殘疾皇子境肾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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

  • 剛開始做移動(dòng)端web開發(fā)的同學(xué)應(yīng)該都碰到過頁面適配問題,為什么我在開發(fā)手機(jī)上調(diào)試好的頁面在其他手機(jī)會(huì)有這樣或那樣的...
    留七七閱讀 19,373評論 5 80
  • 第九章环鲤,師父,我可要吻你了哦 第二天起來彻秆,白卿離頭昏昏脹脹的楔绞,已想不起來昨天發(fā)生了什么。 自然唇兑,這頁就這么...
    三炮英雄閱讀 508評論 0 0
  • 關(guān)系是指人與人之間扎附,人與事物之間蔫耽,事物與事物之間的相互聯(lián)系。人與人之間的關(guān)系都是雙方的:君臣留夜、父子匙铡、兄弟、夫婦碍粥、朋...
    草帽陽閱讀 437評論 0 1
  • 1.早餐前應(yīng)先喝水 人經(jīng)過一夜睡眠鳖眼,消耗了大量的水分和營養(yǎng),起床后處于一種生理性缺水狀態(tài)嚼摩。如果只進(jìn)食常規(guī)早餐钦讳,遠(yuǎn)遠(yuǎn)...
    紅火太陽閱讀 215評論 0 0