前端如何實(shí)現(xiàn)視覺設(shè)計(jì)稿

在這篇文章中將和大家探討一下關(guān)于前端在移動(dòng)端開發(fā)如何去實(shí)現(xiàn)視覺設(shè)計(jì)稿。探討過后,在大家的實(shí)際工作中或許能幫助解決一些問題诈火。

前端工程師需要明白的「像素」

一般設(shè)計(jì)稿是 640px 或者 750px(現(xiàn)在最流行)导坟,但是 iPhone 5 不是 320px 寬嗎,iPhone 6 不是 375px 寬嗎?
這里需要理解一下基礎(chǔ)概念: 設(shè)備像素(device pixel)屎蜓,CSS 像素(css pixel)以及設(shè)備像素比(device pixel ratio)。

  • 設(shè)備像素 (device pixel):
    設(shè)備像素設(shè)是物理概念钥勋,指的是設(shè)備中使用的物理像素炬转。
    比如 iPhone 5 的分辨率 640 x 1136px辆苔。

  • CSS 像素 (css pixel):
    CSS 像素是 Web 編程的概念,指的是 CSS 樣式代碼中使用的邏輯像素扼劈。
    在 CSS 規(guī)范中驻啤,長(zhǎng)度單位可以分為兩類,絕對(duì) (absolute) 單位以及相對(duì) (relative) 單位荐吵。px是一個(gè)相對(duì)單位骑冗,相對(duì)的是設(shè)備像素 (device pixel)。

  • 設(shè)備像素比 (device pixel ratio):
    window.devicePixelRatio先煎,是設(shè)備上物理像素和設(shè)備獨(dú)立像素 (device-independent pixels (dips)) 的比例贼涩。
    公式表示就是 window.devicePixelRatio = 物理像素 / dips

垂直手機(jī)屏幕下,使用<meta name="viewport" content="width=device-width"/>薯蝎,iPhone 5 屏幕物理像素 640 像素遥倦,獨(dú)立像素還是 320 像素,因此占锯,window.devicePixelRatio 等于 2袒哥。

比如 iPhone 5,6 使用的是 Retina 視網(wǎng)膜屏幕(2 倍屏)消略,6 Plus 是 3 倍屏堡称,使用2px × 2px的 device pixel 代表1px × 1px的 css pixel,所以設(shè)備像素?cái)?shù)為640 × 1136px(5)疑俭,750 × 1134(6)粮呢,而 CSS 邏輯像素?cái)?shù)為 320 x 568px(5),375 × 667(6)钞艇;5啄寡,6 的 window.devicePixelRatio=2,6 Plus 為 3哩照。

H5 適配:rem 方案
rem:是 CSS3 新增的一個(gè)相對(duì)單位挺物,相對(duì)于 html 標(biāo)簽的 font-size 的大小為基礎(chǔ)的。而 font-size 的大小可以動(dòng)態(tài)根據(jù)手機(jī)屏幕寬度document.documentElement.clientWidth 來(lái)設(shè)置飘弧,從而達(dá)到自適應(yīng)屏幕的目的识藤。

我這里找了一下小米網(wǎng)易次伶,拉勾網(wǎng)痴昧,手淘 以及糯米,大同小異冠王。

小米官網(wǎng)

設(shè)計(jì)稿是 720px 的赶撰,即 5 英寸屏幕的安卓手機(jī)(720 x 1280px)。
對(duì)于頁(yè)面縮放和橫豎屏事件進(jìn)行監(jiān)聽,改變 html 根元素字體 clientWidth/720/100豪娜。
如圖是這樣計(jì)算的 375/(720/100) = 52.0833

網(wǎng)易

iPhone 6 : 375/7.5=50, 則知道設(shè)計(jì)稿應(yīng)該是基于 iPhone 6 來(lái)的餐胀,所以它的設(shè)計(jì)稿豎直放時(shí)的橫向分辨率為 750px,為了計(jì)算方便瘤载,取一個(gè) 100px 的 font-size 為參照否灾,那么 body 元素的寬度就可以設(shè)置為 width: 7.5rem,于是 html 的 font-size=deviceWidth / 7.5鸣奔。布局時(shí)墨技,設(shè)計(jì)圖標(biāo)注的尺寸除以 100 得到 css 中的尺寸。并且布局中的 font-size 也可用 rem 單位溃蔫。

拉勾網(wǎng)

html {
    font-size: 65.5%;
}

設(shè)置html根元素字體為65.5%健提,對(duì)應(yīng)px單位則為10.48px琳猫,則列表里時(shí)間信息字體設(shè)置為1rem = 10.48px伟叛,chrome在-webkit-text-size-adjust: 100%;情況下小于12px的一律顯示為12px

拉勾網(wǎng)頁(yè)面列表部分是px為單位脐嫂,字體是rem统刮,底部bar是使用百分百來(lái)控制寬高間距。

之前網(wǎng)上討論的比較多的是

body {
    font-size: 62.5%;
}
p {
    font-size: 1.2em;
}

1em = 16px * 62.5% = 10px账千,em 的初始值為 1em = 16px侥蒙,而為了方便計(jì)算, 換算一下 10 / 16(16px 是 Chrome 瀏覽器默認(rèn)字體大性茸唷)鞭衩。缺點(diǎn)是進(jìn)行任何元素設(shè)置,都有可能需要知道他父元素的大小娃善,比較繁瑣低效论衍。

手淘

Image text

(1)動(dòng)態(tài)設(shè)置 viewport的scale

var scale = 1 / devicePixelRatio;
document.querySelector('meta[name="viewport"]').setAttribute('content','initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

(2)動(dòng)態(tài)計(jì)算 html 的 font-size

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

(3)布局的時(shí)候,各元素的 css 尺寸 = 設(shè)計(jì)稿標(biāo)注尺寸/設(shè)計(jì)稿橫向分辨率/10

設(shè)計(jì)稿是 750 的聚磺,所以 html 的 font-size 就是 75坯台,如果某個(gè)元素是 150px的寬,換算成 rem 就是 150 / 75 = 2rem瘫寝。

整個(gè)手淘設(shè)計(jì)師和前端開發(fā)的適配協(xié)作基本思路是:

  • 選擇一種尺寸作為設(shè)計(jì)和開發(fā)基準(zhǔn)
  • 定義一套適配規(guī)則蜒蕾,自動(dòng)適配剩下的兩種尺寸(介于 iPhone 6的小屏和大屏)
  • 特殊適配效果給出設(shè)計(jì)效果

手淘推出了一套移動(dòng)端適配的方案——Flexible 方案

總結(jié)來(lái)說:

  • 動(dòng)態(tài)讀取設(shè)備寬度并結(jié)合設(shè)備的像素比
  • 動(dòng)態(tài)改變 html 的 font-size 大小 & 頁(yè)面縮放比例
  • 影響以 rem 為單位的元素的最終呈現(xiàn)


px 方案:css 尺寸為對(duì)應(yīng)設(shè)計(jì)稿/2

設(shè)計(jì)稿是 750 的焕阿。


優(yōu)點(diǎn):簡(jiǎn)單粗暴咪啡,所有 css 尺寸均為設(shè)計(jì)稿尺寸直接除 2,開發(fā)快速簡(jiǎn)單暮屡;
缺點(diǎn):可能出現(xiàn)一排放不下的情況撤摸,需要針對(duì)小屏幕如 5 及以下做單獨(dú)適配

vw 方案

  • 糯米 WAP
    利用 CSS3 中新增單位 <mark style="background: rgb(255, 255, 0); color: rgb(0, 0, 0);">vw</mark>,配合 <mark style="background: rgb(255, 255, 0); color: rgb(0, 0, 0);">百分比</mark>`來(lái)做響應(yīng)式開發(fā)。
單位 釋義 說明
px 相對(duì)于顯示器屏幕分辨率 -
em 相對(duì)于父元素字體大小 -
rem 相對(duì)于根元素字體大小 css3
vw 相對(duì)于視窗的寬度 css3
vh 相對(duì)于視窗的高度 css3

vw 相對(duì)于視窗的寬度:視窗寬度是 100vw愁溜。
如果視區(qū)寬度是 100vm, 則 1vm 是視區(qū)寬度的 1/100, 也就是 1%疾嗅,類似于 width: 1%。
那 iPhone 6 來(lái)說冕象,document.documentElement.clientWidth=375, 則豆腐塊寬度為 375/100*30=112.5px


混合: rem px vw 百分百等單位混用

  • rem & 百分比%
body {
    padding-bottom: 14.0625%;
}
a.link {
    width: 30vw;
    height: 23vw;
}

略代承,同上糯米WAP

  • rem & vw
html {  
    font-size: 4.375vw;
}

這里假設(shè)設(shè)計(jì)稿 640px,則設(shè)置根元素 font-size 為 4.375vw渐扮,根據(jù)屏幕寬度自適應(yīng)论悴,在視窗寬度為 320px 的時(shí)候,正好是 14px (14 / 320 = 0.04375)墓律。 達(dá)到頁(yè)面默認(rèn)字體大小 14px 的目的(其他大小也 ok)膀估。好了,現(xiàn)在頁(yè)面上所有以 rem 為單位的屬性值都會(huì)隨著屏幕的寬度變化而變化耻讽,達(dá)到自適應(yīng)的目的察纯。(自適應(yīng)不用 js 動(dòng)態(tài)設(shè)置根元素大小

p {  
    font-size: 1rem;   
    padding-top: 2rem: /* 設(shè)計(jì)稿上為 28px */
}

總結(jié)

在移動(dòng)端頁(yè)面開發(fā)中,視覺童鞋一般會(huì)用 750px(iPhone 6)來(lái)出設(shè)計(jì)稿针肥,然后要求 FE 童鞋能夠做到頁(yè)面是自適應(yīng)屏幕的饼记,這種情況下就可以用 rem 或者 vm 等相對(duì)單位來(lái)做適配,愉快和視覺童鞋一起玩耍啦慰枕。

內(nèi)容轉(zhuǎn)自:大專欄

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末具则,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子具帮,更是在濱河造成了極大的恐慌博肋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜂厅,死亡現(xiàn)場(chǎng)離奇詭異匪凡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)葛峻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門锹雏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人术奖,你說我怎么就攤上這事礁遵。” “怎么了采记?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵佣耐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我唧龄,道長(zhǎng)兼砖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮讽挟,結(jié)果婚禮上懒叛,老公的妹妹穿的比我還像新娘。我一直安慰自己耽梅,他們只是感情好薛窥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眼姐,像睡著了一般诅迷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上众旗,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天罢杉,我揣著相機(jī)與錄音,去河邊找鬼贡歧。 笑死滩租,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的艘款。 我是一名探鬼主播持际,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼哗咆!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起益眉,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤晌柬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后郭脂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體年碘,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年展鸡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屿衅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莹弊,死狀恐怖涤久,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情忍弛,我是刑警寧澤响迂,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站细疚,受9級(jí)特大地震影響蔗彤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一然遏、第九天 我趴在偏房一處隱蔽的房頂上張望贫途。 院中可真熱鬧,春花似錦待侵、人聲如沸潮饱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)香拉。三九已至,卻和暖如春中狂,著一層夾襖步出監(jiān)牢的瞬間凫碌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工胃榕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盛险,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓勋又,卻偏偏與公主長(zhǎng)得像苦掘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子楔壤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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