JavaScript——PC端網頁特效(包括:元素偏移量offset系列、元素可視區client系列、元素滾動scroll系列、動畫函數封裝等)

元素偏移量offset系列

  • offset系列相關屬性可以動態的得到該元素的位置(偏移)、大小等。

    1.可以獲得元素距離帶有定位父元素等位置。

    2.可以獲得元素自身的大小(寬度和高度)。

注意:返回的數值都不帶單位。

  • offset系列常用屬性:
offset系列屬性 說明
element.offsetParent 返回作爲該元素帶有定位的父級元素
如果父級都沒有定位則返回body
element.offsetTop 返回元素相對帶有定位父元素上方的偏移
如果沒有父級元素或者父級元素沒有定位,則以body爲準
element.offsetLeft 返回元素相對帶有定位父元素左邊框的偏移
如果沒有父級元素或者父級元素沒有定位,則以body爲準
element.offsetWidth 返回自身包括padding、邊框、內容區的寬度,返回數值不帶單位
element.offsetHeight 返回自身包括padding、邊框、內容區的高度,返回數值不帶單位

注意:
offsetParent和parentNode的區別:
1.offsetParent只返回帶有定位的父級元素,如果沒有,則返回body。
2.parentNode返回的是最近一級的父級元素,不管父級元素也沒有定位。

  • offset和style的區別:
offset style
offset可以得到任意樣式表中的樣式值 style只能得到行內樣式表中的樣式值
offset系列獲得的數值是沒有單位的 style獲得的是帶有單位的字符串
offsetWidth包含padding+border+width style.width獲得不包含padding和border的值
offsetWidth等屬性是隻讀屬性,只能獲取不能賦值 style.width等屬性是可讀屬性,可以獲取也可以賦值
獲取元素大小位置,用offset更合適 更改元素的值,用style更合適

元素可視區client系列

  • client系列的相關屬性可以獲取元素可視區的相關信息,簡單來收,通過client系列的相關屬性可以動態的得到該元素的邊框大小、元素大小等。
client系列屬性 說明
element.clientTop 返回元素上邊框的大小
element.clientLeft 返回元素左邊框的大小
element.clientWidth 返回自身包括padding、內容區的寬度,不含邊框,返回數值不帶單位
element.clientHeight 返回自身包括padding、內容區的高度,不含邊框,返回數值不帶單位

元素滾動scroll系列

  • scroll系列的相關屬性可以動態的得到該元素的大小、滾動距離等。
scroll系列 說明
element.scrollTop 返回被捲去的上側距離,返回數值不帶單位(包含上邊框大小)
element.scrollLeft 返回被捲去的左側距離,返回數值不帶單位(包含左邊框大小)
element.scrollWidth 返回自身實際的寬度,不含邊框,返回數值不帶單位
element.scrollHeight 返回自身實際的高度,不含邊框,返回數值不帶單位
  • scrollWidth和clientWidth最大的區別就是:如果盒子內容溢出或出現滾動條,則scrollWidth是指盒子內容的寬度;而clientWidth還是可視區的寬度。如果沒有內容沒有益處,則它們兩個是相同的。(scrollHeoght和clientHeight同理)

  • 拓展:

    1.頁面被捲去的頭部,可以通過window.pageYOffset獲得;而頁面被捲去的左側,則可以通過window.pageXOffset獲得。注意:元素被捲去的頭部,使用的是element.scrollTop。

    2.頁面被捲去的頭部是有兼容性問題的,因此被捲去的頭部通常有如下幾種寫法:

    (1)聲明瞭DTD(即< !DOCTYPE html >),使用document.documentElement.scrollTop

    (2)未聲明DTD(即< !DOCTYPE html >),使用document.body.scrollTop

    (3)新方法window.pageYOffset和window.pageXOffset,IE0以後才支持

    function getScroll(){
      return {
        left: window.pageXOffset || document.docuemntElement.scrollLeft || document.body.scrollLeft || 0,
        top: window.pageYOffset || document.documntElement.scrollTop || document.body.scrollTop || 0
      };
    }
    //使用的時候,採取以下格式:
    getScroll().left
    

動畫函數封裝

1.動畫實現原理

  • 核心原理:通過定時器setInterval()不斷移動盒子位置。

  • 實現步驟如下:

    1.獲得盒子當前位置。

    2.讓盒子在當前位置加上1個移動距離。

    3.利用定時器不斷重複這個操作。

    4.加一個結束定時器的條件。

    5.注意此元素需要添加定位,才能使用element.style.left。

2.動畫函數簡單封裝

  • 動畫函數封裝需要傳遞2個參數,分別是動畫對象和移動到的距離。
function animate(obj, target){
  var timer = setInterval(function(){
    if(obj.offsetLeft >= target){
      clearInterval(timer);
    }
    obj.style.left = obj.offsetLeft + 1 + 'px';
  },25);
}
  • 如果多個元素都使用這個動畫函數,每次都要把var聲明定時器,並且都會在內存中開闢空間,導致浪費內存。
  • 如果多個元素都使用這個動畫函數,而timer這個變量名都一樣,可能會造成歧義。
//優化結果1:
function animate(obj, target){	//obj這個傳過來的元素是一個對象
  obj.timer = setInterval(function(){
    if(obj.offsetLeft >= target){
      clearInterval(obj.timer);
    }
    obj.style.left = obj.offsetLeft + 1 + 'px';
  },25);
}
  • 如果給一個加了動畫函數的元素綁定一個按鈕,只有點擊這個按鈕,元素纔會運動起來。當我們不斷點擊這個按鈕,這個元素的速度會越來越快。(因爲開啓了太多的定時器)
//優化結果2:
function animate(obj, target){	//obj這個傳過來的元素是一個對象
  clearInterval(obj.timer);
  obj.timer = setInterval(function(){
    if(obj.offsetLeft >= target){
      clearInterval(obj.timer);
    }
    obj.style.left = obj.offsetLeft + 1 + 'px';
  },25);
}
  • 緩動效果原理:緩動動畫就是讓元素運動速度有所變化,最常見的是讓速度慢慢停下來。

    步驟:

    1.讓盒子每次移動的距離慢慢變小,速度就會慢慢落下來。

    2.核心算法:”(目標值 - 現在的位置) / 10 ”作爲每次移動的距離步長。

    3.停止的條件是:讓當前盒子位置等於目標位置就停止定時器。

  • 緩動動畫基本代碼實現:

function animate(obj, target){	//obj這個傳過來的元素是一個對象  
  clearInterval(obj.timer);
  obj.timer = setInterval(function(){
    var step = Math.ceil((target - obj.offsetLeft) / 10);		
    //計算結果是正數,需要通過Math.ceil()方法,使移動距離向上取整,才能使元素移動的結果是整數,
    //而不是小數。(比如,想讓元素移動到500px,如果不加這個方法,那麼最後會移動到496.4px就停下來了)
    if(obj.offsetLeft == target){
      clearInterval(obj.timer);
    }
    obj.style.left = obj.offsetLeft + step + 'px';
  },15);
}
//勻速動畫就是盒子當前的位置+固定值(10)
//緩動動畫就是盒子當前的位置+變化的值(目標值 - 現在的位置) / 10 
  • 緩動動畫在多個目標住之間移動:
function animate(obj, target){	//obj這個傳過來的元素是一個對象  
  clearInterval(obj.timer);
  obj.timer = setInterval(function(){
    //var step = Math.ceil((target - obj.offsetLeft) / 10);		
    //計算結果是正數,需要通過Math.ceil()方法,使移動距離向上取整,才能使元素移動的結果是整數,
    //而不是小數。(比如,想讓元素移動到500px,如果不加這個方法,那麼最後會移動到496.4px就停下來了)
    //計算結果是負數,則往下取整。
    var step = (target - obj.offsetLeft) / 10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    if(obj.offsetLeft == target){
      clearInterval(obj.timer);
    }
    obj.style.left = obj.offsetLeft + step + 'px';
  },15);
}
  • 動畫函數添加回調函數:

    回調函數原理:函數可以作爲一個參數。將這個函數作爲參數傳到另一個函數裏面,當那個函數執行完之後,再執行傳進去的這個函數,這個過程就叫做回調。

function animate(obj, target,callback){	//obj這個傳過來的元素是一個對象  
  clearInterval(obj.timer);
  obj.timer = setInterval(function(){
    //var step = Math.ceil((target - obj.offsetLeft) / 10);		
    //計算結果是正數,需要通過Math.ceil()方法,使移動距離向上取整,才能使元素移動的結果是整數,
    //而不是小數。(比如,想讓元素移動到500px,如果不加這個方法,那麼最後會移動到496.4px就停下來了)
    //計算結果是負數,則往下取整。
    var step = (target - obj.offsetLeft) / 10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    if(obj.offsetLeft == target){
      clearInterval(obj.timer);
      //回調函數寫到定時器裏面
      if(callback){
        //調用函數
        callback();
      }
      //或者可以寫成:callback && callback();  ——短路運算
    }
    obj.style.left = obj.offsetLeft + step + 'px';
  },15);
}
  • 動畫函數的使用:一般都是把這個動畫函數單獨封裝到一個JS文件中,使用的時候引用這個文件即可。

  • 節流閥的目的:當上一個函數動畫內容執行完畢,再去執行下一個函數動畫,讓事件無法連續觸發。

    核心思路:利用回調函數,添加一個變量來控制,鎖住函數和解鎖函數。

    開始設置一個變量var flag = true;
    if(flag){
    	flag = false;			//關閉水龍頭
    	do something			
    }
    利用回調函數,在動畫執行完畢後,通過flag = true 打開水龍頭
    

課外點

  • mouseenter和mouseover的區別:mouseover鼠標經過自身盒子會觸發,經過子盒子也會觸發;而mouseenter只有經過自身盒子纔會觸發。(原因是:mouseenter和mouseleave不會冒泡)

微信公衆號也會定期更新,覺得文章寫得還可以的,可以加個關注!點個贊!謝謝!

在這裏插入圖片描述

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