移動(dòng)端適配 em和rem的區(qū)別

移動(dòng)端分辨率

移動(dòng)端設(shè)計(jì)時(shí)參考的分辨率一般為:320* 568, 375* 667, 414* 736

大神總結(jié)

em和rem的區(qū)別

  1. PX是像素單位澎羞,在同一個(gè)瀏覽器分辨率下一經(jīng)設(shè)定就是固定的值。
  2. em和rem區(qū)別于PX 它們都是可擴(kuò)展單位 區(qū)別在于對(duì)應(yīng)參照物字體大小不同 解析成PX時(shí)的大小不一樣椒功。
  3. 當(dāng)使用 rem 單位栏豺,他們轉(zhuǎn)化為像素大小取決于頁(yè)根元素(html)的字體大小, 根元素字體大小乘以 rem 值。
    <script> document.documentElement.style.fontSize = document.documentElement.clientWidth / 750 * 40 + "px";</script>
html{
font-size: 14px;
}
div{
  width:10rem;
}
// div的width解析后 width:140px;
  1. 當(dāng)使用em單位時(shí)鹉梨,像素值將是em值乘以當(dāng)前元素的父級(jí)元素父級(jí)的字體大小, 父元素字體大小乘以 em 值未状。
    <div class="div1">
        <div class="div2">
            這是em
        </div>
    </div>

        html{
            font-size: 14px;
        }
        .div1{
            font-size: 16px;
        }
        .div2{
           width: 10em;
        }
// div2的width解析后 width:160px;

移動(dòng)端適配方案之[postcss-px-to-viewport]

postcss-px-to-viewport俯画,將px單位自動(dòng)轉(zhuǎn)換成viewport單位

npm install postcss-px-to-viewport --save-dev

引入vue項(xiàng)目,再postcss.config.js引入

module.exports = {
  plugins: {
    autoprefixer: {},
    'postcss-px-to-viewport': {
       viewportWidth: 750,   // 視窗的寬度司草,對(duì)應(yīng)的是我們?cè)O(shè)計(jì)稿的寬度艰垂,一般是750
      viewportHeight: 1334, // 視窗的高度,根據(jù)750設(shè)備的寬度來(lái)指定埋虹,一般指定1334猜憎,也可以不配置
      unitPrecision: 3,     // 指定`px`轉(zhuǎn)換為視窗單位值的小數(shù)位數(shù)
      viewportUnit: "vw",   //指定需要轉(zhuǎn)換成的視窗單位,建議使用vw
      selectorBlackList: ['.ignore'],// 指定不轉(zhuǎn)換為視窗單位的類(lèi)搔课,可以自定義胰柑,可以無(wú)限添加,建議定義一至兩個(gè)通用的類(lèi)名
      minPixelValue: 1,     // 小于或等于`1px`不轉(zhuǎn)換為視窗單位,你也可以設(shè)置為你想要的值
      mediaQuery: false     // 允許在媒體查詢(xún)中轉(zhuǎn)換`px`
    }
  }
}

布局方法

  1. 選擇一個(gè)分辨率作為參考, 其他分辨率參考該分辨率做適配
// 屏幕適配( window.screen.width / 移動(dòng)端設(shè)計(jì)稿寬 * 100)也即是 (window.screen.width / 750 * 100)  ——*100 為了方便計(jì)算爬泥。即 font-size 值是手機(jī) deviceWidth 與設(shè)計(jì)稿比值的 100 倍
document.getElementsByTagName('html')[0].style.fontSize = window.screen.width / 7.5 + 'px';
// 或者
// rem計(jì)算方式柬讨,適配rem.
(function(doc, win) {
    var docEl = doc.documentElement,
        resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
        recalc = function() {
            var clientWidth = docEl.clientWidth;
            if(!clientWidth) return;
            docEl.style.fontSize = 100 * (clientWidth / 375) + 'px';
            doc.body.style.display = 'block';
        };

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

  1. 通過(guò)CSS 的 @media 響應(yīng)式 的根據(jù)不同的分辨率設(shè)置不同的樣式
    注意:
    1.寬度需要使用百分比
    2.圖片處理 給圖片指定的最大寬度為百分比。如果圖片大了袍啡,就同比縮小踩官,如果圖片小了,就原尺寸輸出境输。
/** 指定iPad **/
@media only screen and (min-width: 768px) and (max-width: 1024px) {
  #head { … }
  #content { … }
  #footer { … }
}
/**指定 iPhone **/
@media only screen and (min-width: 320px) and (max-width: 767px) {
  #head { … }
  #content { … }
  #footer { … }
}
/** 最大寬度**/
@media screen and (max-width: 980px) {
  #head { … }
  #content { … }
  #footer { … }
}
  1. 通過(guò)自適應(yīng)100%蔗牡、box-flex、rem(相對(duì)于根目錄的字體大小來(lái)設(shè)置)

meta 標(biāo)簽

meta 標(biāo)簽的 viewport 標(biāo)記設(shè)置當(dāng)前顯示給用戶(hù)內(nèi)容的窗口拖動(dòng)和縮放

<meta name="viewport" content="width=device-width,user-scalable=yes,initial-scale = 1.0,minimum-scale = 1.0,maximum-scale=1.0,target-densitydpi =device-dpi">

常用的屬性有

width 和height 分別指定視區(qū)的邏輯寬度和高度, width可以是像素或者device-width(當(dāng)前屏幕寬度)
initial-scale 設(shè)置頁(yè)面的初始縮放比例, 一般不縮放設(shè)置為1.0
user-scalable 用戶(hù)是否可以縮放視區(qū) yes/no

viewport 除此之外還有以下屬性

device-dpi 設(shè)備默認(rèn)的像素密度
high-dpi 高像素密度
medium-dpi 中等的像素密度
low-dpi 低像素密度

設(shè)置根目錄字體大小

設(shè)置根目錄字體大小為當(dāng)前屏幕寬度的1/3倍, 可根據(jù)需求自定義
這有一個(gè)好處就是, 可以固定所有標(biāo)簽的width或者height等數(shù)量屬性為固定的多少像素(PX), 瀏覽器會(huì)根據(jù)屏幕寬度按1/3的比例動(dòng)態(tài)改變, 類(lèi)似于使用百分比布局(width:100%),但是個(gè)人認(rèn)為使用px為單位更方便布局

    document.getElementsByTagName("html")[0].style.fontSize = document.documentElement.clientWidth/3 + "px";
    <script> document.documentElement.style.fontSize = document.documentElement.clientWidth / 750 * 40 + "px";</script>

此外移動(dòng)端布局還涉及到

  • AndroidIOS的兼容性問(wèn)題(背景圖片定位,瀏覽器兼容)
  • 移動(dòng)端UI框架(jquery weui)
  • 布局(flex,div)
// 標(biāo)簽瀏覽器兼容代碼
@charset "utf-8";
body, button, input, select, textarea {
    font: 12px/1.125 Arial, Helvetica, sans-serif
}

blockquote, body, button, dd, dl, dt, fieldset, form, h1, h2, h3, h4, h5, h6, hr, input, legend, li, ol, p, pre, td, textarea, th, ul {
    margin: 0;
    padding: 0
}

table {
    border-collapse: collapse;
    border-spacing: 0
}

li {
    list-style: none
}

fieldset, img {
    border: 0
}

q:after, q:before {
    content: ''
}

input, textarea {
    outline-style: none
}

input[type=text], input[type=password], textarea {
    outline-style: none;
    -webkit-appearance: none
}

textarea {
    resize: none
}

address, caption, cite, code, dfn, em, i, th, var {
    font-style: normal;
    font-weight: 400
}

legend {
    color: #000
}

abbr, acronym {
    border: 0;
    font-variant: normal
}

a, u {
    text-decoration: none
}

a:hover {
    text-decoration: underline
}

以下參考大神的做法,動(dòng)態(tài)修改body 的font-size

開(kāi)發(fā)原則:文字流式嗅剖,控件彈性辩越,圖片等比縮放。

設(shè)計(jì)稿豎直放時(shí)的橫向分辨率為640px信粮,為了計(jì)算方便黔攒,取一個(gè)100px的font-size為參照,那么body元素的寬度就可以設(shè)置為width: 6.4rem,于是html的font-size=deviceWidth / 6.4亏钩。這個(gè)deviceWidth就是viewport設(shè)置中的那個(gè)deviceWidth莲绰。
這個(gè)deviceWidth通過(guò)document.documentElement.clientWidth就能取到了,所以當(dāng)頁(yè)面的dom ready后姑丑,做的第一件事情就是:

document.documentElement.style.fontSize = document.documentElement.clientWidth / 6.4 + 'px';

這個(gè)6.4怎么來(lái)的蛤签,當(dāng)然是根據(jù)設(shè)計(jì)稿的橫向分辨率/100得來(lái)的。
如果設(shè)計(jì)稿基于iphone6栅哀,橫向分辨率為750震肮,body的width為750 / 100 = 7.5rem
如果設(shè)計(jì)稿基于iphone4/5,橫向分辨率為640留拾,body的width為640 / 100 = 6.4rem
當(dāng)deviceWidth大于640時(shí)戳晌,則物理分辨率大于1280(這就看設(shè)備的devicePixelRatio這個(gè)值了),應(yīng)該去訪(fǎng)問(wèn)pc網(wǎng)站了痴柔。

var deviceWidth = document.documentElement.clientWidth;
if(deviceWidth > 640) deviceWidth = 640;
document.documentElement.style.fontSize = deviceWidth / 6.4 + 'px';

//使用了less和sass這樣的css處理器
//定義一個(gè)變量和一個(gè)mixin@baseFontSize: 75;//基于視覺(jué)稿橫屏尺寸/100得出的基準(zhǔn)font-size
.px2rem(@name, @px){
    @{name}: @px / @baseFontSize * 1rem;
}
//使用示例:
.container {
    .px2rem(height, 240);
}
//less翻譯結(jié)果:
.container {
    height: 3.2rem;
}
如何與設(shè)計(jì)協(xié)作

第一步沦偎,視覺(jué)設(shè)計(jì)階段,設(shè)計(jì)師按寬度750px(iphone 6)做設(shè)計(jì)稿咳蔚,除圖片外所有設(shè)計(jì)元素用矢量路徑來(lái)做豪嚎。設(shè)計(jì)定稿后在750px的設(shè)計(jì)稿上做標(biāo)注,輸出標(biāo)注圖谈火。同時(shí)等比放大1.5倍生成寬度1125px的設(shè)計(jì)稿侈询,在1125px的稿子里切圖。

第二步糯耍,輸出兩個(gè)交付物給開(kāi)發(fā)工程師:一個(gè)是程序用到的@3x切圖資源扔字,另一個(gè)是寬度750px的設(shè)計(jì)標(biāo)注圖。

第三步温技,開(kāi)發(fā)工程師拿到750px標(biāo)注圖和@3x切圖資源革为,完成iPhone 6(375pt)的界面開(kāi)發(fā)。此階段不能用固定寬度的方式開(kāi)發(fā)界面舵鳞,得用自動(dòng)布局(auto layout)篷角,方便后續(xù)適配到其它尺寸。

第四步系任,適配調(diào)試階段,基于iPhone 6的界面效果虐块,分別向上向下調(diào)試iPhone 6 plus(414pt)和iPhone 5S及以下(320pt)的界面效果俩滥。由此完成大中小三屏適配。

第一篇簡(jiǎn)書(shū),記錄自己踩過(guò)的坑!

頁(yè)面規(guī)范

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贺奠,一起剝皮案震驚了整個(gè)濱河市霜旧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖挂据,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件以清,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡崎逃,警方通過(guò)查閱死者的電腦和手機(jī)掷倔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)个绍,“玉大人勒葱,你說(shuō)我怎么就攤上這事“褪粒” “怎么了凛虽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)广恢。 經(jīng)常有香客問(wèn)我凯旋,道長(zhǎng),這世上最難降的妖魔是什么钉迷? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任至非,我火速辦了婚禮,結(jié)果婚禮上篷牌,老公的妹妹穿的比我還像新娘睡蟋。我一直安慰自己,他們只是感情好枷颊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布戳杀。 她就那樣靜靜地躺著,像睡著了一般夭苗。 火紅的嫁衣襯著肌膚如雪信卡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天题造,我揣著相機(jī)與錄音傍菇,去河邊找鬼。 笑死界赔,一個(gè)胖子當(dāng)著我的面吹牛丢习,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淮悼,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咐低,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了袜腥?” 一聲冷哼從身側(cè)響起见擦,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后鲤屡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體损痰,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年酒来,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卢未。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡役首,死狀恐怖尝丐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情衡奥,我是刑警寧澤爹袁,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站矮固,受9級(jí)特大地震影響失息,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜档址,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一盹兢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧守伸,春花似錦绎秒、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蠢涝,卻和暖如春玄呛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背和二。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工徘铝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惯吕。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓惕它,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親废登。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怠缸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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