【轉】關於 mate viewport屬性的具體說明!

什麼是Viewport

手機瀏覽器是把頁面放在一個虛擬的「窗口」(viewport)中,一般這個虛擬的「窗口」(viewport)比屏幕寬,這樣就不用把每一個網頁擠到很小的窗口中(這樣會破壞沒有針對手機瀏覽器優化的網頁的佈局),用戶能夠經過平移和縮放來看網頁的不一樣部分。移動版的 Safari 瀏覽器最新引進了 viewport 這個 meta tag,讓網頁開發者來控制 viewport 的大小和縮放,其餘手機瀏覽器也基本支持。html

 

Viewport 基礎

一個經常使用的針對移動網頁優化過的頁面的 viewport meta 標籤大體以下:android

<meta name=」viewport」 content=」width=device-width, initial-scale=1, maximum-scale=1″>ios

width:控制 viewport 的大小,能夠指定的一個值,若是 600,或者特殊的值,如 device-width 爲設備的寬度(單位爲縮放爲 100% 時的 CSS 的像素)。
height:和 width 相對應,指定高度。
initial-scale:初始縮放比例,也便是當頁面第一次 load 的時候縮放比例。
maximum-scale:容許用戶縮放到的最大比例。
minimum-scale:容許用戶縮放到的最小比例。
user-scalable:用戶是否能夠手動縮放web

 

關於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上的一些差別表現。app

 

網上一搜關於viewport的知識,基本上全都是以下信息:iphone

<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分變成什麼樣,對吧?圖片的失真必定逃不掉。測試

 

但我要作的一個應用卻偏偏相反,須要利用viewport,利用縮放。不論真實分辨率是多少,不管物理尺寸是多少,我都但願在瀏覽器裏,能有統一的分辨率,同時也不容許用戶縮放。我用來測試的設備有:iphone四、ipad二、htc的g十一、不知道什麼廠商的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,關於target-densitydpi能夠參考一下這篇文章:http://hi.baidu.com/j_fo/blog/item/748361279ebccd18908f9d7d.html。也就是說,有三個變量:瀏覽器width、設備真實width、dpi。 咱們簡單地用個公式來表達它們之間的關係吧(並不是真實關係,簡單說明用) 設備真實width * dpi = 瀏覽器width,這裏的三個變量,設備真實width是個咱們不能操做的已知值,另外兩個變量咱們能夠設置一個來影響另外一個,在ios中,咱們能改的是瀏覽器width,dpi自動生成,而在android中,咱們能改的是dpi,瀏覽器width自動生成。對於android,不管咱們如何設置width,也不會對瀏覽器width產生影響。

 

ps:這裏我另外再說一個奇怪的問題:在htc的g11裏(htc的手機我只有這一個,別的沒有測),若是設置了dpi而不顯示地設置width,則user-scalable=no不生效,便是說:<meta name="viewport" content="target-densitydpi=300,user-scalable=no" />,沒法阻止用戶縮放屏幕。咱們須要顯示地設置一下width值,僅管這個值對android下的瀏覽器分辨屏並不產生任何影響(對ios仍是會產生影響的),咱們仍然要設置它,並且這個值必定要大於320,若是小於等於320,也沒法使user-scalable=no生效。這個問題只在htc的g11手機上出現,在aquos phone沒有這個問題。兼容android真是件頭痛的事 @_@,將來還不知道有多少坑呢。而在winphone上,結果就更奇怪了:我給viewport的width設一個大於480的值,user-scalable=no就失效了,而設一個小於480的值,user-scalable=no能生效。但不管我給viewport的width設多少值,對winphone真正顯示的width卻並不產生我預期的影響,經過target-densitydpi也沒有影響。設置width,若是小於480的話,屏幕會縮放,但縮小的比例卻和我預期徹底不同,我不知道它是按照什麼規律縮放的。不知道這是winphone的問題,仍是dell實現的問題。

 

3)這一條和上一條應該是直接相關的:ios設備在橫豎屏時,會自動調整dpi,不管橫屏仍是豎屏,都能保證瀏覽器width等於viewport中設置的值,因此橫豎屏的時候,頁面裏顯示的內容的大小是會自動縮放產生變化的。而android手機在橫豎屏的時候,不會改變dpi,在橫豎屏的時候,網頁不會產生縮放。也正所以,ios能夠保證橫豎屏頁面都不會產生滾動條,滿屏顯示,而android卻沒法保證這一點,橫着滿屏則豎着沒法滿屏,反之亦然。

 

4)對於ios設備,若是width顯示定義了,而頁面最寬的位置超過width的話,width無效,仍按最寬的寬度來顯示(不會有滾動條)。但此時會出現一個很奇怪的問題,當你將手機橫豎屏切換幾回以後,會發現你的頁面自動放大了,出現了滾動條,但其實放大後的寬度其實和你設的width也並無關係。爲了防止這種狀況出現,你須要將width的寬度設置得比頁面最寬的地方更大,或者相同。

相關文章
相關標籤/搜索