第一期《meta viewport原理》

什麼是Viewport

手機瀏覽器是把頁面放在一個虛擬的“窗口”(viewport)中,

通常這個虛擬的“窗口”(viewport)比屏幕寬,

這樣就不用把每個網頁擠到很小的窗口中(這樣會破壞沒有針對手機瀏覽器優化的網頁的佈局),

用戶可以通過平移和縮放來看網頁的不同部分。

移動版的 Safari 瀏覽器最新引進了 viewport 這個 meta tag,讓網頁開發者來控制 viewport 的大小和縮放,其他手機瀏覽器也基本支持。

例子

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />

content內容

字段名稱 類型 描述
width number | device-width 控制 viewport 的寬度
height number | device-width 控制 viewport 的寬度
initial-scale device-width 初始縮放比例,也即是當頁面第一次 load 的時候縮放比例
maximum-scale number 允許用戶縮放到的最大比例
minimum-scale number 允許用戶縮放到的最小比例
user-scalable yes | no 用戶是否可以手動縮放

提示

如果不顯示地設置viewport,那麼width的默認爲980。

如果頁面的所有元素寬度都小於980,此時width爲980,如果頁面最寬的位置超過980,

那麼width等於最大寬度。總之,默認能將整個頁面從左到右顯示出來。

如果設置了viewport,比如,只單純地設置了user-scalable=no,

例如<meta name="viewport" content="user-scalable=no" />

那麼ios下width還是按980顯示(即默認就會通過dpi縮放),

但android和winphone下卻不會再縮放了,瀏覽器分辨率和真實設置分辨率一致。

三種viewport

(1)layout viewport

如果把移動設備上瀏覽器的可視區域設爲viewport的話,

某些網站會因爲viewport太窄而顯示錯亂,

所以這些瀏覽器就默認會把viewport設爲一個較寬的值,比如980px,

使得即使是那些爲PC瀏覽器設計的網站也能在移動設備瀏覽器上正常顯示。

這個瀏覽器默認的viewport叫做 layout viewport。

layout viewport的寬度可以通過 document.documentElement.clientWidth來獲取。

(2)visual viewport

layout viewport的寬度是大於瀏覽器可視區域的寬度的,

所以還需要一個viewport來代表瀏覽器可視區域的大小,

這個viewport叫做 visual viewport。

visual viewport的寬度可以通過 document.documentElement.innerWidth來獲取。

(3)ideal viewport

ideal viewport是一個能完美適配移動設備的viewport。

首先,不需要縮放和橫向滾動條就能正常查看網站的所有內容;

其次,顯示的文字、圖片大小合適,

如14px的文字不會因爲在一個高密度像素的屏幕裏顯示得太小而無法看清,

無論是在何種密度屏幕,何種分辨率下,顯示出來的大小都差不多。

這個viewport叫做 ideal viewport。

ideal viewport並沒有一個固定的尺寸,不同的設備有不同的ideal viewport

例如,所有的iphone的ideal viewport寬度都是320px,無論它的屏幕寬度是320還是640。

ideal viewport 的意義在於,無論在何種分辨率的屏幕下,針對ideal viewport 而設計的網站,

不需要縮放和橫向滾動條都可以完美地呈現給用戶。

css中的1px並不等於設備的1px

在css中我們一般使用px作爲單位,在桌面瀏覽器中css的1個像素往往都是對應着電腦屏幕的1個物理像素,

這可能會造成我們的一個錯覺,那就是css中的像素就是設備的物理像素。

但實際情況卻並非如此,css中的像素只是一個抽象的單位,

在不同的設備或不同的環境中,css中的1px所代表的設備物理像素是不同的。

在爲桌面瀏覽器設計的網頁中,我們無需對這個津津計較,但在移動設備上,必須弄明白這點。

在早先的移動設備中,屏幕像素密度都比較低,如iphone3,它的分辨率爲320x480,在iphone3上,

一個css像素確實是等於一個屏幕物理像素的。

後來隨着技術的發展,移動設備的屏幕像素密度越來越高,

從iphone4開始,蘋果公司便推出了所謂的Retina屏,分辨率提高了一倍,變成640x960,

但屏幕尺寸卻沒變化,這就意味着同樣大小的屏幕上,像素卻多了一倍,

這時,一個css像素是等於兩個物理像素的。其他品牌的移動設備也是這個道理。

例如安卓設備根據屏幕像素密度可分爲ldpi、mdpi、hdpi、xhdpi等不同的等級,

分辨率也是五花八門,安卓設備上的一個css像素相當於多少個屏幕物理像素,

也因設備的不同而不同,沒有一個定論。

還有一個因素也會引起css中px的變化,那就是用戶縮放。

例如,當用戶把頁面放大一倍,那麼css中1px所代表的物理像素也會增加一倍;

反之把頁面縮小一倍,css中1px所代表的物理像素也會減少一倍。

關於這點,在文章後面的部分還會講到。

在移動端瀏覽器中以及某些桌面瀏覽器中,window對象有一個devicePixelRatio屬性,

它的官方的定義爲:設備物理像素和設備獨立像素的比例,

也就是 devicePixelRatio = 物理像素 / 獨立像素。

css中的px就可以看做是設備的獨立像素,所以通過devicePixelRatio,

我們可以知道該設備上一個css像素代表多少個物理像素。例如,在Retina屏的iphone上,

devicePixelRatio的值爲2,也就是說1個css像素相當於2個物理像素。

但是要注意的是,devicePixelRatio在不同的瀏覽器中還存在些許的兼容性問題,

所以我們現在還並不能完全信賴這個東西,

具體的情況可以看下這篇文章

參考資料:

  1. 淺談meta viewport設置移動端自適應

  2. viewport 詳解


微信訂閱號(前端趣聞,歡迎關注)

二維碼

討論地址github討論地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章