亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

瀏覽器元素尺寸與位置查詢指南

lei___ / 1653人閱讀

摘要:前言這篇文章主要介紹了有關(guān)瀏覽器中獲取坐標(biāo)以及尺寸的幾種途徑算是比較全的一篇文章了在瀏覽器中獲取元素的坐標(biāo)以及尺寸是非常容易的有非常多種方式來完成這些需求但是雜亂的和很多兼容處理導(dǎo)致了瀏覽器中沒有直接的方式來獲取我們想要的結(jié)果仔細(xì)想想這個問

前言

這篇文章主要介紹了有關(guān)瀏覽器中獲取坐標(biāo)以及尺寸的幾種途徑,算是比較全的一篇文章了.

在瀏覽器中獲取元素的坐標(biāo)以及尺寸是非常容易的,有非常多種方式來完成這些需求,但是雜亂的API和很多兼容處理導(dǎo)致了瀏覽器中沒有直接的方式來獲取我們想要的結(jié)果.

仔細(xì)想想這個問題,為什么瀏覽器并沒有直接提供一個簡單的屬性就告訴你瀏覽器窗口的大小,或者一個元素的寬高.

就拿div元素來舉例,我們有很多的問題影響到了元素寬高:

border 是否納入寬高的計算?

padding 是否納入寬高的計算?

magin 是否納入寬高的計算?

box-sizing:border-box; 時候該如何計算?

父元素使用了overflow:hidden;把我們的元素裁剪了,這時候的寬高該如何計算?

元素使用了overflow出現(xiàn)了滾動條此時該如何計算?

而如果要獲取一個瀏覽器窗口的大小,你還要面對我們到底是要獲取哪個大小?

屏幕大小?

瀏覽窗口大小?

瀏覽區(qū)域大小?

是否包含滾動條?

當(dāng)然最終你還要面臨一個兼容問題,致我們敬愛的IE瀏覽器,不過本文可不探討瀏覽器之間的差異.不過本文的涉及到的內(nèi)容應(yīng)該在IE9以上都是可以正常使用的(不過建議你還是查下can i use 或者M(jìn)DN).

瀏覽器部分

瀏覽器的寬高計算主要通過window對象來完成.

這個對象上提供了幾個關(guān)鍵屬性:

window.innerWidth

window.innerHeight

window.outerWidth

window.outerHeight

用人類語言來描述這幾個屬性就是.

屬性名稱 人類解釋
innerWidth 獲取頁面可視區(qū)域的寬度包括右側(cè)的滾動條(如果有的話).所謂的可視區(qū)域就是HTML頁面的內(nèi)容區(qū)域不包括瀏覽器自身的ui所占用的空間(地址欄和菜單欄等).
innerHeight 獲取頁面可視區(qū)域的高度包括底部的滾動條(如果有的話).解釋同上.
outerWidth 獲取瀏覽器窗口寬度.
outerHeight 獲取瀏覽器窗口高度.

友情出演windows畫圖:

注意:單位均為px.

注意:滾動條并不視為瀏覽器的ui中的內(nèi)容,而是視為內(nèi)容區(qū)域的一部分,右側(cè)默認(rèn)的滾動條的寬度包含在window.innerWidth中,但是不屬于html元素和html下的任何元素.

元素部分 屬性
屬性名稱 人類解釋
element.clientWidth 元素內(nèi)容區(qū)域?qū)挾?padding的寬度,如果寬度溢出且裁剪那么不包含被裁剪掉的部分.
element.scrollWidth 元素實(shí)際大小包括父元素出現(xiàn)滾動條后未被展示的部分,計算范圍為padding+content和clientWidth一致
element.offsetWidth 相當(dāng)于計算邊框?qū)挾鹊腸lientWidth,寬度計算為content+padding+border.
element.clientHeight 元素內(nèi)容區(qū)域高度+padding的高度,如果高度溢出且裁剪那么不包含被裁剪掉的部分.
element.scrollHeight 當(dāng)子元素高度溢出,這里提供的是子元素的高度包括溢出的部分,大小計算和clientHeight一樣.
element.offsetHeight 相當(dāng)于計算邊框高度的clientHeight,高度計算為content+padding+border.
element.clientLeft 元素左邊框的寬度
element.scrollLeft 計算較為復(fù)雜,看后續(xù)詳解
element.offsetLeft 計算比較復(fù)雜,看下面詳解
element.clientTop 元素上邊框的寬度
element.scrollTop 計算較為復(fù)雜,看后續(xù)詳解
element.offsetTop 計算比較復(fù)雜,看下面詳解
滾動條的規(guī)律

無論是橫向滾動條還是縱向滾動條,對于測量clientXXX這個單位來說是不包括滾動條的寬(高)的.

例如在下面這張圖中我們進(jìn)行測量父元素(黑色區(qū)域)的clientWidth結(jié)果和子元素(紅色區(qū)域)的clientWidth的大小是一樣的.

不過需要注意的是,一旦出現(xiàn)了滾動條對于clientWidth來說就意味著寬度減小(高度同理).

注意:圖片所指的寬度是clientWidth

API名稱 是否包含滾動條大小
offsetXXX 包含
clientXXX 不包含
scrollXXX 不包含

所以在margin:0;padding:0;border-width:0;情況下offsetWidth - clientWidth=滾動條的寬度.

通過這種方式我求出了chrome瀏覽器滾動條大小是17px整,但是不要忘記這些API只會返回整數(shù).

注意:scrollXXX對于滾動條計算的規(guī)則和clientXXX表現(xiàn)一致.

含有box-sizing:border-box的計算

請記住,對于clientXXX來說,元素的大小就是padding+content.

而使用border-box后元素的表現(xiàn)就是padding和border的修改就不會影響到元素的大小.

此時width是多少clientWidth就是多少,height同理.

但是不要忘記了邊框不參與clientXXX的計算,所以border的修改并不會影響元素的寬高變化,那么那么當(dāng)border變大,對應(yīng)的clientXXX就變小.

一個元素設(shè)置了border-box:

box{
  width:100px;
  padding:20px;
  border:20px solid;
  box-sizing:border-box;
}

此時clientWidth= 100px - 20px*2(左右邊框的寬度) = 60px

由于offsetXXX的計算是包含border的大小的,所以如果一個元素設(shè)置了border-box那么offsetWidth就等于元素的width大小,因為border被限制到了width中.

offsetTopoffsetLeft

子元素的offsetWidth|height是相對于父元素內(nèi)容區(qū)域(padding+content)左側(cè)和頂部的偏移量.

這個兩個是相對值,是要求出向?qū)τ诟讣壥褂枚ㄎ磺闆r下來進(jìn)行計算的,這個父元素可以通過HTMLElement.offsetParent來獲取到.

例如:父級使用absolute或者relative.

注意:后文提出的父元素都指的是使用了相對定位的父元素.

注意:以上都是對于塊級元素所描述的,對于行內(nèi)元素或者td等元素相對的父元素不盡相同,這里不考慮這些情況,詳情可以查看上方的鏈接.

情況1

在子元素使用了絕對定位的情況下,父元素?zé)o法干預(yù)子元素,所以子元素的scrollLeft就是left+margin-left.

情況2

第二種情況就是父元素和子元素都使用了相對定位,而相對定位是不脫離文檔流的,那么父元素的padding-left就會影響到子元素的scrollLeft屬性.

在線實(shí)例

注意:貌似offsetTopLeft在不同瀏覽器下有不同計算值,會帶來兼容性問題,這里就不展開了,有興趣的讀者可以去查閱相關(guān)資料.

scrollTopscrollLeft

首先scrollTop和scrollLeft是一對可讀寫的屬性,這意味著你可以獲取他的值也可以設(shè)置它從而控制滾動的距離.

注意:scrollTop|scrollLeft是用在含有滾動區(qū)域的元素上(圖中黑色邊框的元素),而不是被滾動的元素上測量,被滾動的元素scrollTop永遠(yuǎn)是0.

簡單理解:在垂直方向上含有滾動條的元素的內(nèi)容區(qū)域的頂部(padding+content)相對于自身頂部邊框的底部向上移動的距離(水平方向同理).

就是scrollTop的大小(圖中超出去的部分).

元素方法 getBoundingClientRect

關(guān)于這個方法建議閱讀MDN的指南.當(dāng)然你也可以選擇聽我瞎扯幾句.

這個api是ie首先提出(早在ie4時候就有了)的這也是ie對web開發(fā)的貢獻(xiàn)之一.

調(diào)用這個api會返回一個DOMRect對象,這個對象多次易名,不過沒有變化過基本概念.

當(dāng)你調(diào)用這個方法的時候他會返回一個對象,該對象擁有如下幾個屬性:

left

top

right

bottom

width

height

x

y

注意:ie9+包括edge兼容width和height截止到2019年4月5日ie和edge不兼容x和y.

和屬性返回的值有兩點(diǎn)不同:

返回的值都是相對值,相對于瀏覽器視口的左上角

返回的值包含小數(shù)部分,這意味著獲取到的值更加精確

如何理解:

如果頁面中只有一個1000px高100%寬的div(沒有margin,padding,border),那它的bottom和height應(yīng)該1000,left和top是0,right和width是元素寬度:

因為我們指定了1000px所以他的height是1000,
因為頁面中只有這一個元素,他的內(nèi)容區(qū)域底部到可視區(qū)域頂部的距離就是1000,所以bottom是1000.

因為頁面中只有這一個元素,所以這個元素是貼著可視區(qū)域的頂端和左側(cè)的,所以left和top這兩個值都是0.

div默認(rèn)會鋪滿橫向的空間,橫向空間中只有我們的div所以right到視口區(qū)域左側(cè)的距離就是元素的寬度,也是當(dāng)前可視區(qū)域的寬度.

注意:left,right,top,bottom指的是內(nèi)容區(qū)域的邊緣到視口左上角的距離,不包括border和margin,padding,如果指定了box-sizing:border-box;則也包括border和padding.

但是,由于是該對象的值是相對值,而視口是會移動的,所以top和left的值在視口移動后會發(fā)生改變.

圖解:

注意:該屬性返回的值也將滾動條視為寬度(縱向)和高度(橫向)的一部分.

和getBoundingClientRect類似的還有另外一個api叫做getClientRects.這個api作用起來稍微復(fù)雜一些,簡單的作用于內(nèi)聯(lián)元素的時候兩者有區(qū)別,首先它返回的是數(shù)組,包含這個內(nèi)聯(lián)元素所有行的DOMRect對象,當(dāng)內(nèi)聯(lián)元素只有一行的時候這兩個api表現(xiàn)一樣的.

思否上一篇關(guān)于getClientRects的討論

https://segmentfault.com/q/10...

屏幕部分

這部分主要利用window.screen對象,這個對象抽象的表示當(dāng)前使用的物理顯示設(shè)備.

沒錯這個屬性是和硬件有關(guān)的,一般的Web開發(fā)中很少會使用這個屬性.

通過這個對象你可以獲取到有關(guān)屏幕的分辨率等信息

這里就不多介紹了,附上一篇介紹詳細(xì)的文章:

https://www.cnblogs.com/ndos/...

此外在windows上還有幾個關(guān)于屏幕的屬性:

名稱 描述
screenLeft 瀏覽器窗口左側(cè)到屏幕左邊緣的距離
screenTop 瀏覽器窗口頂部到屏幕上邊緣的距離
screenX screenLeft
screenY screenTop
計算樣式 HTMLelement.style

使用樣式來獲取元素的大小以及定位是一種常見的操作,但是問題在于使用HTMLelement.style獲取的內(nèi)容:

是帶有css單位的字符串

需要寫在內(nèi)聯(lián)中才可以獲取到

使用style獲取元素的大小或者寬高無疑是方便的,這里返回的值和css模型是一致的.

window.getComputedStyle

這個API和HTMLelement.style類型,調(diào)用這個API返回CSSStyleDeclaration對象.

區(qū)別在于:

只讀

可以使用css完整的名稱來獲取樣式,例如font-size

不僅計算內(nèi)聯(lián)樣式還包括樣式表中的樣式

注意:當(dāng)元素的樣式修改的時候?qū)?yīng)的CSSStyleDeclaration也會實(shí)時同步,你不需要對一個元素進(jìn)行連續(xù)獲取.

滾動相關(guān) 屬性
使用對象 API名稱 描述
window pageXoffset 視口相對于頁面內(nèi)容區(qū)域左側(cè)的距離,在現(xiàn)代瀏覽器上該值可能返回一個雙精度浮點(diǎn)型
window pageYoffset 視口頂部于頁面內(nèi)容區(qū)域頂部的距離,在現(xiàn)代瀏覽器上該值可能返回一個雙精度浮點(diǎn)型
window scrollX 同pageXoffset
window scrollY 同pageYoffset
MDN滾動參數(shù)兼容性參考

https://developer.mozilla.org...

方法

快速解釋:

適用對象 API名稱 描述
window scrollBy 相對于當(dāng)前的滾動位置進(jìn)行滾動到指定的位置
window scrollByLines 相對于當(dāng)前的滾動位置按照行數(shù)進(jìn)行滾動(非標(biāo)準(zhǔn))
window scrollByPages 相對于當(dāng)前的滾動位置按照頁數(shù)進(jìn)行滾動(非標(biāo)準(zhǔn))
window scroll 絕對滾動到某個位置上
window scrollTo 功能于scroll方法無異
window scrollMaxX 獲取水平方向滾動距離的極限(非標(biāo)準(zhǔn))
window scrollMaxY 獲取垂直方向滾動距離的極限(非標(biāo)準(zhǔn))
element scrollTo 用在元素上的scrollTo方法,功能于window上的方法無異.
element scrollBy 用在元素上的scrollBy方法,功能于window上的方法無異
element scroll 用在元素上的scroll方法,功能于window上的方法無異.

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/109436.html

相關(guān)文章

  • 翻譯 | 編寫SVG的口袋指南(上)

    摘要:元素元素歸屬于容器和結(jié)構(gòu)元素,在文檔內(nèi)允許嵌套使用獨(dú)立的片段。如果包含葡萄的組被移動到文檔的末尾,它將出現(xiàn)在西瓜的前面。例如,將葡萄的莖的路徑移動到組的末尾將導(dǎo)致莖在頂部。 作者:DDU(滬江前端開發(fā)工程師)本文是原文翻譯,轉(zhuǎn)載請注明作者及出處。 簡介 Scalable Vector Graphics (SVG)是在XML中描述二維圖形的語言。這些圖形由路徑,圖片和(或)文本組成,并能...

    Brenner 評論0 收藏0
  • 翻譯 | 編寫SVG的口袋指南(上)

    摘要:元素元素歸屬于容器和結(jié)構(gòu)元素,在文檔內(nèi)允許嵌套使用獨(dú)立的片段。如果包含葡萄的組被移動到文檔的末尾,它將出現(xiàn)在西瓜的前面。例如,將葡萄的莖的路徑移動到組的末尾將導(dǎo)致莖在頂部。 作者:DDU(滬江前端開發(fā)工程師)本文是原文翻譯,轉(zhuǎn)載請注明作者及出處。 簡介 Scalable Vector Graphics (SVG)是在XML中描述二維圖形的語言。這些圖形由路徑,圖片和(或)文本組成,并能...

    linkFly 評論0 收藏0
  • CSS 布局經(jīng)典問題初步整理

    摘要:布局經(jīng)典問題初步整理標(biāo)簽前端本文主要對布局中常見的經(jīng)典問題進(jìn)行簡單說明,并提供相關(guān)解決方案的參考鏈接,涉及到三欄式布局,負(fù),清除浮動,居中布局,響應(yīng)式設(shè)計,布局,等等。 CSS 布局經(jīng)典問題初步整理 標(biāo)簽 : 前端 [TOC] 本文主要對 CSS 布局中常見的經(jīng)典問題進(jìn)行簡單說明,并提供相關(guān)解決方案的參考鏈接,涉及到三欄式布局,負(fù) margin,清除浮動,居中布局,響應(yīng)式設(shè)計,F(xiàn)l...

    Amos 評論0 收藏0
  • 幾種常見布局的flex寫法

    摘要:幾種常見布局的寫法首先要對父元素設(shè)置布局方式,同時在本案例中,利用媒體查詢,當(dāng)屏幕分辨率小于的時候,布局變成縱向排列。兩列布局定寬是的簡寫方式。 flex布局目前基本上兼容主流的瀏覽器,且實(shí)現(xiàn)方式簡單。我整理了flex的一些知識點(diǎn),并且總結(jié)歸納了幾種常見布局的flex寫法 ?flex基礎(chǔ)知識點(diǎn) flex-grow和flex-shrink相關(guān)計算公式 公式1:子元素空間 < 父容器 父...

    fish 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<