viewport的理解和使用(面試必看)

查看github原文

viewport概念

移動(dòng)端瀏覽器通常都在一個(gè)比屏幕更寬的虛擬窗口中渲染頁(yè)面,這個(gè)虛擬窗口就是viewport,目的是正常展示沒有做移動(dòng)端適配的網(wǎng)頁(yè),可以讓他們完整的展現(xiàn)給用戶。我們有時(shí)用移動(dòng)設(shè)備訪問桌面版網(wǎng)頁(yè)就會(huì)看到一個(gè)橫向滾動(dòng)條,這里可顯示區(qū)域的寬度就是viewport的寬度。

css中的像素和設(shè)備像素的區(qū)別

在桌面網(wǎng)頁(yè)開發(fā)時(shí),css中的1px就是設(shè)備上的1px;然而css中的1px僅僅是一個(gè)抽象的值,不代表實(shí)際像素為多少;而在移動(dòng)設(shè)備中,不同設(shè)備的像素密度是不一樣的,css中的1px可能并不等于真實(shí)設(shè)備的一個(gè)像素值。用戶縮放也會(huì)改變css中的1px代表多少設(shè)備像素。這個(gè)比例就是devicePixelRatio

物理像素/獨(dú)立像素 = devicePixelRatio

我們可以在瀏覽器中進(jìn)行縮放,在控制臺(tái)中打印window.devicePixelRatio來查看devicePixelRatio的大小。其中的獨(dú)立像素可以理解為css中的px。

視口基礎(chǔ)

一個(gè)典型的針對(duì)移動(dòng)端優(yōu)化的站點(diǎn)包含類似下面的內(nèi)容:

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

以下為viewport的幾個(gè)屬性,這些屬性可以混合來使用,多個(gè)屬性同時(shí)使用要用逗號(hào)隔開。這里我們展開一個(gè)概念,叫做ideal viewport,指的是理想情況下的viewport,不需要用戶縮放和橫向滾動(dòng)條就能正常查看網(wǎng)頁(yè)的所有內(nèi)容,并且能夠看清所有文字,無論這個(gè)文字在css中定義為多小,顯示出來時(shí)可以看清的。

屬性 描述
width 控制視口的寬度,可以指定數(shù)字;或設(shè)置device-width來指定
height 控制視口的高度,這個(gè)屬性不太重要,很少使用
initial-scale 控制頁(yè)面最初加載時(shí)的在在idealviewport下縮放等級(jí),通常設(shè)為1,可以是小數(shù)
maximum-scale 允許用戶的最大縮放值,為一個(gè)數(shù)字,可以帶小數(shù)
minimum-scale 允許用戶的最小縮放值,為一個(gè)數(shù)字,可以帶小數(shù)
user-scalable 是否允許用戶進(jìn)行縮放,值為"no"或"yes", no 代表不允許,yes代表允許

viewport進(jìn)階

1.width和initial-scale

當(dāng)設(shè)置了widthinitial-scale時(shí),瀏覽器會(huì)自動(dòng)選擇數(shù)值最大的進(jìn)行適配。如設(shè)置:

<meta name="viewport" content="width=400, initial-scale=1">

瀏覽器會(huì)選擇數(shù)值大的進(jìn)行適配,如果當(dāng)前窗口ideal viewport寬度為300,initial-scale值為1,取得是width為400的值;如果當(dāng)前窗口的ideal viewport為480,則取480。

事實(shí)上,width=device-widthinitial-scale=1都代表應(yīng)用ideal viewport,但在ipad、iphone等移動(dòng)設(shè)備和IE上,橫豎屏不分,默認(rèn)都取豎屏的寬度,兼容性最好的寫法就是

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

2.動(dòng)態(tài)改變屬性

a. document.write()

document.write('<meta name="viewport" content="width=device-width,initial-scale=1">')

b.setAttribute

var mvp = document.getElementById('testViewport');
mvp.setAttribute('content','width=480');

參考資料

  1. MDN -- 在移動(dòng)瀏覽器中使用viewport元標(biāo)簽控制布局
  2. 移動(dòng)前端開發(fā)之viewport的深入理解
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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