摘要:元素內(nèi)部寬度和高度獲取元素內(nèi)邊距邊框到邊框的距離大概如下圖所示屬性表示元素的內(nèi)部寬度,以像素計(jì)。如上圖所示計(jì)算方式為分為如下兩種存在垂直滾動(dòng)條不存在滾動(dòng)條屬性表示元素內(nèi)部的高度單位像素,包含內(nèi)邊距,但不包括水平滾動(dòng)條邊框和外邊距。
clientLeft、clientHeight、clientWidth、clientHeight
clientWidth、clientHeight 元素內(nèi)部寬度和高度, clientLeft、clientTop 獲取元素內(nèi)邊距邊框到邊框的距離.
大概如下圖所示:
clientWidth屬性表示元素的內(nèi)部寬度,以像素計(jì)。該屬性包括內(nèi)邊距,但不包括垂直滾動(dòng)條(如果有)、邊框和外邊距。
如上圖所示, 計(jì)算方式為, 分為如下兩種:
存在垂直滾動(dòng)條
content width + padding - scollbarWidth
不存在滾動(dòng)條
content width + padding
clientHeight屬性表示元素內(nèi)部的高度(單位像素),包含內(nèi)邊距,但不包括水平滾動(dòng)條、邊框和外邊距。
如上圖所示, 計(jì)算方式為如下兩種:
存在水平滾動(dòng)條
content height + padding - scollbarWidth
不存在滾動(dòng)條
content height + padding
clientLeft表示一個(gè)元素的左邊框的寬度.
計(jì)算方式為如下兩種情況:
如果文字方向從右往左(默認(rèn)從左往右,通過設(shè)置 direction: rtl;)進(jìn)行排列,且存在垂直滾動(dòng)條的情況下
border width + scollbar width
默認(rèn)情況下
border width
注意:
如果當(dāng)前元素是行內(nèi)元素(inline)時(shí), clientLeft將返回 0;clientTop
表示一個(gè)元素的上邊框的寬度.
把基本的情況介紹完了看看具體實(shí)例,代碼如下:
這是不存在水平和垂直,以及文字按照默認(rèn)情況下排列.
下面我將對上面實(shí)例進(jìn)行如下修改:
給元素 .box 添加 overflow:scroll 讓它顯示滾動(dòng)條, 再來看看每個(gè)值:
如下圖所示:
從輸出答應(yīng)結(jié)果來看, clientWidth 、clientHeight 變小了,也就是說不包含其滾動(dòng)條.
改變?nèi)萜魑淖州敵龇较?看看 clientLeft 值會(huì)不會(huì)像之前說的會(huì)加上滾動(dòng)條的width ?
如下圖所示:
從打印結(jié)果來看, 改變文字方向(rtl)并且存在處置滾動(dòng)條情況下:clientLeft = scrollbarWidth + borderLeftWidth
使用場景 計(jì)算滾動(dòng)條寬度默認(rèn)情況下(沒有滾動(dòng)條情況下) clientWidth = content width + paddingLeftWidth + paddingRightWidth; 對上面示例來說 clientWidth = 200 + 10 + 10; 有滾動(dòng)條情況下: clientWidth = (content width + paddingLeftWidth + paddingRightWidth) - scrollbarWidth 可以推斷出滾動(dòng)條計(jì)算方式: scrollbarWidth = (content width + paddingLeftWidth + paddingRightWidth) - clientWidth;
clientWidth 已知, 從上面公式來看只要知道內(nèi)容區(qū)域大小和左右padding值即可
var ele = document.querySelector("#box"); var computedStyle = window.getComputedStyle(ele); var offsetWidth = ele.offsetWidth; // content widht + padding width + border width (包含滾動(dòng)條) var ceil = function(v){ return Math.ceil(parseFloat(v)) } var maxClientWidth = offsetWidth - ceil(computedStyle.borderLeftWidth) - ceil(computedStyle.borderRightWidth); // ClientWidth 最大值(理想情況下, 也就是不存在滾動(dòng)條) var scrollbarWidth = maxClientWidth // 滾動(dòng)條大小 - ceil(ele.clientWidth); console.log(scrollbarWidth); // 17
這樣就計(jì)算出滾動(dòng)條的 width, 高度同理可得.
上面因?yàn)槭褂?getComputedStyle 只能兼容到 IE9+、Chrome、Firefox、Safari 等 , 需要兼容IE8以及以下版本,可以作下兼容處理:
// 這里如果IE8以下則需要改為 getElementById var selector = function (selectorName) { if (!selectorName && !(typeof selectorName === "string")) { return {} }; var prefix = /^#/; if (document.querySelector) { selectorName = prefix.test(selectorName) ? selectorName.substr(1) : selectorName; return document.querySelector(selectorName); } else if(document.getElementById) { selectorName = prefix.test(selectorName) ? selectorName : "#" + selectorName; return document.getElementById(selectorName); } } var selector = selector("box"); var computedStyle = window.getComputedStyle === undefined ? ele.currentStyle : window.getComputedStyle(ele); var offsetWidth = ele.offsetWidth; // content widht + padding width + border width (包含滾動(dòng)條) var ceil = function (v) { return Math.ceil(parseFloat(v)) } var maxClientWidth = offsetWidth - ceil(computedStyle.borderLeftWidth) - ceil(computedStyle.borderRightWidth); // ClientWidth 最大值(理想情況下, 也就是不存在滾動(dòng)條) var scrollbarWidth = maxClientWidth // 滾動(dòng)條大小 - ceil(ele.clientWidth); console.log(scrollbarWidth); // 17元素內(nèi)部實(shí)際可用區(qū)域
可用區(qū)域其實(shí)就是內(nèi)容可以排放的空間, 其可見區(qū)域?qū)挾绕鋵?shí)就是 clientWidth - paddingLeftWidth - paddingRightWidth 的值.
比求滾動(dòng)條寬度相對簡單點(diǎn), 只需要知道左右內(nèi)邊距的大小即可.
var selector = function (selectorName) { if (!selectorName && !(typeof selectorName === "string")) { return {} }; var prefix = /^#/; if (document.querySelector) { selectorName = prefix.test(selectorName) ? selectorName.substr(1) : selectorName; return document.querySelector(selectorName); } else if(document.getElementById) { selectorName = prefix.test(selectorName) ? selectorName : "#" + selectorName; return document.getElementById(selectorName); } } var selector = selector("box"); var computedStyle = window.getComputedStyle === undefined ? ele.currentStyle : window.getComputedStyle(ele); var ceil = function (v) { return Math.ceil(parseFloat(v)) } console.log(ele.clientWidth - ceil(computedStyle.paddingLeft) - ceil(computedStyle.paddingRight));
上面計(jì)算方式?jīng)]有什么固定,僅供參考. 更好計(jì)算方式也可以推薦下. ~ 比如通過 getBoundingClientRect() 等.
如果有什么錯(cuò)誤問題地方,請大家指出 謝謝~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/104813.html
摘要:元素內(nèi)部寬度和高度獲取元素內(nèi)邊距邊框到邊框的距離大概如下圖所示屬性表示元素的內(nèi)部寬度,以像素計(jì)。如上圖所示計(jì)算方式為分為如下兩種存在垂直滾動(dòng)條不存在滾動(dòng)條屬性表示元素內(nèi)部的高度單位像素,包含內(nèi)邊距,但不包括水平滾動(dòng)條邊框和外邊距。 clientLeft、clientHeight、clientWidth、clientHeight clientWidth、clientHeight 元素內(nèi)部...
摘要:元素內(nèi)部寬度和高度獲取元素內(nèi)邊距邊框到邊框的距離大概如下圖所示屬性表示元素的內(nèi)部寬度,以像素計(jì)。如上圖所示計(jì)算方式為分為如下兩種存在垂直滾動(dòng)條不存在滾動(dòng)條屬性表示元素內(nèi)部的高度單位像素,包含內(nèi)邊距,但不包括水平滾動(dòng)條邊框和外邊距。 clientLeft、clientHeight、clientWidth、clientHeight clientWidth、clientHeight 元素內(nèi)部...
摘要:問題今日頭條的一道筆試題,的區(qū)別。結(jié)果如圖更詳細(xì)的介紹,請點(diǎn)擊 問題 今日頭條的一道筆試題,offsetWidth、clientWidth、scrollWidth的區(qū)別。 分析 JS中document對象的寬高有三種,cilent、offset、scroll client: clientWidth和clientHeight,clientTop和clientLeft clientWidt...
摘要:容易混淆上來不說話,先拋出幾個(gè)問題是時(shí)候談?wù)勊鼈冎g的區(qū)別了,是不是已經(jīng)混亂了好吧,一步一步來搞清楚這些東西是啥。要搞清這幾個(gè)容易混淆的概念,我的建議是運(yùn)行文章中的例子。和類似于和,不同的是不包含邊框大小。 容易混淆client-*,scroll-*,offset-* Truth comes from practice 上來不說話,先拋出幾個(gè)問題: offsetWidth offs...
摘要:容易混淆上來不說話,先拋出幾個(gè)問題是時(shí)候談?wù)勊鼈冎g的區(qū)別了,是不是已經(jīng)混亂了好吧,一步一步來搞清楚這些東西是啥。要搞清這幾個(gè)容易混淆的概念,我的建議是運(yùn)行文章中的例子。和類似于和,不同的是不包含邊框大小。 容易混淆client-*,scroll-*,offset-* Truth comes from practice 上來不說話,先拋出幾個(gè)問題: offsetWidth offs...
閱讀 2692·2023-04-25 19:13
閱讀 4010·2021-09-22 15:34
閱讀 3052·2019-08-30 14:23
閱讀 1461·2019-08-29 17:17
閱讀 1603·2019-08-29 16:05
閱讀 1537·2019-08-29 13:26
閱讀 1217·2019-08-29 13:19
閱讀 553·2019-08-29 13:16