淺談移動端中的視口(viewport)

視口

  • PC端:視口指瀏覽器可視化區(qū)域,寬度和瀏覽器窗口的寬度一致。在 CSS 標(biāo)準(zhǔn)文檔中,視口也被稱為初始包含塊,它是所有 CSS 百分比寬度推算的根源,給 CSS 布局限制了一個最大寬度。

  • 移動端:涉及三個視口,布局視口(layout viewport)、視覺視口(visual viewport)和理想視口(ideal viewport)。

布局視口layout viewport

小屏幕的移動端設(shè)備,主要是手機和部分平板(屏幕特別巨大的除外= = ),如果讓視口的寬度和瀏覽器寬度 保持一致的話,會導(dǎo)致一個結(jié)果——-頁面很丑。

手機,平板,瀏覽器的寬度一般在240-640像素之間,而大…大多數(shù)給pc設(shè)計的寬度至少為800,一般是960,或者1080。因此,如果用手機去看剛才的那個頁面,寬度20%的aside將會非常窄。

一個為桌面設(shè)計的網(wǎng)站 在780~ 1260px 的視口中應(yīng)該會顯示的很好,20% 寬度的元素也會大致像設(shè)計師希望的那樣。

但是,如果移動端瀏覽器遇到了沒有為移動端做優(yōu)化的網(wǎng)站,它會盡可能的縮小網(wǎng)站讓用戶看到網(wǎng)站的全貌。所以就顯得很擠,字體很小,閱讀性很差。這樣用戶就只有通過放大,去看想看的信息。

所以呢,手機廠商為了解決這個問題,設(shè)置了一個layout viewport。這是一個虛擬的窗口,其大小比手機屏幕大,加載網(wǎng)頁時,直接把HTML渲染在這個虛擬的窗口中,這樣就不會樣式錯亂了。在查看的時候,畢竟手機的visual viewport小啊,那就只能通過滾動條來看了。

做個比喻,layout viewport就是一張大白紙,HTML的內(nèi)容就寫在這個大白紙上,visual viewport就是一個放大鏡,上下左右移動,可以顯示其中的一部分。

layout viewport的大小獲?。?/p>

document.documentElement.clientWidth
document.document.clientHeight

視覺視口visual viewport

視覺視口是用戶當(dāng)前看到的區(qū)域,用戶可以通過縮放操作視覺視口,同時不會影響布局視口。

用來顯示網(wǎng)頁內(nèi)容的區(qū)域,可以通過下面的js命令獲?。?/p>

window.innerWidth
window.innerHeight

前端里面能獲取到的像素基本上都是CSS像素,所以這個的單位也是CSS像素。對于iPhone X,瀏覽器全屏狀態(tài)下,其window.innerWidth的值為375。

screen.widthscreen.height,主要是用來獲取整個屏幕的大小的,而window.innerWidthwindow.innerHeight只是獲取瀏覽器可用顯示區(qū)域的大小,也就是瀏覽器中間負責(zé)顯示的部分。當(dāng)瀏覽器全屏?xí)r,要去掉狀態(tài)欄、標(biāo)簽欄、任務(wù)欄等區(qū)域,當(dāng)瀏覽器非全屏?xí)r,其值更小。由于在移動端,瀏覽器一般都是全屏的,所以大多數(shù)情況下screen.widthwindow.innerWidth的值相等,也有的博客中說用screen.widthscreen.height來獲取visual viewport的大小,就是這個原因。

visual viewport是我們可以直觀看到的,不嚴謹?shù)恼f,就是差不多等于手機屏幕的大小,偏向于一個物理概念。

理想視口ideal viewport

Layout viewport是為了能將電腦上的網(wǎng)頁正確的顯示到手機上。當(dāng)瀏覽器拿到一個網(wǎng)頁時,首先會渲染到這個layout viewport里面。

可是現(xiàn)在有很多網(wǎng)頁會針對手機做專門的設(shè)計,比如現(xiàn)在的一些H5活動頁,設(shè)計的尺寸就是在手機上看的。此時如果還是把網(wǎng)頁渲染到這個大的layout viewport上,實在是有點不合適了。

所以,還應(yīng)該有個ideal viewport,這個ideal viewport應(yīng)該與手機屏幕大小的相同,確切來說,等于visual viewport的大小。把頁面渲染到這個ideal viewport里面,就能在visual viewport中完美顯示。

用下面的方法可以使布局視口與理想視口的寬度一致:

//理想視口=布局視口=邏輯像素值
<meta name="viewport" content="width=device-width">

實際上,這就是響應(yīng)式布局的基礎(chǔ)。

視口的設(shè)置

我們可以使用視口元標(biāo)簽(viewport meta 標(biāo)簽)來進行布局視口的設(shè)置。

<meta name="viewport"
    content="width=device-width,initial-scale=1.0,maximum-scale=1">
屬性名 取值 描述
width device-width或正整數(shù) 定義視口的寬度,單位為像素,一般為device-width:表示寬度為設(shè)備屏幕的寬度
height device-width或正整數(shù) 定義視口的高度,單位為像素,一般不用寫
initial-scale [0.0-10.0] 定義初始縮放值,一般設(shè)置為1.0
minimum-scale [0.0-10.0] 定義縮小最小比例,它必須小于或等于maximum-scale設(shè)置
maximum-scale [0.0-10.0] 定義放大最大比例,它必須大于或等于minimum-scale設(shè)置
user-scalable yes / no 定義是否允許用戶手動縮放頁面,默認值 yes

有幾點值得注意:

  • viewport 標(biāo)簽只對移動端瀏覽器有效,對 PC 端瀏覽器是無效的
  • 當(dāng)縮放比例為 100% 時,邏輯像素 = CSS 像素寬度 = 理想視口的寬度 = 布局視口的寬度
  • 單獨設(shè)置 initial-scale 或 width 都會有兼容性問題,所以設(shè)置布局視口為理想視口的最佳方法是同時設(shè)置這兩個屬性
  • 即使設(shè)置了 user-scalable = no,在 Android Chrome 瀏覽器中也可以強制啟用手動縮放

小結(jié)

layout viewport和ideal viewport都是用來渲染頁面,layout viewport較大,用來渲染電腦上的頁面,ideal viewport較小,用來渲染專門針對手機設(shè)計的頁面;而visual viewport是用來查看layout viewport和ideal viewport的,是用來查看渲染的結(jié)果的。visual viewport是很具體的,而layout viewport和ideal viewport是比較抽象的。某種程度來說,layout viewport和ideal viewport可以理解成是兩種尺寸,承載頁面渲染的盒子,可以設(shè)置成layout viewport的尺寸,也可以設(shè)置成ideal viewport的尺寸,而且在默認情況下是layout viewport的尺寸。如果我們設(shè)置HTML中body為width:100%,那么這個body的實際寬度,將由這個盒子的寬度決定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容