第二十二章 DOM 元素尺寸和位置

2021-09-01 21:14:28 字數 4091 閱讀 7747

學習要點:

1.獲取元素 css 大小

2.獲取元素實際大小

3.獲取元素周邊大小

本章,我們主要討論一下頁面中的某乙個元素它的各種大小和各種位置的計算方式, 以便更好的理解。

一.獲取元素 css 大小

1.通過 style 內聯獲取元素的大小

var box = document.getelementbyid('box'); //獲取元素

box.style.width; //200px、空

box.style.height; //200px、空

ps: style 獲取只能獲取到行內 style 屬性的 css 樣式中的寬和高, 如果有獲取; 如果沒有則返回空。

2.通過計算獲取元素的大小

var style = window.getcomputedstyle ?

window.getcomputedstyle(box, null) : null || box.currentstyle;

style.width; //1424px、200px、auto

style.height; //18px、200px、auto

ps:通過計算獲取元素的大小,無關你是否是行內、內聯或者鏈結,它經過計算後得到的結果返回出來。如果本身設定大小,它會返回元素的大小,如果本身沒有設定,非 ie瀏覽器會返回預設的大小,ie 瀏覽器返回 auto。

3.通過 cssstylesheet 物件中的 cssrules(或 rules)屬性獲取元素大小

var sheet = document.stylesheets[0]; //獲取 link 或 style

var rule = (sheet.cssrules || sheet.rules)[0]; //獲取第一條規則

rule.style.width; //200px、空

rule.style.height; //200px、空

ps:cssrules(或 rules)只能獲取到內聯和鏈結樣式的寬和高,不能獲取到行內和計算後的樣式。

總結: 以上的三種 css 獲取元素大小的方法, 只能獲取元素的 css 大小, 卻無法獲取元素本身實際的大小。比如加上了內邊距、滾動條、邊框之類的。

二.獲取元素實際大小

1.clientwidth 和 clientheight

這組屬性可以獲取元素可視區的大小,可以得到元素內容及內邊距所佔據的空間大小。

box.clientwidth; //200

box.clientheight; //200

ps: 返回了元素大小, 但沒有單位, 預設單位是 px, 如果你強行設定了單位, 比如 100em之類,它還是會返回 px 的大小。(css 獲取的話,是照著你設定的樣式獲取)。

ps:對於元素的實際大小,clientwidth 和 clientheight 理解方式如下:

1.增加邊框,無變化,為 200;

2.增加外邊距,無變化,為 200;

3.增加滾動條,最終值等於原本大小減去滾動條的大小,為 184;

4.增加內邊距,最終值等於原本大小加上內邊距的大小,為 220;

ps: 如果說沒有設定任何 css 的寬和高度, 那麼非 ie 瀏覽器會算上滾動條和內邊距的計算後的大小,而 ie 瀏覽器則返回 0。

2.scrollwidth 和 scrollheight

這組屬性可以獲取滾動內容的元素大小。

box.scrollwidth; //200

box.scrollwidth; //200

ps:返回了元素大小,預設單位是 px。如果沒有設定任何 css 的寬和高度,它會得到計算後的寬度和高度。

ps:對於元素的實際大小,scrollwidth 和 scrollheight 理解如下:

1.增加邊框,不同瀏覽器有不同解釋:

a) firefox 和 opera 瀏覽器會增加邊框的大小,220 x 220

b) ie、chrome 和 safari 瀏覽器會忽略邊框大小,200 x 200

c) ie 瀏覽器只顯示它本來內容的高度,200 x 18

2.增加內邊距,最終值會等於原本大小加上內邊距大小,220 x 220,ie 為 220 x 38

3.增加滾動條,最終值會等於原本大小減去滾動條大小,184 x 184,ie 為 184 x 18

4.增加外邊據,無變化。

5.增加內容溢位,firefox、chrome 和 ie 獲取實際內容高度,opera 比前三個瀏覽器獲取的高度偏小,safari 比前三個瀏覽器獲取的高度偏大。

3.offsetwidth 和 offsetheight

這組屬性可以返回元素實際大小,包含邊框、內邊距和滾動條。

box.offsetwidth; //200

box.offsetheight; //200

ps:返回了元素大小,預設單位是 px。如果沒有設定任何 css 的寬和高度,他會得到計算後的寬度和高度。

ps:對於元素的實際大小,offsetwidth 和 offsetheight 理解如下:

1.增加邊框,最終值會等於原本大小加上邊框大小,為 220;

2.增加內邊距,最終值會等於原本大小加上內邊距大小,為 220;

3.增加外邊據,無變化;

4.增加滾動條,無變化,不會減小;

ps:對於元素大小的獲取,一般是塊級(block)元素並且以設定了 css 大小的元素較為方便。 如果是內聯元素(inline)或者沒有設定大小的元素就尤為麻煩, 所以, 建議使用的時候注意。

三.獲取元素周邊大小

1.clientleft 和 clienttop

這組屬性可以獲取元素設定了左邊框和上邊框的大小。

box.clientleft; //獲取左邊框的長度

box.clienttop; //獲取上邊框的長度

ps:目前只提供了 left 和 top 這組,並沒有提供 right 和 bottom。如果四條邊寬度不同的話,可以直接通過計算後的樣式獲取,或者採用以上三組獲取元素大小的減法求得。

2.offsetleft 和 offsettop

這組屬性可以獲取當前元素相對于父元素的位置。

box.offsetleft; //50

box.offsettop; //50

ps:獲取元素當前相對于父元素的位置,最好將它設定為定位 position:absolute;否則

不同的瀏覽器會有不同的解釋。

ps:加上邊框和內邊距不會影響它的位置,但加上外邊據會累加。

box.offsetparent; //得到父元素

ps:offsetparent 中,如果本身父元素是,非 ie 返回 body 物件,ie 返回 html 物件。如果兩個元素巢狀,如果上父元素沒有使用定位 position:absolute,那麼 offsetparent 將返回 body 物件或 html 物件。所以,在獲取 offsetleft 和 offsettop 時候,css 定位很重要。

如果說,在很多層次裡,外層已經定位,我們怎麼獲取裡層的元素距離 body 或 html元素之間的距離呢?也就是獲取任意乙個元素距離頁面上的位置。那麼我們可以編寫函式,通過不停的向上回溯獲取累加來實現。

box.offsettop + box.offsetparent.offsettop; //只有兩層的情況下

如果多層的話,就必須使用迴圈或遞迴。

function offsetleft(element)  //然後繼續迴圈

return left;

}

3.scrolltop 和 scrollleft

這組屬性可以獲取滾動條被隱藏的區域大小,也可設定定位到該區域。

box.scrolltop; //獲取滾動內容上方的位置

box.scrollleft; //獲取滾動內容左方的位置

如果要讓滾動條滾動到最初始的位置,那麼可以寫乙個函式:

function scrollstart(element)

第二十二章 Teamware需求

teamware正如他的名字一樣,是乙個團隊使用的groupware。groupware的定義是 teamware的功能需求 公共功能 使用者管理 角色管理 客戶管理 crm 專案管理 安全 授權和認證 業務功能 公告欄 notice 位址本 address book todo列表 todo lis...

第二十二章 橋接模式

很多情況下用繼承會帶來麻煩。比如,物件的繼承關係是在編譯時就定義好了的,所以無法在執行時改變從父類繼承的實現。子類的實現與它的父類有非常緊密的依賴關係,以至於父類實現中的任何變化必然會導致子類發生變化。當你需要復用子類時,如果繼承下來的實現不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這...

第二十二題

第二十二題 韓信點兵 在中國數學史上,廣泛流傳著乙個 韓信點兵 的故事 韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點名的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數 按從1到5報數,記下最末乙個士兵報的數為1 按從1...