天天看點

jQuery2.0.3源碼分析系列(28) 元素大小偏移量客戶區大小滾動大小源碼解析

最近的分析都是有點不溫不火,基本都是基礎的回顧了

今年部落格的目标目前總的來說有2大塊

JS版的設計模式,會用jQuery來诠釋

JS版的資料結構,最近也一直在狠狠的學習中.

HTML息息相關的的樣式

<a></a>

offsetWidth offsetHeight offsetLeft offsetTop

jQuery2.0.3源碼分析系列(28) 元素大小偏移量客戶區大小滾動大小源碼解析

offsetHeight/offsetWidth: 表述元素的外尺寸:元素内容+内邊距+邊框(不包括外邊距)

offsetLeft/offsetTop: 表示該元素的左上角(邊框外邊緣)與已定位的父容器(offsetParent對象)左上角的距離。

offsetParent元素是指元素最近的定位(relative,absolute)祖先元素,可遞歸上溯。

clientWidth clientHeight 

jQuery2.0.3源碼分析系列(28) 元素大小偏移量客戶區大小滾動大小源碼解析

clientWidth/clientHeight: 用于描述元素的内尺寸:元素内容+兩邊内邊距

scrollWidth scrollHeight scrollLeft scrollTop

jQuery2.0.3源碼分析系列(28) 元素大小偏移量客戶區大小滾動大小源碼解析

scrollHeight/scrollWidth: 元素内容的總高度或寬度

scrollLeft/scrollTop:是指元素滾動條位置,它們是可寫的(被隐藏的内容區域左側/上方的像素)

浏覽器視窗的滾動條位置:window對象的pageXoffset和pageYoffset, IE 8及更早版本可以通過scrollLeft和scrollTop屬性獲得滾動條位置

以下是網上的總結,我收集下

Chrome/FF/Safari/opera 

對這些浏覽器而言,window有個屬性innerWidth/innerHeight包含的是整個文檔的可視區域尺寸,注意,這個尺寸是包含滾動條大小的。 

如果我們不計滾動條的影響,就可以直接使用這兩個屬性。 

如果滾動條會影響(比如最大化彈出框),那麼應該想另外的辦法。

document.documentElementy與document.body

Document對象是每個DOM樹的根,但是它并不代表樹中的一個HTML元素,document.documentElement屬性引用了作為文檔根元素的html标記,document.body屬性引用了body标記 

我們這裡擷取常見的三個值(scrollWidth、offsetWidth和clientwidth)來比較一下

不過一般來說,我們不會給document.documentElement來設定邊框,是以這裡的clientwidth 與 offsetWidth一緻

document.body.scrollWidth傳回body的寬度 

注意,這裡的scrollWidth有個不一緻的地方,基于webkit的浏覽器(chrome和safari)傳回的是整個文檔的寬度,也就是和document.documentElement.scrollWidth一緻, 

opera和FF傳回的就是标準的body 的scrollWidth,個人覺得opera和FF算是比較合理的。

document.body.offsetWidth傳回body的offsetWidth 

document.body.clientwidth傳回body的clientwidth(不包含邊框),clientwidth = offsetWidth - borderWidth

我們看上面的例子,會發現

body和documentElement的有些值是相等的,這并不是表示他們是等同的。而是因為當我們沒有給body設定寬度的時候,document.body預設占滿整個視窗寬度,

于是就有:

當我們給body設定了一個寬度的時候,差別就出來了。

IE9/IE8 

這兩個差不多,唯一的差別是IE9包含window.innerWidth屬性,而IE8不包含window.innerWidth屬性。 

document.documentElement.scrollWidth傳回整個文檔的寬度,和FF等浏覽器一緻 

document.documentElement.offsetWidth傳回整個文檔的可見寬度(包含滾動條,值和innerWidth一緻),注意,這裡和FF等浏覽器又有點差別。 

document.documentElement.clientwidth傳回整個文檔的可見寬度(不包含邊框),和FF等浏覽器一緻。clientwidth = offsetWidth - 滾動條寬度

document.body.scrollWidth傳回body的寬度,注意,這裡的scrollWidth和FF等浏覽器有點差別,這裡并不包括body本身的border寬度。 

是以例子中,相比FF少了10px。 

document.body.offsetWidth傳回body的offsetWidth,和FF等浏覽器一緻 

document.body.clientwidth傳回body的clientwidth(不包含邊框),和FF等浏覽器一緻,clientwidth = offsetWidth – borderWidth

IE7與IE9/IE8的主要差別是 

第一、document.documentElement.offsetWidth的傳回值不一樣, 

參見上面說的,IE9/IE8的document.documentElement.offsetWidth包含滾動條,但是,IE7的document.documentElement.offsetWidth不包含滾動條。 

第二、document.documentElement.scrollWidth傳回整個文檔的寬度,注意,這裡和IE9/IE8、FF等浏覽器又有不一緻,對于IE9/IE8、FF等浏覽器,scrollWidth最小不會小于視窗的寬度,但是在IE下沒有這個限制,文檔有多小,這個就有多小 

其他倒是挺一緻的。

IE6了 

IE6的document.documentElement傳回值與IE9/IE8沒有差別(由此可見,對于document.documentElement,IE7就是個奇葩)。 

話說回來,IE的document.body就是個奇葩,當沒有給body設定寬度的時候,body是預設占滿整個文檔的(注意,其他的浏覽器都是占滿整個視窗),當然,最小值是整個視窗的大小,就是說body指向了根元素。 

是以,在算上IE6在解析width方面的bug,和其他的浏覽器的差別就淋漓盡緻了。 

document.body.scrollWidth傳回body的寬度,和IE9/IE8/IE7一緻 

document.body.offsetWidth傳回body的offsetWidth,注意,由于body的不同,這裡的offsetWidth = scrollWidth + borderWidth 

document.body.clientwidth傳回body的clientwidth(不包含邊框)clientwidth = offsetWidth - borderWidth 

另外,有一點和IE7同樣,就是document.documentElement.scrollWidth沒有最小寬度限制。

先看jQuery對視窗大小六種相似方法的生成

//執行代碼

擴充方法還是用的合并的模式,把具有相同特性的方法采用合并處理

循環生成是藝術,需要深刻了解它們的功能與共同點,然後将特異點組成一個對象,好處自然是省代碼了,然後可以集中處理

例如:.width()

為比對的元素集合中擷取第一個元素的目前計算寬度值。

A.首先先解釋下普通元素和非普通元素,

非普通元素是指window,document這些 元素對象,

普通元素是指除window,document之外的元素,如:div

B.css(width) 和 .width()之間的差別?

對于非普通元素,隻能使用 .width()

對于普通的元素 ,他們的作用相同

後者傳回一個沒有機關的數值(例如,<code>400</code>),前者是傳回帶有完整機關的字元串(例如,<code>400px</code>)。當一個元素的寬度需要數學計算的時候推薦使用<code>.width()</code> 方法

C.非普通元素的擷取

如:window

取最大值,因為可以帶卷滾條溢出

D.普通元素取值

因為有些樣式不是簡單的讀寫屬性就可以的,比如width就不是簡單地讀取el.style.width。為了解決這個問題,jquery定義了一個屬性 $.cssHooks,這裡可以自定義對某個屬性的get和set操作。而且jquery中就是用cssHooks來處理某些特殊屬性的

對CSS的操作都是通過統一的API調用,操作的屬性是

borderWidth: Object

height: Object

margin: Object

opacity: Object

padding: Object

width: Object

此時就會用jQuery.cssHooks方法處理相容問題,

width,height的鈎子方法

get 方法:

1 節點隐藏等情況下,height、width等擷取值不準,此時需利用jQuery.swap方法來獲得準确值

2 getWidthOrHeight擷取準确值

本章大體回顧下了跟HTML相關處理的10種方法與jQuery中相對應的處理流,下章再具體分析jQuery中對應每種不同相容的處理

本文轉自艾倫 Aaron部落格園部落格,原文連結:http://www.cnblogs.com/aaronjs/p/3565253.html,如需轉載請自行聯系原作者

繼續閱讀