日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

深入理解viewport

發(fā)布時(shí)間:2024/8/26 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解viewport 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這篇文章我已寫成pdf,建議直接下載瀏覽。

鏈接:https://pan.baidu.com/s/1c4cwd7E 密碼:jty1

《對(duì)viewport標(biāo)簽的理解》

——版權(quán)所有 @RYZZ

https://www.cnblogs.com/ryzz/

如轉(zhuǎn)載或引用請(qǐng)加上該鏈接!

前言:(必讀)

前端的小朋友們多多少少接觸過這個(gè)標(biāo)簽,網(wǎng)上有很多關(guān)于這個(gè)標(biāo)簽的解釋,但是無疑千篇一律,你不禁都會(huì)懷疑他們是不是相互抄襲的。

這篇文章是我自己對(duì)這個(gè)標(biāo)簽以及瀏覽器對(duì)網(wǎng)頁渲染機(jī)制的一個(gè)理解(可能有誤,但至少根據(jù)這樣的理解能夠說通該標(biāo)簽各種情況的原因)。

推薦使用Chrome開發(fā)者工具的移動(dòng)端模擬器來測(cè)試該標(biāo)簽,這樣編輯預(yù)覽都很方便,當(dāng)然我這篇文章的測(cè)試都是經(jīng)過安卓(華為P10)和iOS(iPhone7)測(cè)試過的。

文章提出了一些自定義概念(雙下劃線表示),如果在學(xué)習(xí)中自己總結(jié)某個(gè)概念有助于你學(xué)習(xí),是很好的習(xí)慣。

如果你對(duì)這篇文章有錯(cuò)誤之處,懇請(qǐng)指正,但不要帶上臟話,謝謝。

?

目錄:

?

一、標(biāo)簽用法及其屬性 P2 )

二、幾個(gè)專業(yè)術(shù)語 ( P3 )

三、PC上vp機(jī)制和網(wǎng)頁渲染原理 ( P4 )

四、移動(dòng)端上vp機(jī)制和網(wǎng)頁渲染原理 ( P6 )

?

?

標(biāo)簽一般用法:(不需要過多參數(shù),我覺得用戶還是需要自己的操作空間,當(dāng)然如果你是想用HTML5開發(fā)混合應(yīng)用,建議加上最大、小縮放和禁止用戶縮放)

<meta name=”viewport”?content=”width=device-width”>

屬性:(屬性各自作用不說了,百度一堆)

width:a value(px) | device-width

initial-scale 范圍是(0.0, 10.0]

minimum-scale 同上

maximum-scale 同上

user-scalable “yes”?| “no”

?

來認(rèn)識(shí)幾個(gè)與屏幕(包括手機(jī)屏幕,電腦屏幕,平板屏幕等等)有關(guān)的術(shù)語:

(1)?尺寸(單位:inch,即英寸):就是我們俗話說的你的手機(jī)是幾寸的,它的大小是你手機(jī)對(duì)角線的長(zhǎng)度。

(2)?分辨率(單位:px,即像素):指你手機(jī)的寬 ×?高,比如iPhone7的分辨率就是750 ×?1334px

(3)?像素密度(單位:dpi(dot per inch)或ppi(pixel per inch),安卓習(xí)慣用前者而蘋果習(xí)慣用后者):對(duì)角線的像素個(gè)數(shù)除以對(duì)角線長(zhǎng),比如iPhone7的ppi = √(7502+13342) / 4.7 ≈327

(4)?設(shè)備像素(單位:px):指的是組成屏幕的最小的單位,比如iPhone7水平就有750個(gè)設(shè)備像素,有時(shí)也稱為像素點(diǎn)或點(diǎn)。

(5)?設(shè)備獨(dú)立像素(單位:dp):簡(jiǎn)稱dipdevice independence pixel),是一種虛擬像素,CSS中的px單位就是一種設(shè)備獨(dú)立像素,它能保證使用同一種設(shè)備獨(dú)立像素單位的相同值在不同設(shè)備上顯示的大小差不多。(如果我沒講清楚的話,這個(gè)你可以百度了解一下)

(6)?設(shè)備像素比(無單位,是個(gè)比值):簡(jiǎn)稱dprdevice pixel ratio),指該設(shè)備上一個(gè)設(shè)備獨(dú)立像素等于多少設(shè)備像素,比如CSSiPhone7中,1px(這個(gè)px是設(shè)備獨(dú)立像素的一種單位) = ?2px(這個(gè)px是設(shè)備像素,就是iPhone7上的像素點(diǎn))。使用window.devicePixelRatio屬性來獲取CSS的一個(gè)px(設(shè)備獨(dú)立像素)在該設(shè)備上等于多少個(gè)px(設(shè)備像素),即設(shè)備像素比。

(7)?viewport:簡(jiǎn)稱vp,我們不做中文翻譯,下面用圖片來說明。(因?yàn)槲矣X得做了翻譯反而會(huì)依據(jù)表面意思被誤導(dǎo),如果你有強(qiáng)迫癥,我建議你翻譯成“網(wǎng)頁渲染圖層”)

?

?

我們現(xiàn)在來了解一下PC上瀏覽器渲染網(wǎng)頁的原理,這會(huì)有助于我們了解什么是vp以及移動(dòng)端的布局原理。

看下圖:(畫的有點(diǎn)抽象,盡量去理解)

?

圖中有個(gè)瀏覽器(有URL地址欄和三個(gè)黑色橢圓的那個(gè)大矩形就是),瀏覽器中淡藍(lán)色部分就是我們?yōu)g覽器顯示網(wǎng)頁的那個(gè)窗口(即window,html和window是重合的,但是body有8px的margin),而淡綠色的就是vp。這幅圖顯示的是網(wǎng)頁過寬時(shí)候,我們拖動(dòng)水平滾動(dòng)條的滑塊看頁面時(shí)候的情況(淡藍(lán)色底下有個(gè)黑色的實(shí)心矩形,就是滑塊)。

?

如果你對(duì)window, html, body之間的默認(rèn)布局不了解的話,建議先看下下圖:

說明了:html(黑色線框)默認(rèn)和window是重合的(去掉邊框的話),body其實(shí)可以看做一個(gè)div元素,那么body也應(yīng)該是獨(dú)占一行(塊級(jí)元素的霸氣所在),所以紅色線框的body也是獨(dú)占一行的(注意body自帶margin:8px,所以它與html有邊距),然后再是綠色線框的div,同樣獨(dú)占一行。

?

?

對(duì)vp在PC瀏覽器上工作原理的歸納:

PC上,vp默認(rèn)和window(即瀏覽器窗口,它等價(jià)瀏覽器可顯示網(wǎng)頁的區(qū)域”以及“瀏覽器可見區(qū)域”,這四個(gè)名詞都是同個(gè)概念!)重合,也就是說vp的默認(rèn)寬高就是window的寬高。

再來說個(gè)概念,網(wǎng)頁內(nèi)容最小寬:網(wǎng)頁能夠正常呈現(xiàn)的最小寬度

<style>

div{float:left}

.a{width:220px;height:100px;background:yellow}

.b{width:10%;height:100px;background:red}

</style>

<body>

<div class=”a”></div><div class=”b”</div>

</body>

如果瀏覽器窗口最大寬度為1000px(當(dāng)前瀏覽器窗口的寬度,可以通過window.innerWidth獲得),那么這個(gè)網(wǎng)頁的最小寬就是220px + 1000px * 0.1 = 320px。

?

如果一個(gè)網(wǎng)頁內(nèi)容最小寬等于或小于body的width時(shí),我們稱這種布局為合理布局如果body里面的元素最小寬之和不超過body,那么我們看網(wǎng)頁就不需要水平移動(dòng)了,直接從上往下瀏覽即可,瀏覽就很輕松很人性化,所以稱之為合理布局),否則如果超過body的width(這時(shí)稱為異常布局),這時(shí)vp的寬會(huì)被迫放大,直到剛好包裹住網(wǎng)頁的內(nèi)容的最小寬,然后再放入瀏覽器的window中,所以就會(huì)在底部出現(xiàn)水平滾動(dòng)條。上面說了如果網(wǎng)頁內(nèi)容最小寬大于body時(shí)會(huì)有水平滾動(dòng)條,那么如果網(wǎng)頁內(nèi)容的高(一般來說網(wǎng)頁元素的高不會(huì)設(shè)置百分比)大于vp的高(vp的高默認(rèn)就是當(dāng)前window的高,前面說過),那么就會(huì)出現(xiàn)垂直滾動(dòng)條。(body的高是不會(huì)像寬一樣被撐破的)

也就是說,網(wǎng)頁都是渲染到vp上去的,然后把vp放到瀏覽器窗口中給用戶顯示。

?

?

最后我們來說移動(dòng)端的瀏覽器網(wǎng)頁渲染原理:(以iPhone7為例)

在不加viewport標(biāo)簽時(shí),此時(shí)iPhone7的vp寬默認(rèn)980px,高默認(rèn)1744px。(這個(gè)vp的寬比高就是iPhone7手機(jī)的分辨率寬比高值,都約等于0.56,有木有發(fā)現(xiàn)。但這點(diǎn)要和PC端的vp區(qū)別開,PC端的vp的高寬不受比例約束!)這時(shí),會(huì)和PC端一樣,在這個(gè)980px寬的vp的body(手機(jī)上body還是有8px的外邊距)中加入網(wǎng)頁內(nèi)容,并且一般不超過body(即合理布局),網(wǎng)頁在vp中渲染好之后,縮小這個(gè)vp使得vp的高和手機(jī)瀏覽器可見區(qū)域高一樣時(shí)為止,所以你一般點(diǎn)開沒有做移動(dòng)端優(yōu)化的網(wǎng)站都是一個(gè)被縮小過的網(wǎng)頁。但是,如果這個(gè)網(wǎng)頁是個(gè)異常布局呢?即網(wǎng)頁內(nèi)容最小寬超過了body,那么這個(gè)vp會(huì)被迫放大(沒錯(cuò)和PC端一樣)到剛好包裹住網(wǎng)頁內(nèi)容最小寬,這時(shí)vp就大于980px了,那么手機(jī)瀏覽器該如何縮放呢?還是一樣,異常布局只是影響了vp的寬,沒有影響vp的高,所以還是縮小到vp的高和手機(jī)瀏覽器窗口(這里用了窗口,即window,它也等價(jià)于瀏覽器可見區(qū)域,不要搞混了,同個(gè)東西,上面說過)的高一樣為止了,這意味著這時(shí)手機(jī)瀏覽器底部會(huì)有一個(gè)水平滾動(dòng)條,就是用來滑動(dòng)來看超出的那些部分(即異常布局的超過body的部分)。

很抽象?看下圖:

?

矩形A表示手機(jī)瀏覽器窗口,iPhone7的是375px

矩形B表示iPhone7的默認(rèn)vp

矩形C表示一個(gè)異常布局網(wǎng)頁,它的最小寬大于vp的寬,所以默認(rèn)的vp寬會(huì)被放大至剛好包裹住網(wǎng)頁的最小寬(紅色箭頭所示),但是vp的高不會(huì)被相應(yīng)放大(就變成了紅色線框的矩形大小)。這時(shí),異常布局的網(wǎng)頁在vp渲染好了,然后要放入窗口里了,它會(huì)被縮小,直到vp的高和窗口的高一樣,這樣就會(huì)出現(xiàn)一個(gè)問題,異常布局的網(wǎng)頁超出body(即超出默認(rèn)vp寬)的內(nèi)容會(huì)顯示在窗口外,所以瀏覽器地不會(huì)出現(xiàn)一個(gè)滾動(dòng)條,來看這異常的部分。

?

嘮嘮叨叨那么多,那么加上viewport標(biāo)簽?zāi)?#xff1f;這還簡(jiǎn)單了?

如果設(shè)置為width=device-width,意味著把默認(rèn)vp按比例變成窗口寬的大小。(注意,vp的寬高都是被約束的,縮放寬時(shí)高也會(huì)被縮放,縮放高時(shí)寬也會(huì)被縮放,但是上面講到的在異常布局中除外)這時(shí),vp將與窗口重合。那么,如果是個(gè)合理布局的網(wǎng)頁,那么顯示出來的就是一個(gè)很標(biāo)準(zhǔn)的移動(dòng)優(yōu)化的網(wǎng)頁,反之,如果是個(gè)異常布局,那么vp是不會(huì)再縮小的,因?yàn)関p的高已經(jīng)和窗口高一樣了,但是vp的寬卻要包裹住異常布局的網(wǎng)頁的最小寬,所以vp的寬會(huì)大于device-width指定的值(在iPhone7上為375px),所以會(huì)加上水平滾動(dòng)條。同樣,這個(gè)異常布局的網(wǎng)頁的vp的寬高的縮放就不會(huì)被比例約束,因?yàn)樗膶捠潜黄瓤s放的。

如果設(shè)置的width大于device-width,比如設(shè)置個(gè)500px,那么vp的寬就是500px,高等比例放大為585 * (500/375) = 780px。(585px是width=375px時(shí)的vp高)這時(shí)的網(wǎng)頁渲染原理不就和不加viewport一樣嘛?合理布局就縮小vp使得vp高等于窗口高;異常布局會(huì)增大vp的寬,但是vp的高不會(huì)等比例增大(因?yàn)関p的寬是被迫增大的),然后在縮小vp使得vp高等于窗口高,并且出現(xiàn)水平滾動(dòng)條。

如果設(shè)置的width小于device-width,比如設(shè)個(gè)200px,那么vp寬高就是200px ×?(200 / 375 * 585)px,然后再是看是否是合理布局,是的話等比例放大使得vp高等于窗口高,不是的話,就增加vp的寬,然后再等比例放大使得vp高等于窗口高,同樣地,會(huì)出現(xiàn)水平滾動(dòng)條。

?

2018年1月31日

轉(zhuǎn)載于:https://www.cnblogs.com/ryzz/p/8397460.html

總結(jié)

以上是生活随笔為你收集整理的深入理解viewport的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。