什么是Viewport
手機瀏覽器是把頁面放在一個虛擬的“窗口”(viewport)中,通常這個虛擬的“窗口”(viewport)比屏幕寬,這樣就不用把每個網頁擠到很小的窗口中(這樣會破壞沒有針對手機瀏覽器優化的網頁的布局),用戶可以通過平移和縮放來看網頁的不同部分。移動版的 Safari 瀏覽器最新引進了 viewport 這個 meta tag,讓網頁開發者來控制 viewport 的大小和縮放,其他手機瀏覽器也基本支持。
Viewport 基礎
一個常用的針對移動網頁優化過的頁面的 viewport meta 標簽大致如下:
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
width:控制 viewport 的大小,可以指定的一個值,如果 600,或者特殊的值,如 device-width 為設備的寬度(單位為縮放為 100% 時的 CSS 的像素)。
height:和 width 相對應,指定高度。
initial-scale:初始縮放比例,也即是當頁面第一次 load 的時候縮放比例。
maximum-scale:允許用戶縮放到的最大比例。
minimum-scale:允許用戶縮放到的最小比例。
user-scalable:用戶是否可以手動縮放
關於viewport的一些問題
viewport並非只是ios上的獨有屬性,在android、winphone上同樣也有viewport。它們要解決的問題是相同的,即無視設備的真實分辨率,直接通過dpi,在物理尺寸和瀏覽器之間重設分辨率,這個分辨率和設備的分辨率無關。比如,你拿個3.5寸-320 * 480的iphone3 gs、3.5寸-640 * 960的iphone4或者9.7寸-1024*768的ipad2,雖然設備的分辨率不同,物理尺寸也不同,但你可以通過設置viewport讓它們在瀏覽器里有相同的分辨率。
比如說,你的網站是800px寬,你可以通過設置viewport的width=800,來讓你的網站在這三個不同的設備上都剛好滿屏顯示你的網站。
以上的知識,相信每個對viewport稍有了解的同學應該都已經了解了。這不是我今天想說的重點。我想說明的是viewport在ios和android上的一些差異表現。
網上一搜關於viewport的知識,基本上全都是如下信息:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
這段代碼的意思是,讓viewport的寬度等於物理設備上的真實分辨率,不允許用戶縮放。主流的web app都是這么設置的,它的作用其實是故意舍棄viewport,不縮放頁面,這樣dpi肯定和設備上的真實分辨率是一樣的,不做任何縮放,網頁會因此顯得更高細膩。玩ps的同學應該都知道,當你將一張1000 * 1000的圖片直接縮放至500 * 500分變成什么樣,對吧?圖片的失真一定逃不掉。
注:在iphone和ipad上,無論你給viewport設的寬的是多少,如果沒有指定默認的縮放值,則iphone和ipad會自動計算這個縮放值,以達到當前頁面不會出現橫向滾動條(或者說viewport的寬度就是屏幕的寬度)的目的。
但我要做的一個應用卻恰恰相反,需要利用viewport,利用縮放。不論真實分辨率是多少,無論物理尺寸是多少,我都希望在瀏覽器里,能有統一的分辨率,同時也不允許用戶縮放。我用來測試的設備有:iphone4、ipad2、htc的g11、不知道什么廠商的aquos phone(android系統)、華碩的android pad、dell的winphone然后我一路遇到了如下問題:
1)如果不顯示地設置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下卻不會再縮放了,瀏覽器分辨率和真實設置分辨率一致。
2)對於ios設備,設置width可以生效,但對於android,設置width並不會生效。ios設備,縮放的比率即dpi是通過你設置的width和設置真實分辨率自動計算的,而android下你設置width無效,你能設置的是一個特殊的字段target-densitydpi,也就是說,有三個變量:瀏覽器width、設備真實width、dpi。 我們簡單地用個公式來表達它們之間的關系吧(並非真實關系,簡單說明用) 設備真實width * dpi = 瀏覽器width,這里的三個變量,設備真實width是個我們不能操作的已知值,另外兩個變量我們可以設置一個來影響另一個,在ios中,我們能改的是瀏覽器width,dpi自動生成,而在android中,我們能改的是dpi,瀏覽器width自動生成。對於android,無論我們如何設置width,也不會對瀏覽器width產生影響。
target-densitydpi :target-densitydpi 這個私有屬性,它表示目標設備的密度等級,作用是決定css中的1px代表多少物理像素。
target-densitydpi的值可以為一個數值或 high-dpi 、 medium-dpi、 low-dpi、 device-dpi 這幾個字符串中的一個.
特別說明的是,當 target-densitydpi=device-dpi 時, css中的1px會等於物理像素中的1px。
因為這個屬性只有安卓支持,並且安卓已經決定要廢棄target-densitydpi 這個屬性了,所以這個屬性我們要避免進行使用 。
更詳細了解跟參考地址:http://www.cnblogs.com/2050/p/3877280.html