各種位置和高度計算:.position()、.offset()、.outerHeight()、.scrollTop、.scrollHeight、.clientHeight


1、.position()和.offset()

jquery的.position()獲取相對於最近的position為relative或absolute的父元素的偏移,返回.position().left和.position().top,不算上自己的margin-left;

jquery的.offset()獲取相對於視口左上角的偏移,返回.offset().left和.offset().top, 算上自己的margin-left,,還可以設置.offset({left:,top:});這個很有用,比如編寫日期控件時,append到body上,然后就可以根據input的.offset()和高度設置日期控件的.offset(),最終這些值自動會被換算為position為relative(相對於body)的top和left。

jquery的.offset()與js的obj.offsetLeft和.obj.offsetTop一樣,只是這個不能賦值。

2、.outerHeight()、.innerHeight()和.height()

jquery的.outerHeight()=border+padding+height,等同於js的.offsetHeight(.offsetWidth同理)

.outerHeight(true)=margin+border+padding+height

.innerHeight()=padding+height

.height()設置和獲取高度

3、.scrollTop和.scrollHeight

.scrollTop:已經滾動過的高度;
.scrollHeight:整個滾動的高度,從開始到滾動結束滾動過的高度,包括滾動元素自身的高度。

用圖來解釋:如下圖,contentContainer為父元素,content為它的子元素,由於它的高度設置得比父元素高度高,所以父元素出現了滾動條。

假設現在滑動條已划過了一段距離,

則contentContainer的scrollTop為a,scrollHeight為b。

4、監聽整個網頁的滾動事件:

測試ie11、chorme、firefox,發現body上不支持監聽整個網頁的滾動事件scroll,window上都支持:window.onscroll=function(){};

5、獲取/設置網頁已滾動的高度:

 chrome

document.documentElement.scrollTop無效為0,

document.body.scrollTop有效與$('body').scrollTop()+','+$(document).scrollTop()等值

 safari與chrome表現相同  
 ie11(包括其模擬的IE10-7)

document.documentElement.scrollTop有效與$(document).scrollTop()等值,

document.body.scrollTop無效為0,$('body').scrollTop()無效為0

 firefox

document.documentElement.scrollTop有效與$(document).scrollTop()等值,

document.body.scrollTop無效為0,$('body').scrollTop()無效為0

 

所以獲取網頁已滾動的高度時:Math.max(document.documentElement.scrollTop,document.body.scrollTop)或$(document).scrollTop()
jquery和js的scrollTop都可以賦值
所以如果要設置‘返回頂部’的效果應該:

$('#totop').click(function(){
    document.body.scrollTop?document.body.scrollTop=0:document.documentElement.scrollTop=0;
    //或$(document).scrollTop(0);
})

另外測試同一個頁面,用鼠標滾輪把頁面滾動到底,ie11和chrome都只觸發了兩次,大概是scrollTop從166到230,而firefox則觸發了15次,看來ie11和chrome對觸發滾動事件做了優化。可以手動添加判斷兩次滾動間隔超過多少px才允許運行onscroll函數:

var stop=Math.max(document.documentElement.scrollTop,document.body.scrollTop);
window.onscroll=function(){
    if(Math.max(document.documentElement.scrollTop,document.body.scrollTop)-stop>100)
    {//do something}
}

6、獲取body視口高度:

有<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">時:

 chrome

document.documentElement.clientHeight有效,window.innerHeigh有效,

document.body.clientHeight無效與$('body').height()等值

 ie11(包括其模擬的IE10-9)

document.documentElement.clientHeight有效,window.innerHeigh有效,

document.body.clientHeight無效與$('body').height()等值, 

 用ie11模擬ie8、ie7 window.innerHeight為undefined,其他相同
 firefox

document.documentElement.clientHeight有效,window.innerHeigh有效,

document.body.clientHeight無效與$('body').height()等值

無<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">時:
chrome:document.documentElement.clientHeight無效與$('body').outerHeight(true)等值,window.innerHeigh有效,document.body.clientHeight有效,即使是有<!DOCTYPE>也是如此。
ie11:document.documentElement.clientHeight有效,document.body.clientHeight有效(ie7,8,9:無效與$('body').outerHeight(true)等值),window.innerHeigh有效,(用ie11模擬ie8、ie7時,window.innerHeight為undefined),即使是有<!DOCTYPE>也是如此。

所以在保證有完整<!DOCTYPE...聲明的前提下,獲取body的視口高度為:document.documentElement.clientHeight;

7、判斷div的滾動條滾到底部

只要判斷這個div已滾動的距離scrollTop+自己本身的高度offsetHeight>這個div的scrollHeight就表示滾動到底了。
如:一個id='contentContainer'的div里面包含一個高度查過自己 id='content'的子div。

則只要

document.getElementById('contentContainer').onscroll=function(){
    if(this.scrollTop+this.offsetHeight>=this.scrollHeight){
       $(this).append('bottom');
        //不要用==因為很多瀏覽器並不是每滾動1px就觸發scroll事件的
    }
}    

8、判斷body的滾動條滾到底部:
獲取頁面的scrollHeight:document.documentElement.scrollHeight在各瀏覽器中表現一致。
監聽頁面滾動條滾到底部: 

window.onscroll=function(){    
    var scrolltop=Math.max(document.documentElement.scrollTop,document.body.scrollTop);     
    if(scrolltop+document.documentElement.clientHeight>=document.documentElement.scrollHeight)
        alert( 'nowbottom' );
};

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM