移動端開發(fā)技巧(二)——四種移動端適配方案

完整移動端開發(fā)筆記,請戳https://github.com/zenglinan/Mobile-note
目錄:

  1. viewport適配
  2. vw適配
  3. rem適配
  4. flex彈性盒

1. viewport適配

流程

  1. 按照設(shè)計(jì)稿上標(biāo)注的尺寸進(jìn)行開發(fā)
  2. 在頁面剛開始渲染的時(shí)候設(shè)置meta外傅,將渲染的頁面的寬度設(shè)為設(shè)計(jì)稿的寬度
  3. 將頁面整體縮放乍丈,縮放比例為當(dāng)前屏幕的獨(dú)立像素寬度/設(shè)計(jì)稿寬度
// 放在頁面頭部
<script>
    const WIDTH = 750   // 設(shè)計(jì)稿寬度
    const mobileAdapter = () => {
      let scale = screen.width/WIDTH  // 縮放比
      let content = `width=${WIDTH}, initial-scale=${scale}, maximum-scale=${scale}, minimum-scale=${scale}`
      let meta = document.querySelector('meta[name=viewport]')
      if(!meta) {
        meta = document.createElement('meta')
        meta.setAttribute('name', 'viewport')
        document.head.appendChild(meta)
      } 
      meta.setAttribute('content', content)
    }
    mobileAdapter()
    window.onorientationchange = mobileAdapter  // 監(jiān)聽屏幕旋轉(zhuǎn)
  </script> 

優(yōu)點(diǎn):

方便開發(fā),不用計(jì)算混埠,一切元素的寬高按設(shè)計(jì)稿來即可

缺點(diǎn):

邊框等不需要縮放的元素繁疤,也會跟著縮放

2. vw適配

為了解決方案1(viewport適配)的缺點(diǎn)(無法對部分縮放,部分不縮放)柒凉,出現(xiàn)了vw適配

流程

  1. 將設(shè)計(jì)稿(假設(shè)750px)上需要適配的尺寸轉(zhuǎn)換成vw,比如頁面元素字體標(biāo)注的大小是32px篓跛,換成vw為 32/(750/100) vw
  2. 對于需要等比縮放的元素膝捞,CSS使用轉(zhuǎn)換后的單位
  3. 對于不需要縮放的元素,比如邊框陰影愧沟,使用固定單位px
    (1) viewport設(shè)置 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">

    把layout viewport 寬度設(shè)置為設(shè)備寬度蔬咬,不需要縮放
    (2) 用js定義css的自定義屬性--width鲤遥,表示每vw對應(yīng)的像素?cái)?shù)。
    (3) 根據(jù)設(shè)計(jì)稿標(biāo)注設(shè)置樣式林艘,比如標(biāo)注稿里元素寬度為20px盖奈。這里設(shè)置 calc(20vw / var(--width))
// HTML
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>viewport縮放實(shí)戰(zhàn)</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">
  <script>
    const WIDTH = 750
    document.documentElement.style.setProperty('--width', (WIDTH/100));
  </script>
</head>

// CSS
header {
  font-size: calc(28vw / var(--width));
}

優(yōu)點(diǎn)

可以對需要縮放的元素進(jìn)行縮放,保留不需縮放的元素

缺點(diǎn)

書寫復(fù)雜狐援,需要用calc計(jì)算

3. rem適配

為了改良vw適配書寫復(fù)雜的缺點(diǎn)钢坦,出現(xiàn)了rem適配。

假設(shè)設(shè)計(jì)稿寬度為750px啥酱,手機(jī)端寬度為320px爹凹,上面字體標(biāo)注為32px,則字體在手機(jī)端應(yīng)該設(shè)為32 * (320/750) px镶殷。

將1rem設(shè)為 320/750禾酱,則字體大小可直接表示為32rem。

但是瀏覽器字體大小有限制批钠,不能小于12px宇植。故將html的font-size設(shè)為 (移動端設(shè)備寬度/設(shè)計(jì)稿寬度)x100

流程

  1. 拿到設(shè)計(jì)稿(假設(shè)設(shè)計(jì)稿尺寸為750px,設(shè)計(jì)稿的元素標(biāo)是基于此寬度標(biāo)注)
  2. 對設(shè)計(jì)稿的標(biāo)注進(jìn)行轉(zhuǎn)換
  3. 對于需要等比縮放的元素埋心,CSS使用轉(zhuǎn)換后的單位
  4. 對于不需要縮放的元素,比如邊框陰影忙上,使用固定單位px
// HTML
<head>
  <meta charset="utf-8">
  <title> 動態(tài)rem縮放實(shí)戰(zhàn)</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">
  <script>
    const WIDTH = 750  //設(shè)計(jì)稿尺寸
    const setView = () => {
      console.log(screen.width)
      document.documentElement.style.fontSize = (100*screen.width/WIDTH) + 'px'
    }
    window.onorientationchange = setView
    setView()
  </script>
</head>

// CSS
body{
  font-size: .32rem;  // 設(shè)計(jì)稿上寬度為32px
}

優(yōu)點(diǎn):書寫簡單可見

4. flex彈性盒

對于不需要縮放的元素拷呆,也可以采用flex布局延伸
eg.左邊頭像,右邊文本疫粥,文本可以進(jìn)行自適應(yīng)茬斧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梗逮,隨后出現(xiàn)的幾起案子项秉,更是在濱河造成了極大的恐慌,老刑警劉巖慷彤,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娄蔼,死亡現(xiàn)場離奇詭異,居然都是意外死亡底哗,警方通過查閱死者的電腦和手機(jī)岁诉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跋选,“玉大人涕癣,你說我怎么就攤上這事∏氨辏” “怎么了坠韩?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵距潘,是天一觀的道長。 經(jīng)常有香客問我只搁,道長绽昼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任须蜗,我火速辦了婚禮硅确,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘明肮。我一直安慰自己菱农,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布柿估。 她就那樣靜靜地躺著循未,像睡著了一般。 火紅的嫁衣襯著肌膚如雪秫舌。 梳的紋絲不亂的頭發(fā)上的妖,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機(jī)與錄音足陨,去河邊找鬼嫂粟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛墨缘,可吹牛的內(nèi)容都是我干的星虹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼镊讼,長吁一口氣:“原來是場噩夢啊……” “哼宽涌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蝶棋,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤卸亮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后玩裙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兼贸,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年献酗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了寝受。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罕偎,死狀恐怖很澄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤甩苛,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布蹂楣,位于F島的核電站,受9級特大地震影響讯蒲,放射性物質(zhì)發(fā)生泄漏痊土。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一墨林、第九天 我趴在偏房一處隱蔽的房頂上張望赁酝。 院中可真熱鬧,春花似錦旭等、人聲如沸酌呆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隙袁。三九已至,卻和暖如春弃榨,著一層夾襖步出監(jiān)牢的瞬間菩收,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工鲸睛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娜饵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓腊凶,卻偏偏與公主長得像划咐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子钧萍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評論 2 353

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

  • 移動端適配方案:1)viewport(scale=1/dpr)2)rem3)flex4)vm/vh一、什么是移動端...
    puxiaotaoc閱讀 43,075評論 3 56
  • 適配 在不同尺寸的移動設(shè)備上, 頁面相對性的達(dá)到合理的展示(自適應(yīng)), 或者保持同一效果的等比縮放(看起來差不多)...
    Veycn閱讀 1,632評論 0 0
  • 一.視口(viewport) viewport視口 viewport是嚴(yán)格的等于瀏覽器的窗口政鼠。viewport與跟...
    繪生活文創(chuàng)空間閱讀 1,903評論 0 0
  • 剛開始做移動端web開發(fā)的同學(xué)應(yīng)該都碰到過頁面適配問題风瘦,為什么我在開發(fā)手機(jī)上調(diào)試好的頁面在其他手機(jī)會有這樣或那樣的...
    留七七閱讀 19,357評論 5 80
  • PC頁面的人聊的最多的就是兼容,這是因?yàn)闉g覽器之間的差異引起的公般。而移動端是基本沒有兼容的問題的万搔,全是CSS3」倭保可是...
    卓三陽閱讀 1,802評論 0 2