想要判讀元素是否在頁面內首先須要獲取兩個量:
1、$("#test1").offset().top 元素距離頂部的距離
2、$(document).scrollTop() 頁面翻過去的距離
用第一個量減去第二個量就能推斷出元素距離瀏覽器窗體頂部的距離。再依據瀏覽器窗體高度就可以知道元素是否在窗體中出現
$(window).height() 瀏覽器窗體高度
即:0 < $("#test1").offset().top - $(document).scrollTop() < $(window).height() 則表明在窗體中出現
關於clientHeight、offsetHeight、scrollHeight
window.screen.availWidth 返回當前屏幕寬度(空白空間)
window.screen.availHeight 返回當前屏幕高度(空白空間)
window.screen.width 返回當前屏幕寬度(分辨率值)
window.screen.height 返回當前屏幕高度(分辨率值)
window.document.body.offsetHeight; 返回當前網頁高度
window.document.body.offsetWidth; 返回當前網頁寬度
我們這里說說四種瀏覽器對 document.body 的 clientHeight、offsetHeight 和 scrollHeight 的解釋。
這四種瀏覽器分別為IE(Internet Explorer)、NS(Netscape)、Opera、FF(FireFox)。
clientHeight
大家對 clientHeight 都沒有什么異議,都覺得是內容可視區域的高度,也就是說頁面瀏覽器中能夠看到內容的這個區域的高度,通常是最后一個工具條下面到狀態欄以上的這個區域,與頁面內容無關。
offsetHeight
IE、Opera 覺得 offsetHeight = clientHeight + 滾動欄 + 邊框。
NS、FF 覺得 offsetHeight 是網頁內容實際高度,能夠小於 clientHeight。
scrollHeight
IE、Opera 覺得 scrollHeight 是網頁內容實際高度。能夠小於 clientHeight。
NS、FF 覺得 scrollHeight 是網頁內容高度。只是最小值是 clientHeight。
簡單地說
clientHeight 就是透過瀏覽器看內容的這個區域高度。
NS、FF 覺得 offsetHeight 和 scrollHeight 都是網頁內容高度,僅僅只是當網頁內容高度小於等於 clientHeight 時。scrollHeight 的值是 clientHeight。而 offsetHeight 能夠小於 clientHeight。
IE、Opera 覺得 offsetHeight 是可視區域 clientHeight 滾動欄加邊框。scrollHeight 則是網頁內容實際高度。
同理
clientWidth、offsetWidth 和 scrollWidth 的解釋與上面同樣,僅僅是把高度換成寬度就可以。
=======================================================================
clientHeight與offsetHeight的差別
很多文章已經介紹了clientHeight和offsetHeight的差別,就是clientHeight的值不包含scrollbar的高度,而offsetHeight的值包含了scrollbar的高度。
然而,clientHeight和offsetHeight的值究竟由什么組成的呢?怎樣計算這兩個數的值?
1. clientHeight和offsetHeight的值由什么決定?
假如我們有下面的DIV。主要顯示的文字為"This is the main body of DIV"。
如上圖所看到的。clientHeight的值由DIV內容的實際高度和CSS中的padding值決定。而offsetHeight的值由DIV內容的實際高度,CSS中的padding值。scrollbar的高度和DIV的border值決定;至於CSS中的margin值,則不會影響clientHeight和offsetHeight的值。
2. CSS中的Height值對clientHeight和offsetHeight有什么影響?
首先,我們看一下CSS中Height定義的是什么的高度。如在本文最后部分“APPENDIX演示樣例代碼”(注:下面稱為“演示樣例代碼”)中,innerDIVClass的Height值設定為50px。在IE下計算出來的值例如以下所看到的。也就是說。在IE里面,CSS中的Height值定義了DIV包含padding在內的高度(即offsetHeight的值);在Firefox里面,CSS中的Height值僅僅定義的DIV實際內容的高度,padding並沒有包含在這個值里面(70 = 50 + 10 * 2)。
in IE:
innerDiv.clientHeight: 46
innerDiv.offsetHeight: 50
outerDiv.clientHeight: 0
outerDiv.offsetHeight: 264
in Firfox:
innerDiv.clientHeight: 70
innerDiv.offsetHeight: 74
outerDiv.clientHeight: 348
outerDiv.offsetHeight: 362
在上面的演示樣例中,或許你會非常奇怪,為什么在IE里面outerDiv.clientHeight的值為0。
那是由於演示樣例代碼中。未定義outerDIVClass的Height值,這時,在IE里面,則clientHeight的值是無法計算的。
相同,在演示樣例代碼中。假設將innerDIVClass中的Height值去年。則innerDIV.clientHeight的值也為0。
(注:在Firefox下不存在這樣的情況)。
假設CSS中Height值小於DIV要顯示內容的高度的時候呢(當CSS中未定義overflow的行為時)?在IE里面,整個clientHeight(或者offsetHeight)的值並沒有影響。DIV會自己主動被撐大;而在Firefox里面,DIV是不會被撐開的。如在演示樣例代碼中,將innerDivClass的Height值設為0。則計算結果例如以下所看到的。IE里面的DIV被撐開,其clientHeight值等於內容的高度與padding*2的和;而Firefox里面,文字將溢出DIV的邊界,其clientHeight值正好是padding值的兩倍。
In IE:
innerDiv.clientHeight: 38
innerDiv.offsetHeight: 42
outerDiv.clientHeight: 0
outerDiv.offsetHeight: 256
In Firefox:
innerDiv.clientHeight: 20
innerDiv.offsetHeight: 24
outerDiv.clientHeight: 298
outerDiv.offsetHeight: 312
