天天看點

讓DIV的滾動條自動滾動到最底部 總結

贈人玫瑰,手留餘香.人生最大的快樂不在于占有什麼而在于追求什麼的過程.

轉自:http://www.cnblogs.com/hnyei/archive/2011/09/20/2182199.html 

      http://hi.baidu.com/janry3412/item/96da3352cd709a3095eb058e

先是對一個DOM元素的三個屬性先了解。分别是:clientHeight、offsetHeight、scrollTop。說說個人了解。

clientHeight:這個元素的高度,占用整個空間的高度,是以,如果一個div有滾動條,那個這個高度則是不包括滾動條沒顯示出來的下面部分的内容。而隻是單純的DIV的高度。

offsetHeight:是指元素内容的高度。依照上面的,那這個高度呢就是DIV内部的高度,包括可見部分及以滾動條下面的不可見部分。

scrollTop:這個是什麼呢?他可以了解為滾動條可以滾動的長度。舉例,如果一個DIV高度是400px(即clientHeight為400),而裡面的内容是一個很長的清單,内容的高度是1000px(即offsetHeight為1000)。那麼,可見部分我們看到400px,1000px的内容中還有600px不可見。而這不可見的部分呢,正是我們通過拉動滾動條才能把這一部分顯示出來。你如果滾動條不拉動,此時scrollTop為0,如果你把滾動條拉到底,顯示出清單最下面的部分,此時,scrollTop為600。 是以scrollTop的取值區間為[0,  600]。 是以這個600可以了解為滾動條可以滾動的長度。

了解完上面的這個概念之後。要判斷是否滾動到底部就很好做了。

首先,我們拉動滾動條,從最上面拉到最下面,變化的是scrollTop的值,而這個值是有一個區間的。

這個區間是:  [0, (offsetHeight - clientHeight)]

即,滾動條拉動的整個過程的變化在 0 到 (offsetHeight -  clientHeight) 範圍之内。

1、判斷滾動條滾動到最底端: scrollTop == (offsetHeight -  clientHeight)

2、在滾動條距離底端50px以内: (offsetHeight - clientHeight) - scrollTop  <= 50 

3、在滾動條距離底端5%以内: scrollTop / (offsetHeight - clientHeight) >=  0.95

如上。

如果要實作類似QQ空間那種,拉到底部自動加載内容。隻要注冊個滾動條事件:

varscrollBottomTest =function(){

$("#contain").scroll(function(){

var$this =$(this),

viewH =$(this).height(),//可見高度

contentH =$(this).get(0).scrollHeight,//内容高度

scrollTop =$(this).scrollTop();//滾動高度

//if(contentH - viewH - scrollTop <= 100) { //到達底部100px時,加載新内容

if(scrollTop/(contentH -viewH)>=0.95){//到達底部100px時,加載新内容

// 這裡加載資料..

}

});

}

要制作一個線上聊天的程式,在做最後的修飾時,需要對獲得的資訊即時滾動以保證使用者總能看到最新消息。

聊天程式是基于AJAX設計的,沒有用架構,消息容器是一個DIV,是以問題就在于如何控制DIV的滾動條。

網上有資料介紹說通過設定scrollTop屬性來控制滾動條位置,具體可參見:

http://hi.baidu.com/chen1345789/blog/item/de727bfb45587b176d22eba1.html

但同樣的代碼拿到我這裡卻完全失效,又仔細查了下資料說XHTML标準下scrollTop的值恒為0,解決辦法是使用document.documentElement.scrollTop代替document.body.scrollTop,講了半天所解決的是整個頁面的滾動條。這個方法我是用不了了,因為不是架構結構,是以不可能用body的滾動條控制浏覽資訊。

網上關于這個問題的資料很少,連CSDN上也說沒有辦法。

不死心,後來查DHTML手冊得知DIV有個doScroll方法可以用來模拟滾動條點選,但很令人失望,到了我這裡又是完全失效,難道又不被XHTML支援?

最後終于被我找到三種控制DIV内容滾動的方法:

方法一:

使用錨标記要滾動到的位置,然後通過click方法模拟點選滾動到錨所在位置 

<script language="javascript1.2" type="text/javascript">

function onGetMessage(context) 

{

msg.innerHTML+=context;

msg_end.click(); 

</script>

<div style="width:500px;overflow:auto">

<div id="msg" style="overflow:hidden;width:480px;"></div>

<div><a id="msg_end" name="1" href="#1" target="_blank" rel="external nofollow" >&nbsp</a></div>

</div>

方法二:

利用DIV的scrollIntoView方法,将最底端滾動到可視位置 [list=1]<script

language="javascript1.2"

type="text/javascript">

function onGetMessage(context) 

{

msg.innerHTML+=context;

msg_end.scrollIntoView(); 

</script>

<div style="width:500px;overflow:auto">

<div id="msg" style="overflow:hidden;width:480px;"></div>

<div id="msg_end" style="height:0px; overflow:hidden"></div>

</div>

方法三:

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

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="content-type" content="text/html; charset=utf-8" />

<meta name="keywords" content="滾動條, scrollbar, 頁面底部, 聊天視窗, " />

<meta name="description" content="有些時候(如開發聊天程式),我們需要将将滾動條(scrollbar)保持在最底部,比如聊天視窗,最新發出和收到的資訊要顯示在最下方,如果要看到最下方的内容,就必須保證滾動條保持在最底部。" />

<title>将滾動條(scrollbar)保持在最底部的方法 - 滾動條, scrollbar, 頁面底部, 聊天視窗, </title>

</head>

<body>

<div id="example">

<h3 id="example_title">将滾動條(scrollbar)保持在最底部的方法</h3>

<div id="example_main">

<!--************************************* 執行個體代碼開始 *************************************-->

<script type="text/javascript">

function add()

{

var now = new Date();

var div = document.getElementById('scrolldIV');

div.innerHTML = div.innerHTML + 'time_' + now.getTime() + '<br />';

div.scrollTop = div.scrollHeight;

}

</script>

<span class="notice">請點選“插入一行”按鈕,插入最新資訊,當出現滾動條時,滾動條将自動保持在底部。</span><br />

<div id="scrolldIV" style="overflow:auto; height: 100px; width: 400px; border: 1px solid #999;">

</div>

<input type="button" value="插入一行" οnclick="add();">

<!--************************************* 執行個體代碼結束 *************************************-->

</div>

</div>

</body>

</html>

方法4:

這個比較複雜也比較靈活一點,就是利用DIV+JS+圖檔構造一個滾動條,當然了圖檔是怎麼好看怎麼用了。

主要部分就是外層的DIV加個overflow:hidden屬性,通過js代碼調整内層DIV的margin-left和margin-top來控制内容的滾動,由于上面兩種方法已經可以滿足需求,是以這種方法沒具體做深究,有興趣的可以試一下;