監聽頁面滾動相關知識點

監聽事件

代碼

function pageChange () {
    // ... 頁面滾動時,須要作的事情
}
window.addEventListener("scroll" , pageChange, false);

知識點

一、使用 window.addEventListenerdocument.addEventListener 來處理頁面上的事件,區別僅僅在於:不一樣事件模型上,處理的順序不同。瀏覽器

  • 捕獲,window 先於 document
  • 冒泡,document 先於 window

二、參數
addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false)函數

1) type: String 事件的類型性能

2) listener: Function 偵聽到事件後處理事件的函數動畫

3) useCapture: Boolean(default = false)
這裏牽扯到「事件流」的概念。
偵聽器在偵聽時有三個階段:捕獲階段、目標階段和冒泡階段。
順序 爲:捕獲階段(根節點到子節點檢查是否調用了監聽函數)→code

目標階段(目標自己)→
            冒泡階段(目標自己到根節點)。

此處的參數肯定偵聽器是運行於捕獲階段、 目標階段仍是冒泡階段。
若是將 useCapture 設置爲 true,則偵聽器只在捕獲階段處理事件,而不在目標或冒泡階段處理事件。 若是useCapture 爲 false,則偵聽器只在目標或冒泡階段處理事件。 事件

要在全部三個階段都偵聽事件,請調用兩次 addEventListener,一次將 useCapture 設置爲 true,第二次再將useCapture 設置爲 false。element

4) priority: int (default = 0)
事件偵聽器的優先級。
優先級由一個帶符號的 32 位整數指定。
數字越大,優先級越高。
優先級爲 n 的全部偵聽器會在優先級爲 n -1 的偵聽器以前獲得處理。 若是兩個或更多個偵聽器共享相同的優先級,則按照它們的添加順序進行處理。
默認優先級爲 0。rem

5) useWeakReference:Boolean (default = false)   
肯定對偵聽器的引用是強引用,仍是弱引用。
強引用(默認值)可防止您的偵聽器被看成垃圾回收。 弱引用則沒有此做用。文檔

獲取頁面滾動高度

代碼

function getScrollTop() {
    return window.pageYOffset 
        || document.documentElement.scrollTop  
        || document.body.scrollTop  
        || 0;
}

瀏覽器兼容性

谷歌 火狐 IE 360 Microsoft Edge
window.pageYOffset Yes Yes Yes Yes Yes
document.documentElement.scrollTop Yes Yes Yes Yes No
document.body.scrollTop No No No No Yes

其中,pageYOffset 屬性返回文檔在窗口左上角垂直方向滾動的像素get

讓頁面滾動至指定位置

代碼

/* 滾動動畫
   s: 當前頁面滾動高度
   sTop: 指定位置滾動高度
 */
function tabAnimation(s, sTop) {
    var type = s < sTop ? true : false; // true 頁面上滑

    var timmer = requestAnimationFrame(function fn() {
        if (type) { s+=50 } 
        else { s-=50 }
        if((type && s > sTop) || (!type && s < sTop)) {
            // $el.scrollTop = sTop;
            window.scrollTo(0, sTop); 
        } else {
            // $el.scrollTop = s;
            window.scrollTo(0, s); 
          timmer = requestAnimationFrame(fn);
        }
    });
}

說明

window.requestAnimationFrame() 方法告訴瀏覽器您但願執行動畫並請求瀏覽器在下一次重繪以前調用指定的函數來更新動畫。該方法使用一個回調函數做爲參數,這個回調函數會在瀏覽器重繪以前調用。

當你須要更新屏幕畫面時就能夠調用此方法。在瀏覽器下次重繪前執行回調函數。回調的次數一般是每秒60次,但大多數瀏覽器一般匹配 W3C 所建議的刷新頻率。

在大多數瀏覽器裏,當運行在後臺標籤頁或者隱藏的<iframe> 裏時,requestAnimationFrame() 會暫停調用以提高性能和電池壽命。

原生方法實現 addClass、removeClass 和 hasClass

function hasClass( elements, cName ) { 
  return !!elements.className.match( new RegExp( "(\\s|^)" + cName + "(\\s|$)") )
}
function addClass( elements, cName ) { 
  if( !hasClass( elements,cName ) ) { 
    elements.className += " " + cName; 
  }
}
function removeClass( elements, cName ){ 
  if( hasClass( elements,cName ) ){ 
    elements.className = elements.className.replace( new RegExp( "(\\s|^)" + cName + "(\\s|$)" ), " " );
  }
}
相關文章
相關標籤/搜索