小敘移動(dòng)端適配解決方案

題外話

突然被要求教學(xué)妹怎么做移動(dòng)端適配的問題,上一次我寫移動(dòng)端的東西過去好久了灯抛,于是又面向百度了一波,網(wǎng)上感覺還是零零散散的音瓷,于是決定整理下來牧愁,雖有拾人牙慧之嫌,但是總歸會(huì)清晰省事不少外莲,嘻猪半!(我真是個(gè)暖心學(xué)長(zhǎng))
Ps:
解決方案概括在最下面"總結(jié)"中兔朦,上面的都是詳細(xì)解釋,不想看長(zhǎng)篇大論者可以直接拖到最下面看解決方案

設(shè)置html中meta標(biāo)簽

首先在移動(dòng)端開發(fā)中磨确,需要在前端html的<head></head>標(biāo)簽中加入

 <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=10.0,user-scalable=no">

viewport是專為手機(jī)瀏覽器設(shè)計(jì)的一個(gè)meta標(biāo)簽
先看看如果html代碼不用這個(gè)meta標(biāo)簽的情況下:



css代碼跟面條一樣長(zhǎng)沽甥,就不貼了,簡(jiǎn)述一下:上面的三塊每塊100px寬乏奥,下面的是100%寬
但是由調(diào)試的iPhone手機(jī)界面來看摆舟,理想視口是375px寬

那么問題來了,上面三個(gè)塊寬度加起來為300px,卻不到iPhone375px寬的一半邓了,為什么?

因?yàn)橛行┢聊缓苄〉闹悄苁謾C(jī)恨诱,但分辯率卻可以做得很大,傳統(tǒng)桌面網(wǎng)站直接放到手機(jī)上閱讀時(shí)骗炉,同時(shí)該網(wǎng)站沒有做移動(dòng)端優(yōu)化的網(wǎng)站時(shí)照宝,瀏覽器會(huì)盡可能縮小這個(gè)網(wǎng)站讓用戶看到網(wǎng)站的全部?jī)?nèi)容

所以前端html需要加上meta標(biāo)簽,加上后:


然后用Chrome devTools可以發(fā)現(xiàn)下面的100%寬度的div就是375px了句葵,nice!
(弱弱吐槽一句:html代碼不加這個(gè)meta標(biāo)簽在火狐瀏覽器中調(diào)試也沒有問題厕鹃,它會(huì)直接根據(jù)理想視圖等參數(shù)顯示出來,但是谷歌瀏覽器就不會(huì)……)
meta中content參數(shù):

  1. width = device-width:應(yīng)用程序的寬度和屏幕的寬度是一樣的,也可定死乍丈,可以自定義試試看效果
  2. height = device-height:應(yīng)用程序的高度和屏幕的高是一樣的
  3. initial-scale = 1.0:應(yīng)用程序啟動(dòng)時(shí)候的縮放尺度(1.0表示不縮放)
  4. minimum-scale = 1.0:用戶可以縮放到的最小尺度(1.0表示不縮放)
  5. maximum-scale = 1.0:用戶可以放大到的最大尺度(1.0表示不縮放)
  6. user-scalable = no:用戶是否可以通過他的手勢(shì)來縮放整個(gè)應(yīng)用程序剂碴,使應(yīng)用程序的尺度發(fā)生一個(gè)改變(yes/no)

當(dāng)然,在<meta name="viewport" ……>的背后關(guān)于視圖及其屬性轻专,如布局視圖忆矛,視覺視圖,理想視圖……可以參考這篇博客: 深入理解viewport及相關(guān)屬性的關(guān)系

適配不同機(jī)型请垛,設(shè)置rem單位長(zhǎng)度

一般由于移動(dòng)端各個(gè)不同型號(hào)手機(jī)其寬度不同
所以如果采用px固定住元素:比如你定義了一個(gè)div催训,里面定義了很多子元素,然后在iPhone6瀏覽器頁面上面顯示剛好是一行叼屠,但是一到iPhone5上各元素就突然換行了瞳腌,亂成了一只皮皮蝦

這是因?yàn)閕Phone6的手機(jī)寬度是750px,iPhone5的寬度是640px,所以把一個(gè)750px的東西塞進(jìn)640px寬的容器中肯定會(huì)出問題
(當(dāng)年本人在實(shí)習(xí)做移動(dòng)端頁面開發(fā)的時(shí)候绞铃,每每切換到iPhone5總是一陣慌張镜雨,因?yàn)檫@個(gè)它頁面寬度太小了,就很有可能會(huì)出現(xiàn)排版混亂的問題)

什么?你說Chrome devTools中顯示的iPhone6寬度是375px,iPhone5寬度是320px,這就是另一個(gè)問題了儿捧,這牽扯到了css邏輯像素和手機(jī)物理像素的比例問題了荚坞,也就是關(guān)于DPR的問題:移動(dòng)web開發(fā)之像素和DPR詳解,可以點(diǎn)擊這篇博客了解學(xué)習(xí)
人家珠玉在前菲盾,我也就不再長(zhǎng)篇累牘地解釋了

所以為了解決移動(dòng)端頁面寬高標(biāo)準(zhǔn)繁多的問題,就有這么一個(gè)解決思想:

整體布局可以采用百分比颓影、flex布局,一些設(shè)計(jì)圖上固定長(zhǎng)度的元素懒鉴,如按鈕等可以使用rem布局

  • 什么是rem呢?
    rem:root em诡挂,這是一個(gè)相對(duì)單位碎浇,相對(duì)于HTML根元素 font-size 屬性大小決定其大小
    舉個(gè)例子:在css樣式中設(shè)置 html{font-size:20px} 那么 1rem=20px,所以當(dāng)一個(gè)按鈕寬度為10px時(shí),可以換算為 width: 0.5rem
  • rem怎么做到適配的呢?
    舉個(gè)例子:在iPhone6中定義 html{font-size:40px} 璃俗,然后設(shè)置一個(gè)按鈕為 width: 0.5rem 奴璃,這時(shí)候它的寬度是20px,然后你切換成iPhone5,在iPhone5中定義了 html{font-size:30px} 城豁,于是這個(gè)按鈕寬度就變成了15px,因?yàn)閕Phone5的寬度比較小苟穆,所以這個(gè)按鈕寬度變小后在iPhone5中就不會(huì)撐出父元素
    所以只要隨著設(shè)備的不同改變根元素的 font-size 屬性大小,就能讓所有以rem作為單位的元素自適應(yīng)頁面寬度
  • 那么唱星,什么時(shí)候使用rem布局呢?
    根據(jù)大佬們的思想雳旅,寬度小于頁面50%可以使用rem布局,再大就用百分比布局
    因?yàn)閞em不是萬能的间聊,當(dāng)子元素在父元素中的寬度占比很大時(shí)攒盈,使用rem,當(dāng)切換設(shè)備時(shí)候也有可能會(huì)出現(xiàn)排版混亂的情況
  • 那么怎么設(shè)置改變根元素的 font-size 屬性大小從而改變r(jià)em大小來適配不同機(jī)型呢甸饱?
    這里有兩種方案:
  1. 通過媒體查詢來改變 font-size ,進(jìn)而改變r(jià)em
    舉個(gè)例子:
html {
  font-size: 62.5%
} 
@media only screen and (min-width: 481px) {        //當(dāng)屏幕寬度小于481px
  html {
    font-size:94%!important
  }
}
@media only screen and (min-width: 561px) {        //當(dāng)屏幕寬度小于561px
  html {
    font-size:109%!important
  }
}
@media only screen and (min-width: 641px) {        //當(dāng)屏幕寬度小于641px
  html {
    font-size:125%!important
  } 
  body {
    max-width: 640px
  }
}

這些屏幕最小寬度參數(shù)和 font-size 都是根據(jù)項(xiàng)目實(shí)際需求改變沦童,并不唯一

  1. 通過js動(dòng)態(tài)改變 font-size ,進(jìn)而改變r(jià)em
    當(dāng)頁面一加載的時(shí)候,js就獲取當(dāng)前設(shè)備的寬度叹话,進(jìn)而設(shè)置 font-size
<script>
    function refreshRem() {
        var d= document.documentElement;
        var width =d.getBoundingClientRect().width;  //獲取當(dāng)前設(shè)備的寬度
        if (width > 640 ){                            // 640不固定偷遗,根據(jù)設(shè)計(jì)稿的寬度定
            width =  640;
        }
        rem = width / 6.4;
        console.log(rem);
        d.style.fontSize = rem + "px"
    }
    refreshRem();
    window.addEventListener("resize", function() {  //監(jiān)聽橫豎屏切換
        refreshRem()
    }, false);
</script>

這個(gè)script代碼可以直接粘貼到html <body></body> 標(biāo)簽的后面,直接可以使用

640這個(gè)寬度參數(shù)可以根據(jù)設(shè)計(jì)稿自定義驼壶,這里width取640氏豌,是根據(jù)iPhone5的寬度設(shè)置的,將devTools移動(dòng)設(shè)備切換到iPhone5可以看到1rem=50px

總結(jié)

關(guān)于移動(dòng)端適配的問題热凹,當(dāng)然還有其他的一些解決方案泵喘,像是淘寶,網(wǎng)易都有自己的解決方案般妙,都比較好纪铺,也可以去搜搜且看看他們的解決思想
本文的移動(dòng)端適配解決思想:

  1. 先在html <head></head> 中設(shè)置meta標(biāo)簽:
 <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=10.0,user-scalable=no">

2.使用rem作為長(zhǎng)度單位, 利用css媒體查詢或者js動(dòng)態(tài)設(shè)置根據(jù)頁面寬度設(shè)置 font-size 從而改變r(jià)em,使得頁面元素做到最大自適應(yīng)碟渺,代碼已經(jīng)貼在上面了 (*′?`)skr~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲜锚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苫拍,更是在濱河造成了極大的恐慌芜繁,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绒极,死亡現(xiàn)場(chǎng)離奇詭異骏令,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)垄提,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門榔袋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來周拐,“玉大人,你說我怎么就攤上這事凰兑∷傺” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵聪黎,是天一觀的道長(zhǎng)罕容。 經(jīng)常有香客問我,道長(zhǎng)稿饰,這世上最難降的妖魔是什么锦秒? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮喉镰,結(jié)果婚禮上旅择,老公的妹妹穿的比我還像新娘。我一直安慰自己侣姆,他們只是感情好生真,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著捺宗,像睡著了一般柱蟀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚜厉,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天长已,我揣著相機(jī)與錄音,去河邊找鬼昼牛。 笑死术瓮,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的贰健。 我是一名探鬼主播胞四,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伶椿!你這毒婦竟也來了辜伟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤悬垃,失蹤者是張志新(化名)和其女友劉穎游昼,沒想到半個(gè)月后甘苍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尝蠕,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年载庭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了看彼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片廊佩。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖靖榕,靈堂內(nèi)的尸體忽然破棺而出标锄,到底是詐尸還是另有隱情,我是刑警寧澤茁计,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布料皇,位于F島的核電站,受9級(jí)特大地震影響星压,放射性物質(zhì)發(fā)生泄漏践剂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一娜膘、第九天 我趴在偏房一處隱蔽的房頂上張望逊脯。 院中可真熱鬧,春花似錦竣贪、人聲如沸军洼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忱叭。三九已至赐纱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背殖氏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留独柑,地道東北人盈厘。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像盗胀,于是被迫代替她去往敵國和親艘蹋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案票灰? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,728評(píng)論 1 92
  • 在移動(dòng)互聯(lián)網(wǎng)快速發(fā)展的今天女阀,手機(jī)的種類和尺寸越來越多,作為前端的小伙伴們可能會(huì)越來越頭疼屑迂,但又不得不去適配一款又一...
    keenjaan閱讀 26,792評(píng)論 9 86
  • 不知不覺做前端已經(jīng)兩年了浸策,從PC端,移動(dòng)端惹盼,微信小程序一路走來到今天剛剛開放注冊(cè)的快應(yīng)用(手機(jī)廠商對(duì)抗小程序的新技...
    是ADI呀閱讀 3,087評(píng)論 0 10
  • 最近在重構(gòu)公司的一個(gè)移動(dòng)端項(xiàng)目庸汗,除了需要對(duì)新項(xiàng)目進(jìn)行前端技術(shù)棧的搭建外,還需要考慮的一個(gè)重要問題就是移動(dòng)端適配手报,關(guān)...
    淘淘笙悅閱讀 1,715評(píng)論 1 24
  • 面對(duì)著這樣那樣的計(jì)劃 人生真的很迷茫 害怕孤獨(dú) 害怕成長(zhǎng) 希望能夠繼續(xù)留在學(xué)校里學(xué)習(xí) 又不希望留在空無一人的宿舍里...
    南島閱讀 319評(píng)論 0 0