移動端開發(fā)系列——像素與viewport

目錄

  • 移動端開發(fā)的基本觀點
  • 像素基礎(chǔ)知識
  • viewport原理解析
  • 彈性布局
  • 響應(yīng)式設(shè)計
  • 1rem的運用
  • 移動端的事件
  • zepto庫的使用

移動端開發(fā)的基本觀點
  1. 移動端開發(fā)的認(rèn)識
    移動端開發(fā)就是手機端開發(fā)嗎罪帖?
    No佛寿、No晦攒、No...
    移動端是一個大的范疇兵志,小羊認(rèn)為應(yīng)該包括智能手機疾棵、平板在內(nèi)的移動設(shè)備金蜀,主要是這兩者竞惋;

  2. 移動端開發(fā)入門的學(xué)習(xí)路徑
    目錄就是


像素基礎(chǔ)知識

先拋3個概念燎潮,
px(CSS pixels):虛擬像素倔丈,可以理解為“直覺”像素憾儒,我要這個元素寬高10px;
dp(device pixels):設(shè)備像素(物理像素)乃沙,可以理解為實際的像素起趾,這個寬高為10px的元素在設(shè)備中實際用了多少個物理像素點表示;
dpr(device pixels ratio):設(shè)備像素比警儒,公式為1px = (dpr)^2 * 1dp训裆,可以理解為1px由多少個設(shè)備像素組成;

3個概念整合理解就是:
我為一個元素設(shè)置的寬高為10px蜀铲,那么實際在顯示設(shè)備中用多少個設(shè)備像素真實表示呢边琉?
dpr=2的話,那么1px由4個設(shè)備像素顯示记劝,如果是10px变姨,那么顯示設(shè)備實際用40個dp去顯示10px;
dpr=1厌丑,則1px由1個設(shè)備像素顯示定欧;
px和dp的區(qū)別就是直覺認(rèn)為只有10px和真實使用40dp;

為什么會出現(xiàn)dpr>=2的情形怒竿?dpr=1不是更加符合我的認(rèn)知和理解嗎砍鸠?

還不是人們?yōu)榱俗非蟾叩姆直媛仕拢直媛试礁邎D像越清晰8邸R琛!朦肘;

但是Mac的Retina屏和一般PC的在相同尺寸下饭弓,圖像卻清晰許多,為腎媒抠?

dpr>=2所致暗芏稀!A旖ⅰ夫嗓!

別的品牌機子老老實實1px = 1dp迟螺,Mac卻是1px = 4 dp,所以你直覺認(rèn)為大家都使用同樣多的像素點表示圖像(這是沒錯滴)舍咖,實際背后Mac用了多1倍(指的是dpr)的設(shè)備像素顯示圖像矩父;

實際應(yīng)用中,顯示設(shè)備不會直接給你個px和dpr

你實際看到的是以下的參數(shù)排霉,下面是腎6Plus的顯示屏參數(shù)信息:


再拋幾個概念窍株,可別暈咯...

英寸:這里指的是屏幕主對角線的尺寸,1英寸=2.54cm攻柠,5.5英寸約等于14cm(13.97cm)

分辨率:1920*1080像素球订,這里指的是物理像素(設(shè)備像素)

ppi(pixels per inch):每英寸的像素點,這里腎6Plus為每英寸有401個像素點

那么ppi是如何計算出來的呢瑰钮?
顧名思義冒滩,每英寸的像素點(設(shè)備像素),已知屏幕分辨率和主對角線的尺寸浪谴,則ppi等于

var 斜邊尺寸 = V(1920^2+1080^2) V代表開根號
var ppi = 斜邊尺寸/5.5
ppi = 401ppi

現(xiàn)在我們知道开睡,ppi越高,每英寸像素點越多苟耻,圖像越清晰篇恒;

和先前的知識點有什么關(guān)系?

畢竟這些參數(shù)是外國人先發(fā)明的凶杖,他們會優(yōu)先選擇自己熟悉的計量單位作為顯示設(shè)備的工廠標(biāo)準(zhǔn)參數(shù)胁艰,因此ppi就用作顯示設(shè)備的工業(yè)標(biāo)準(zhǔn);

告訴業(yè)界人士智蝠,ppi達(dá)到多少是高清屏腾么,此時對應(yīng)的dpr是多少,而不直接告訴你我現(xiàn)在的顯示設(shè)備dpr是多少

畢竟人們直接聽到像素分辨率會更加有反應(yīng)

下面是不同ppi對應(yīng)的dpi:

|ldpi|mdpi|hdpi|xhdpi
---|---|---|---|---
ppi|120|160|240|320
默認(rèn)縮放比|0.75|1.0|1.5|2.0

【注】Retina屏都是dpr>=2的高清屏

腎6Plus的dpr為3寻咒,是超高清屏哮翘;

到目前為止,我們了解到:
給你一個顯示設(shè)備毛秘,設(shè)備分辨率為19201080,尺寸為5.5英寸阻课,可以計算出其ppi = 401叫挟,根據(jù)ppi得知其dpr = 3,
由此可以該設(shè)備1px = (3^2)dp限煞,其虛擬像素為1920/3 = 660px抹恳,1080/3 = 360px,即虛擬分辨率為360
660署驻;
此時奋献,如果你在代碼設(shè)置元素的寬高為360*660到的話健霹,會發(fā)現(xiàn)它的實際尺寸就等于腎6Plus的屏幕尺寸;
【ppi】


viewport原理解析

一個很有意思的現(xiàn)象是瓶蚂,當(dāng)你把上面的代碼在chrome下使用設(shè)備模擬方式糖埋,模擬腎6Plus的時候,神奇的事情發(fā)生了窃这,該元素設(shè)置的寬高明明就是手機的寬高瞳别,按常理應(yīng)該占據(jù)整個屏幕,實際卻是:

究竟是怎么一回事杭攻?祟敛,如何解決這一問題呢?

好吧兆解,作為實用主義者的你們(不是我喲)馆铁,先講解決方案:

在meta標(biāo)簽有一個viewport的屬性,可以為這個屬性設(shè)置width锅睛;
腎6Plus默認(rèn)的width是980px埠巨,所以元素寬是360px,實際顯示的尺寸是360px*360/980=132.24px(不信可以自己測試一下喲)衣撬;

現(xiàn)在只要將viewport的width設(shè)置為360px乖订,那么元素就可以占滿全屏了;

現(xiàn)在就要引入另一個概念:viewport

viewport的原理在于:

  1. 先將頁面渲染在一個width為顯示設(shè)備默認(rèn)尺寸的viewport上具练,如腎6Plus為980px乍构;
  2. 然后將viewport等比例縮放至整個手機屏幕上;

例如上例中扛点,元素寬高為360*600px哥遮,先將元素渲染在寬度為980px的viewport上,然后等比例縮放在整個手機屏幕上陵究;

viewport就是連接手機屏幕和頁面的中間層

為什么要多此一舉呢眠饮?

想象一下,如果沒有中間層铜邮,直接將一個頁面寬度為980px的直接縮放至320px仪召,那么里面的DOM節(jié)點將會進行重繪,很有可能導(dǎo)致排版錯亂松蒜;
viewport的作用是將所有的DOM節(jié)點先繪在寬度為980px的viewport上扔茅,然后整個viewport統(tǒng)一縮放,這樣就能保證排版的正確性秸苗;

關(guān)于viewport召娜,涉及兩個概念:

  • layout viewport:布局viewport,可以理解為放置頁面的幕布
  • visual vewport:視窗viewport惊楼,可以理解為屏幕的視窗
    比如:
    腎6Plus的visual viewport的寬度為360px玖瘸,layout viewport為980px秸讹;
    360px是屏幕視窗的虛擬像素,980px是放置頁面的像素雅倒;

回顧一下璃诀,前面元素出現(xiàn)的縮放現(xiàn)象:

根據(jù)腎6Plus的物理分辨率1920*1080以及5.5英寸的屏幕,計算出ppi = 401-> dpr = 3 -> 虛擬分辨率為640*360px屯断;

畫一個寬度為360px的元素文虏,理應(yīng)充滿整個手機屏幕 ,但是由于viewport的作用 -> 360px的元素畫在980px的layout viewport上殖演,然后等比例縮放在360px的visual viewport上-> 最終你看到的就是氧秘,360px的元素?zé)o法填充整個屏幕;

先前的一個解決辦法是趴久,改變layout viewport丸相,即<meta name="viewport" content="width=360">,讓整個layout viewport就是360px彼棍,那么元素將填充整個屏幕灭忠;

以上都是世界觀,給人一些概念性的理解座硕,無法實操弛作,下面就是方法論

實際移動端開發(fā),我們只需關(guān)注layout viewport华匾,知道每個移動設(shè)備提供給我們多大尺寸的幕布映琳,但是移動設(shè)備型號那么多,不可能一個個手動設(shè)置width呀V├H鳌!

  • 動態(tài)設(shè)置layout viewport
<meta  name="viewport" content="width=device-width">

上面的設(shè)置表示讓layout viewport總是等于設(shè)備寬度旭旭,即visual viewport谎脯;

iPhone 6 Plus
Galaxy S5

【注】細(xì)心的童鞋可能會注意到,腎6Plus的虛擬分辨率為什么不是640*360px持寄,具體解答可以參考知乎問答

  • 獲取visual viewport和layout viewport的api
window.innerWidth:表示窗口的寬度(包含滾動條)源梭,即visual vewport的寬度
document.body.clientWidth:表示body元素的寬度(不包括border),即layout viewport的寬度
  • 移動端其他初始化設(shè)置
intial-scale:頁面首次顯示時稍味,可視區(qū)域的縮放級別咸产,取值1.0則頁面按實際尺寸顯示,無任何縮放仲闽;
no-scalable:是否允許縮放

一個完整的viewport屬性的設(shè)置為:

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

上述完整的意思是,layout viewport等于設(shè)備的寬度僵朗,首次顯示頁面時不進行縮放也不允許用戶縮放赖欣;

demo

小結(jié)
  • 一開始講px/dp/dpr/ppi的意義在于鋪墊背景知識
  • 理解上述知識后屑彻,給你一個移動設(shè)備的物理分辨率,如iPhone6 Plus19201080以及尺寸5.5inches顶吮,可以計算出其ppi為401->dpr = 3社牲,從而測算出手機的虛擬分辨率為640360px;
  • 原則上悴了,你開發(fā)一個640*360px的元素就可以填充整個手機屏幕搏恤,但是由于viewport機制作用,效果未達(dá)預(yù)期
  • 由此引出viewport概念湃交,viewport可以分為visual viewport(視窗尺寸)和layout viewport(放置頁面的“幕布“)熟空,iPhone6 Plus默認(rèn)值為980px;
  • 通過meta標(biāo)簽的viewport屬性搞莺,可以動態(tài)設(shè)置layout viewport息罗,實戰(zhàn)中只需要設(shè)置:
<meta  name="viewport" content="width=device-width,initial-scale=1,no-scalable=no">
```,那么你在開發(fā)中寫元素寬度為360px才沧,實際在手機就顯示為360px迈喉;
- 你還可以通過`window.innerWidth和document.body.clientWidth(前提是不設(shè)置body的寬度)`分別獲取visual viewport和layout viewport;

---

下次講解彈性布局和響應(yīng)式設(shè)計...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末温圆,一起剝皮案震驚了整個濱河市挨摸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岁歉,老刑警劉巖得运,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異刨裆,居然都是意外死亡澈圈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門帆啃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞬女,“玉大人,你說我怎么就攤上這事努潘》掏担” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵疯坤,是天一觀的道長报慕。 經(jīng)常有香客問我,道長压怠,這世上最難降的妖魔是什么眠冈? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上蜗顽,老公的妹妹穿的比我還像新娘布卡。我一直安慰自己,他們只是感情好雇盖,可當(dāng)我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布忿等。 她就那樣靜靜地躺著,像睡著了一般崔挖。 火紅的嫁衣襯著肌膚如雪贸街。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天狸相,我揣著相機與錄音薛匪,去河邊找鬼。 笑死卷哩,一個胖子當(dāng)著我的面吹牛蛋辈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播将谊,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼冷溶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尊浓?” 一聲冷哼從身側(cè)響起逞频,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎栋齿,沒想到半個月后苗胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦堵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年基协,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菇用。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡澜驮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惋鸥,到底是詐尸還是另有隱情杂穷,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布卦绣,位于F島的核電站耐量,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏滤港。R本人自食惡果不足惜廊蜒,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧劲藐,春花似錦八堡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缝龄。三九已至汰现,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叔壤,已是汗流浹背瞎饲。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留炼绘,地道東北人嗅战。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像俺亮,于是被迫代替她去往敵國和親驮捍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,877評論 2 345

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

  • 剛開始做移動端web開發(fā)的同學(xué)應(yīng)該都碰到過頁面適配問題脚曾,為什么我在開發(fā)手機上調(diào)試好的頁面在其他手機會有這樣或那樣的...
    留七七閱讀 19,299評論 5 80
  • 1.移動端迷之視口 為什么我稱他為“迷之視口”东且,因為其實我聽過很多人的分享,來講解移動端視口的問題本讥,但我好像都...
    buershero閱讀 1,208評論 0 2
  • 目錄 1珊泳、移動端開發(fā)的基本觀點2、像素基礎(chǔ)知識3拷沸、viewport原理解析4色查、彈性布局5、響應(yīng)式設(shè)計6撞芍、1rem的...
    周花花啊閱讀 1,539評論 0 6
  • 原文地址 在移動設(shè)備上進行網(wǎng)頁的重構(gòu)或開發(fā)秧了,首先得搞明白的就是移動設(shè)備上的viewport了,只有明白了viewp...
    matthewm閱讀 1,549評論 0 4
  • 今天是國際上的women's day——婦女節(jié)勤庐,一個值得紀(jì)念的重要日子示惊,但是不少女性刻意與這個節(jié)日劃清界線,稱之為...
    deadpoetry閱讀 328評論 0 0