jQuery 的 Div 標籤滾動條屬性及判斷垂直滾動條是否到達底部

關於 jQuery 的 Div 標籤的滾動條的概念,沒有幾個人能夠完全、正確搞明白的。

    我知道很多人不同意我的觀點。但是如果去百度上搜素,與 jQuery 滾動條有關的信息,都是關於滾動條外觀和滾動條插件的。我最近在製作一個滾動條相關的頁面效果,去 CSDN 論壇裏提問,得到了一段代碼,還是錯誤的。

    jQuery 裏和滾動條有關的概念很多,但是有三個屬性和滾動條的拖動有關,就是:scrollTop、scrollLeft、scrollHeight。其中 scrollHeight 屬性,互聯網上幾乎搜素不到關於它的應用技巧,而我正好需要用到它。

    我們現在只探討和垂直滾動有關的 scrollTop、scrollHeight 屬性。

    一、滾動條有關屬性的正確理解:

    假設有以下Html代碼:

    <div id="div1" style="overflow-y:auto; overflow-x:hidden; height:500px;">
      <div style="height:750px;">
      </div>
    </div>

    由於內部的div標籤高度比外部的長,並且外部的div允許自動出現垂直滾動條,所以用瀏覽器打開後,可以看到垂直滾動條。滾動條向下拖動一段距離,看到的頁面效果如下(右部的a、b是我抓圖後,用PS標出來的):

jQuery 的 Div 標籤滾動條屬性及判斷垂直滾動條是否到達底部

    那麼,這裏的外部div 的scrollTop、scrollHeight 屬性到底是什麼呢?
    有人說,scrollTop等於圖中標出的a。scrollHeight 等於外部div的高度500px。其實,都不對。
    其實,圖中標出的a、b,對我們編程寫js代碼沒有任何具體意義,它僅僅具有象徵意義。
    實際上,在js代碼裏,滾動條是被抽象爲一個“點”來對待的。scrollHeight其實不是“滾動條的高度”(b),而是表示滾動條需要滾動的高度,即內部div的高度750px。而scrollTop表示滾動條(一個點)當前的位置在750px裏佔了多少,不是圖中標出的a。
這時,我們很歎服Windows的設計者,滾動條設計的如此形象美妙,欺騙了多少頭腦簡單的鼠標操作員。a和b的距離分別標識滾動條滾動了和需要滾動的距離,它們之間分別有一個對應的關係,但這些不是我們這些開發應用程序的程序員考慮的,是設計操作系統GUI圖形接口的程序員考慮的。

    二、判斷垂直滾動條是否到達底部
    廓清了以上的概念,編碼其實就比較簡單了, 以下是示例代碼:
    <!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">
      <title>下拉滾動條滾到底部了嗎?</title>
      <script language="javascript" src="jquery-1.4.2.min.js" mce_src="jquery-1.4.2.min.js"></script>
      <script language="javascript">
      $(document).ready(function (){
        var nScrollHight = 0; //滾動距離總長(注意不是滾動條的長度)
        var nScrollTop = 0;   //滾動到的當前位置
        var nDivHight = $("#div1").height();

        $("#div1").scroll(function(){
          nScrollHight = $(this)[0].scrollHeight;
          nScrollTop = $(this)[0].scrollTop;
          if(nScrollTop + nDivHight >= nScrollHight)
            alert("滾動條到底部了");
          });
      });
      </script>
    <body>
    <div id="div1" style="overflow-y:auto; overflow-x:hidden; height:500px;">
      <div style="background-color:#ccc; height:750px;">IE 和 FF 下測試通過</div>
    </div>
    </body>
    </html>
    代碼解說:
    內部div高度爲750,外部div高度爲500,所以垂直滾動條需要滾動750-500=250的距離,就會到達底部,參見語句nScrollTop + nDivHight >= nScrollHight。
    程序中,在外部div的scroll(滾動)事件中偵測和執行if判斷語句,是非常消耗CPU資源的。用鼠標拖拉滾動條,只要有一個像素的變動就會觸發該事件。但點擊滾動條兩頭的箭頭,事件觸發的頻率會低得多。所以滾動條的scroll事件要謹慎使用。
    本示例判斷的是沒有水平滾動條的情況,在有水平滾動條時,情況會有細小的變化,所以nScrollTop + nDivHight >= nScrollHight語句中,需要用“>=”比較運算符,而沒有水平滾動條的時候,等號“=”就足夠了。大家可以實際測試一下。還可以判斷水平滾動條是否滾動到頭了。

    三、題外話
    判斷垂直滾動條是否拖動到頭了,是爲了實現滾動條拖動時實時動態的從Web服務器獲取內容的效果,這個我在文章《分頁加載數據效果的新穎改進》中提到過,網址:
    http://blog.why100000.com/?p=823
    有了以上的前端jQuery代碼實現,再結合Ajax技術,是很容易達到目的的。測試代碼地址:
    http://www.why100000.com/test/scrolldown/scrolldown.htm

    作者:張慶(網眼) 西安 PHP 教育培訓中心 2010-7-9
    來自“網眼視界”:http://blog.why100000.com
    作者微博:http://t.qq.com/zhangking
    “十萬個爲什麼”電腦學習網:http://www.why100000.com

 

文章轉自:http://blog.why100000.com/?p=843

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章