移動端Web App自適應布局探索與總結(jié)

1越败、困擾多時的問題

在這之前做Web App開發(fā)的的時候,在自適應方面一般都是寬度通過百分比骨田,高度以iPhone6跟iPhone5之間的一個平衡值寫死埠通,我們的設(shè)計稿都是iPhone5的640 * 1136標準长赞,所以高度一般取個大概值晦攒,各種圖標的寬高也是取平衡值寫死,然后部分樣式通過媒體查詢來設(shè)置得哆,例如背景圖的多倍圖脯颜、基礎(chǔ)字體大小、圖標寬高贩据。

這樣做的弊端很明顯:

做出來的頁面在各種手機端看起來的物理大卸安佟(高度)是一樣的,所以在大屏手機會覺得頁面稍小乐设,小屏手機頁面稍大

如果要使高度能更好的適應各種手機屏幕讼庇,需要寫太多的媒體查詢樣式绎巨,效率低下

全屏背景圖片跟頁面元素需要耦合時近尚,元素位置的確定尤為困難(可能需要通過百分比去確定元素的橫向位置,但始終會有誤差)

...

最近在微博上看到流云諸葛總結(jié)的一篇文章《從網(wǎng)易與淘寶的font-size思考前端設(shè)計稿與工作流》场勤,其中介紹到的幾種Web App適配方案戈锻,我們現(xiàn)在的做法恰好是跟拉勾網(wǎng)類似的簡單方案歼跟,當然就會有上面我提到的一些問題,最后經(jīng)過預研和demo測試格遭,我們采取了網(wǎng)易跟淘寶的方案哈街,其實這兩者的方案是大同小異,都是基于rem的適配方案拒迅。

2骚秦、解決問題的方案

網(wǎng)易跟淘寶的方案介紹在上面流云諸葛的文章中已經(jīng)寫的很清楚了,建議可以先看看那篇文章再閱讀下面我所說的璧微,可能會更加清晰作箍。

(1)方案的簡單介紹: 基于rem

前提:頁面元素的布局尺寸全都以設(shè)計稿為基準等比例設(shè)置。

給html根節(jié)點設(shè)置一個基礎(chǔ)font-size值前硫,然后頁面的所有元素布局均相對于該font-size值采用rem單位設(shè)定胞得。那么基礎(chǔ)的font-size值該如何取呢?

假如通過媒體查詢設(shè)置font-size屹电,只能解決一部分的情況阶剑,而且并不能完成適配,因為手機屏幕寬度類型實在太多了危号,所以font-size的取值要通過js計算牧愁,取當前viewport的deviceWidth與設(shè)計稿的寬 的 比例值,例如:我們的設(shè)計稿尺寸都是640px的葱色,iphone5的deviceWidth是320px递宅,那么計算出來的font-size值就是 320 / 640 = 0.5,因為得出的font-size太小苍狰,不方便計算办龄,且有的瀏覽器可能不兼容太小字號,所以將font-size放大100倍淋昭,所以最終計算出來的font-size為 320 / 640 * 100 = 50(px); 當然俐填,這個值是根據(jù)設(shè)計稿來計算的,所以根據(jù)計算規(guī)則翔忽,下面列出幾種常見設(shè)計稿相應的font-size值:


deviceWidth?=?320英融,font-size?=?320?/?6.4?=?50px

deviceWidth?=?375,font-size?=?375?/?6.4?=?58.59375px

deviceWidth?=?414歇式,font-size?=?414?/?6.4?=?64.6875px

deviceWidth?=?500驶悟,font-size?=?500?/?6.4?=?78.125px

可在script標簽加上如下代碼

(function()?{

document.addEventListener('DOMContentLoaded',function()?{

varhtml?=?document.documentElement;

varwindowWidth?=?html.clientWidth;

html.style.fontSize?=?windowWidth?/?6.4?+'px';

//?等價于html.style.fontSize?=?windowWidth?/?640?*?100?+?'px';

},false);

})();

//?這個6.4就是根據(jù)設(shè)計稿的橫向?qū)挾葋泶_定的,假如你的設(shè)計稿是750

//?那么?html.style.fontSize?=?windowWidth?/?7.5?+?'px';

至此材失,font-size的基礎(chǔ)值就確定好了痕鳍,而且知道該font-size值是手機deviceWidth跟設(shè)計稿的比例值 的 100倍(重要)

(2)那么頁面元素該如何設(shè)置寬高、邊距

例如:一個設(shè)計稿寬高為140px的圖標,左邊距為50px笼呆,那么它的css應該這樣寫

.icon?{

width:?1.4rem;/*?像素換算rem:140px?/?100?=?1.4rem?*/

height:?1.4rem;

margin:?0?0?0?.5rem;

}

因為html的font-size是放大了100倍熊响,所以計算rem時,要用設(shè)計稿的實際像素除以100诗赌,140px / 100 = 1.4rem; 最后實際的像素大小就會由deviceWidth跟設(shè)計稿的橫向?qū)?的 比例 自動計算出來汗茄。

如圖iPhone5下面的效果:

iPhone6的效果:

可以看出來:html的font-size動態(tài)根據(jù)deviceWidth改變,圖標的寬高铭若、邊距等也根據(jù)font-size動態(tài)按比例變化洪碳,大功告成了?不對叼屠,相信機智的你已經(jīng)看到貌似在iPhone6的下有的圖標背景錯位了偶宫。。是的环鲤,這暴露出了一個背景使用雪碧圖的一個弊端(由于font-size小數(shù)點太多纯趋,計算出實際背景圖大小background-size跟背景圖位置background-position時瀏覽器精度不夠可能就會出現(xiàn)位置的偏差(我猜的),這個后面還會詳細講解決方案)

到這里冷离,設(shè)置寬高吵冒、邊距等都OK了,接下來...

(3)其他元素的字體大小該如何設(shè)置西剥?

在流云諸葛的文章中講到痹栖,網(wǎng)易跟淘寶的做法都是使用額外的媒體查詢設(shè)置幾種字體大小,例如:

@mediascreen?and?(max-width:?320px)?{

body{font-size:?14px;}

}

@mediascreen?and?(min-width:?321px)?and?(max-width:?413px)?{

body{font-size:?16px;}

}

@mediascreen?and?(min-width:?414px)?and?(max-width:?639px)?{

body{font-size:?17px;}

}

@mediascreen?and?(min-width:?640px)?{

body{font-size:?18px;}

}

可為什么不用rem呢瞭空?后來去查了一番資料揪阿,發(fā)現(xiàn)有一種叫做點陣字體的存在(什么是點陣字體),也叫作位圖字體咆畏,位圖我們都知道南捂,跟矢量圖是有區(qū)別的,就是放大會模糊旧找,所以點陣字體也是放大會模糊的溺健,如果根據(jù)rem設(shè)置字體大小,字體會自由縮放钮蛛,可能就會導致點陣字體模糊鞭缭,所以需要設(shè)定使用幾種固定大小的字體。不過魏颓,在正常情況下岭辣,系統(tǒng)自帶的字體都是矢量字體,所以使用rem為單位是沒有問題的甸饱,除非你的網(wǎng)頁需要用到特殊的點陣字體沦童。

總結(jié):如果網(wǎng)頁沒有用到特殊的點陣字體,字體單位使用rem,如果用到了點陣字體搞动,字體需要通過媒體查詢設(shè)置幾種固定大小的字體

(4)關(guān)于背景圖片的錯位問題

上面已經(jīng)發(fā)現(xiàn)了,通過換算rem設(shè)置background-size跟background-position的時候渣刷,在一些手機型號下會出現(xiàn)背景圖錯位的情況鹦肿,可是如果不用rem設(shè)置的話,又不能達到適配的目的辅柴。(background-size箩溃、background-position的rem換算方法跟前面講的寬高設(shè)定一樣,都是設(shè)計稿尺寸(這時應該是雪碧圖的原始尺寸)除以100倍)

最后經(jīng)過嘗試碌嘀,得出了幾種解決方案:

1)如圖(推薦方案):

圖標的樣式

.icon?{

width:?1.4rem;

height:?1.4rem;

background-image:?url(sprite.png);

background-repeat:?no-repeat;

background-size:?1.4rem;

}

.icon3?{

background-position:?0?-2.8rem;

}

解決方法涣旨,如圖:

代碼如下:

.icon-fix?{

background:?none;

position:?relative;

overflow:?hidden;

}

.icon-fix:after?{

content:'';

display:?block;

width:?10000%;

height:?10000%;

position:?absolute;

left:?0;

top:?0;

background-image:?url(sprite.png);

background-repeat:?no-repeat;

background-size:?140rem;

-webkit-transform-origin:?0?0;

-webkit-transform:?scale(.01);

transform-origin:?0?0;

transform:?scale(.01);

}

.icon3:after?{

background-position:?0?-280rem;

}

所有相關(guān)代碼(傳送門)。

2)不使用雪碧圖股冗,使用單個背景圖霹陡,這個時候就不存在background-position的需要,只需設(shè)定background-size: contain;即可止状,這樣做的弊端就在于無法使用雪碧圖烹棉,圖片請求增多,適用于頁面圖標較少的情況

3)使用嵌套img標簽,通過絕對定位模擬background-position,具體請看responsive-sprites补履,這種做法需要更多的標簽服协,且img圖片只能放圖標尺寸大小一樣的雪碧圖,而且不能通過媒體查詢使用多倍圖

以上3中解決方案第一種最優(yōu)短条,當然有些特殊情況可能需要按需選擇!

原文地址:http://www.cocoachina.com/webapp/20151110/14148.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市摘昌,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌高蜂,老刑警劉巖第焰,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妨马,居然都是意外死亡挺举,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門烘跺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來湘纵,“玉大人,你說我怎么就攤上這事滤淳∥嗯纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铺敌。 經(jīng)常有香客問我汇歹,道長,這世上最難降的妖魔是什么偿凭? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任产弹,我火速辦了婚禮,結(jié)果婚禮上弯囊,老公的妹妹穿的比我還像新娘痰哨。我一直安慰自己,他們只是感情好匾嘱,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布斤斧。 她就那樣靜靜地躺著,像睡著了一般霎烙。 火紅的嫁衣襯著肌膚如雪撬讽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天悬垃,我揣著相機與錄音锐秦,去河邊找鬼。 笑死盗忱,一個胖子當著我的面吹牛酱床,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趟佃,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼扇谣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闲昭?” 一聲冷哼從身側(cè)響起罐寨,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎序矩,沒想到半個月后鸯绿,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡簸淀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年瓶蝴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片租幕。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡舷手,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出劲绪,到底是詐尸還是另有隱情男窟,我是刑警寧澤盆赤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站歉眷,受9級特大地震影響牺六,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汗捡,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一淑际、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凉唐,春花似錦、人聲如沸霍骄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽读整。三九已至簿训,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間米间,已是汗流浹背强品。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屈糊,地道東北人的榛。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像逻锐,于是被迫代替她去往敵國和親夫晌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案昧诱? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,728評論 1 92
  • 前言 對于熟悉pc端的小伙伴來說,對于靜態(tài)頁面的布局,一般都是沒有什么問題的,為了保持各瀏覽器顯示的一致性,無論是...
    itclanCoder閱讀 13,632評論 5 61
  • 一盏档、下面我將簡單的介紹移動端布 局的八種方式: 1.固定布局 2.流動布局 3.浮動布局 4.定位布局 5.混合布...
    李好Ario閱讀 1,560評論 0 8
  • meta基礎(chǔ)知識 H5頁面窗口自動調(diào)整到設(shè)備寬度凶掰,并禁止用戶縮放頁面 忽略將頁面中的數(shù)字識別為電話號碼 忽略And...
    Mycro閱讀 871評論 0 11
  • 我學到了什么 1、頭一次知道“拆書”這個詞是在每天三件事的微信群里蜈亩,群主落日蕭峰小哥哥在他自己的每日三件事里面經(jīng)常...
    雲(yún)外蒼天閱讀 180評論 0 0