如何判斷有沒(méi)有出現(xiàn)滾動(dòng)條

API

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

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

image.png

水平方向滾動(dòng)條

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

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

垂直方向滾動(dòng)條

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

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

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

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),并且實(shí)際內(nèi)容的高度是257.92999267578125,的確父元素應(yīng)該出現(xiàn)滾動(dòng)條,但實(shí)際在IE瀏覽器上沒(méi)有顯示滾動(dòng)條,這一點(diǎn)我們從數(shù)據(jù) 父元素的 offsetWidth(840)- clientWidth(840)= 0 也可得出。

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

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

更復(fù)雜情況下的判斷

有時(shí)候情況比較復(fù)雜,比如滾動(dòng)區(qū)域?qū)挾仁遣还潭ǖ?,我們需要根?jù)是否出現(xiàn)滾動(dòng)條來(lái)設(shè)置滾動(dòng)區(qū)域?qū)挾龋ū热纾霈F(xiàn)滾動(dòng)條時(shí)給左右加上點(diǎn)擊按鈕,來(lái)切換顯示區(qū)域)。這時(shí)我們就需要來(lái)計(jì)算內(nèi)部各元素寬度之和來(lái)判斷是否出現(xiàn)滾動(dòng)條。
這里寫(xiě)了個(gè)例子,我們來(lái)看一下,運(yù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上有一個(gè)marginRight的值:2px

clientWidth、offsetWidthscrollWidth屬性會(huì)進(jìn)行四舍五入并返回整數(shù)。當(dāng)子元素有多個(gè)時(shí)相加,誤差會(huì)越來(lái)越大。

getComputedStyle

我們來(lái)看一下getComputedStyle的值

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

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

getBoundingClientRect

我們?cè)賮?lái)看一下getBoundingClientRect獲取到的寬度

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

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

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

瀏覽器放大或縮小

我們把瀏覽器放大至150%再來(lái)看一下

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的值計(jì)算一下

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

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

因此,我們引入一個(gè)微小的忽略值0.1,認(rèn)為當(dāng) 父元素的寬度 + 0.1 大于 內(nèi)容寬度計(jì)算結(jié)果 時(shí),沒(méi)有滾動(dòng)條。

341.35418701171875 + 0.1 > 341.3541793823242 

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

最后編輯于
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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