如何判斷有沒有出現(xiàn)滾動條

API

API 說明
clientWidth? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? 內聯(lián)元素以及沒有 CSS 樣式的元素的 clientWidth 屬性值為 0。
Element.clientWidth 屬性表示元素的內部寬度,以像素計。
該屬性包括內邊距 padding,但不包括邊框 border、外邊距 margin 和垂直滾動條(如果有的話)。
offsetWidth HTMLElement.offsetWidth 是一個只讀屬性,返回一個元素的布局寬度。
一個典型的(譯者注:各瀏覽器的offsetWidth可能有所不同)offsetWidth是測量包含元素的邊框(border)、水平線上的內邊距(padding)、豎直方向滾動條(scrollbar)(如果存在的話)、以及CSS設置的寬度(width)的值。
scrollWidth Element.scrollWidth 這個只讀屬性是元素內容寬度的一種度量,包括由于overflow溢出而在屏幕上不可見的內容。
scrollWidth值等于元素在不使用水平滾動條的情況下適合視口中的所有內容所需的最小寬度。
寬度的測量方式與clientWidth相同:它包含元素的內邊距,但不包括邊框,外邊距或垂直滾動條(如果存在)。 它還可以包括偽元素的寬度,例如::before::after。 如果元素的內容可以適合而不需要水平滾動條,則其scrollWidth等于clientWidth
clientHeight 這個屬性是只讀屬性,對于沒有定義CSS或者內聯(lián)布局盒子的元素為0,否則,它是元素內部的高度(單位像素),包含內邊距,但不包括水平滾動條、邊框和外邊距。
offsetHeight HTMLElement.offsetHeight 是一個只讀屬性,它返回該元素的像素高度,高度包含該元素的垂直內邊距和邊框,且是一個整數(shù)。
通常,元素的offsetHeight是一種元素CSS高度的衡量標準,包括元素的邊框、內邊距和元素的水平滾動條(如果存在且渲染的話),不包含:before或:after等偽類元素的高度。
scrollHeight Element.scrollHeight 這個只讀屬性是一個元素內容高度的度量,包括由于溢出導致的視圖中不可見內容。
scrollHeight的值等于該元素在不使用滾動條的情況下為了適應視口中所用內容所需的最小高度。 沒有垂直滾動條的情況下,scrollHeight值與元素視圖填充所有內容所需要的最小值clientHeight相同。包括元素的padding,但不包括元素的border和margin。scrollHeight也包括 ::before::after這樣的偽元素。

此屬性會將獲取的值四舍五入取整數(shù)。 如果你需要小數(shù)結果, 請使用 element.getBoundingClientRect().

image.png

水平方向滾動條

我們要判斷一個div上有沒有出現(xiàn)水平方向滾動條,只需判斷scrollWidth是否大于clientWidth即可。

當border為0時,使用offsetHeight - clientHeight可以得到水平滾動條的寬度(如果有的話)。

垂直方向滾動條

我們要判斷一個div上有沒有出現(xiàn)垂直方向滾動條,只需判斷scrollHeight是否大于clientHeight即可。

當border為0時,使用offsetWidth - clientWidth可以得到垂直滾動條的寬度(如果有的話)。

但是在IE瀏覽器上,某些特殊情況下,雖然scrollHeight > clientHeight(或scrollWidth > clientWidth),也不一定出現(xiàn)滾動條。

API 父元素 子元素
Element.clientHeight 257 258
Element.offsetHeight 257 258
Element.scrollHeight 258 258
Element.getBoundingClientRect().height 257 257.92999267578125
Element.clientWidth 840 840
Element.offsetWidth 840 840

我們發(fā)現(xiàn),在這種特殊情況下,雖然父元素的 scrollHeight(258)> clientHeight(257),并且實際內容的高度是257.92999267578125,的確父元素應該出現(xiàn)滾動條,但實際在IE瀏覽器上沒有顯示滾動條,這一點我們從數(shù)據(jù) 父元素的 offsetWidth(840)- clientWidth(840)= 0 也可得出。

通常情況下,我們可以使用scrollWidth > clientWidth 判斷是否出現(xiàn)水平滾動條, scrollHeight > clientHeight 判斷是否出現(xiàn)垂直滾動條。

在需要更精確(非移動端且非overflow: hidden 或 overlay)或要拿到滾動條寬度的情況下,我們可以使用 offsetHeight - clientHeight(水平滾動條) 或 offsetWidth - clientWidth(垂直滾動條),這時,我們不要忘了減去元素的border。

更復雜情況下的判斷

有時候情況比較復雜,比如滾動區(qū)域寬度是不固定的,我們需要根據(jù)是否出現(xiàn)滾動條來設置滾動區(qū)域寬度(比如,出現(xiàn)滾動條時給左右加上點擊按鈕,來切換顯示區(qū)域)。這時我們就需要來計算內部各元素寬度之和來判斷是否出現(xiàn)滾動條。
這里寫了個例子,我們來看一下,運行環(huán)境為Windows電腦,Chrome瀏覽器

API 父元素 子元素1 子元素2
Element.getBoundingClientRect().width 341.375 98.40625 240.96875
getComputedStyle(Element).width 341.375px 98.4063px 240.969px
Element.clientWidth 341 98 241
Element.offsetWidth 341 98 241
Element.scrollWidth 341 98 241
getComputedStyle(Element).marginRight 0px 2px 0px

這里子元素1上有一個marginRight的值:2px

clientWidthoffsetWidth、scrollWidth屬性會進行四舍五入并返回整數(shù)。當子元素有多個時相加,誤差會越來越大。

getComputedStyle

我們來看一下getComputedStyle的值

98.4063(子元素1寬度)+ 2(子元素1 margin-right)+ 240.969(子元素2寬度)= 341.3753

我們發(fā)現(xiàn)內容寬度341.3753 > 父元素寬度341.375
getComputedStyle存在一個小的精度誤差。

getBoundingClientRect

我們再來看一下getBoundingClientRect獲取到的寬度

98.40625(子元素1寬度)+ 2(子元素1 margin-right)+ 240.96875(子元素2寬度)= 341.375

我們發(fā)現(xiàn)內容寬度341.375 與 父元素寬度341.375 相等。

那我們這里就選用getBoundingClientRect吧,但是......

瀏覽器放大或縮小

我們把瀏覽器放大至150%再來看一下

API 父元素 子元素1 子元素2
Element.getBoundingClientRect().width 341.35418701171875 98.39583587646484 240.95834350585938
getComputedStyle(Element).width 341.354px 98.3958px 240.958px
Element.clientWidth 341 99 241
Element.offsetWidth 341 99 241
Element.scrollWidth 341 99 241
getComputedStyle(Element).marginRight 0px 2px 0px

我們使用getBoundingClientRect的值計算一下

98.39583587646484(子元素1寬度)+ 2(子元素1 margin-right)+ 240.95834350585938(子元素2寬度)= 341.3541793823242

我們發(fā)現(xiàn)得到的值為341.3541793823242,與獲取到的父元素的值341.35418701171875仍存在一個微小的偏差(這個偏差可能是大,也可能是?。?/p>

因此,我們引入一個微小的忽略值0.1,認為當 父元素的寬度 + 0.1 大于 內容寬度計算結果 時,沒有滾動條。

341.35418701171875 + 0.1 > 341.3541793823242 

參考文檔:
MDN Element.clientWidth
MDN HTMLElement.offsetWidth
MDN Element.scrollWidth
MDN Element.clientHeight
MDN HTMLElement.offsetHeight
MDN Element.scrollHeight

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

友情鏈接更多精彩內容