深入淺出viewport 一

2021-06-14 15:23:56 字數 2397 閱讀 8333

viewport對於移動瀏覽器上的網頁展示比較重要,那麼我們為什麼需要設定viewport呢?viewport到底是個什麼東東?讓我們一起來抽絲剝繭,一點點的揭露它的真相。這裡是翻譯的文章,沒有逐字翻譯。

viewport的作用是限制頁面頂級的包含元素,這聽起來可能有點模糊不清。舉個例子,假設你有乙個流體布局,你的側邊欄寬10%。這個側邊欄會隨著瀏覽器視窗大小的變化增大或縮小。一般來說,所有塊級元素會佔據他們父元素100%的寬度(我們暫時忽略那些例外的情況)。因此這個側邊欄的父母body的寬度和html元素一致, 10%會佔據整個瀏覽器視窗的10%。所有web開發者直覺上都知道和在使用這個事實。

但你可能不太清楚這背後的原理。實際上,元素的寬度是由viewport限制的,元素佔據viewport的100%寬度而viewport事實上又等於瀏覽器視窗的大小(它就是這樣子定義的)。視口不是乙個html概念,因此你別想用css來影響它。在桌面瀏覽器上,它就等於瀏覽器的寬高。在移動瀏覽器上,事情就變的複雜了。

這種狀況產生了一些有意思的結果。你可以在本站上看見他們。請一直滾動到頁面頂部,然後放大直到站點的內容超出了瀏覽器視窗。

現在滾到右邊,你就會看到頂部的藍色條不再排列整齊的。

這種行為是viewport帶來的結果。我設定頂部的藍色條寬度是100%。和viewport一樣寬,而viewport等於瀏覽器視窗大小。關鍵在於,縮放100%的時候這工作的很好,但當我們放大的時候,viewport變得比網頁內容寬度更小。這本身沒有什麼關係,內容會超出元素。html元素的overflow屬性是visible,意味著溢位的內容在這種情況下會顯示出來。

但是藍色條沒有溢位,因為我設定它的寬度是100%。瀏覽器會設定它的寬度是viewport的寬度,它們才不會關心這個寬度是不是太窄了。

你可能想要知道viewport的尺寸。他們可以通過document.documentelement.clientwidth /height來獲得

如果你了解dom的話,你知道document.documentelement事實上是(任何html元素的根元素)。

但不管怎麼樣,viewport會更高一層。如果你給設定乙個寬度,就會帶來影響。

document.documentelement.clientwidth /height總是給出viewport的尺寸,無論的大小是多少。

clientwidth/height總是會給出所有情況下的視口尺寸,但是我們在**找到元素的尺寸呢?答案是documen.docmentelment.offsetwidth/height

這些屬性讓你可以把作為塊級元素訪問,如果你設定乙個寬度的話,offsetwidth就會反映出來

當滑鼠事件觸發後,最多不超過5個屬性可以用來給你一些關於事件發生的位置資訊。對於我們的討論,下面三個是比較重要的 

pagex/y: 相對於元素的css畫素座標

clientx/y: 相對於viewport的css畫素座標

screenx/y相對於螢幕的裝置畫素座標

90%情況下,我們會使用pagex/y, 通常情況下我們需要知道相對於文件的事件座標;10%的情況下會使用clientx/y.

最後,我們談一下mediaquery。

有兩個與寬高相關的**查詢:width/height 和 device-width/device-height

1、width/height 使用與document.documentelement.clientwidth/height(視口),採用css畫素。

2、devcie-width/devicen-height 使用和screen.width/height(螢幕)一致的值,採用裝置畫素。

深入淺出AOP(一)

aop事實上非常早之前依照做出來了一些東西,之所以不敢說做出來了。是由於它是什麼?怎麼實現?做出來的東西是不是?先前一直查資料。查到的資料跟著做。到後來發現,aop越來越大,而非常多資料跟aop本身的思想有衝突的地方,所以還有非常多要學習的地方。能夠動態的加入和刪除在切面上的漏記而不影響原來的執行 ...

深入淺出sizeof

int佔 位元組,short佔 位元組 1.0 回答下列問題 答案在文章末尾 1.sizeof char 2.sizeof a 3.sizeof a 4.strlen a 如果你答對了全部四道題,那麼你可以不用細看下面關於sizeof的論述。如果你答錯了部分題目,那麼就跟著我來一起 關於sizeof...

深入淺出ShellExecute

ipconfig c log.txt應如何處理?二樓的朋友,開啟拔號網路這樣 shellexecute null,open c windows rundll32.exe shell32.dll,control rundll c windows system telephon.cpl null,sw ...