欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用JS實(shí)現(xiàn)scroll自定義滾動效果詳解

 更新時間:2017年10月17日 11:35:14   作者:夜里的太陽  
這篇文章主要給大家介紹了關(guān)于利用JS如何實(shí)現(xiàn)scroll自定義滾動效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。

前言

最近在公司開發(fā)項(xiàng)目的時候,原生滾動條中有些東西沒辦法自定義去精細(xì)的控制,于是開發(fā)一個類似于better-scroll一樣的瀏覽器滾動監(jiān)聽的JS實(shí)現(xiàn),下面我們就來探究一下自定義滾動需要考慮哪些東西,經(jīng)過哪些過程。話不多說了,來一起看看詳細(xì)的介紹吧。

選擇滾動監(jiān)聽的事件

因?yàn)槭亲远x手機(jī)端的滾動事件,那我選擇的是監(jiān)聽手機(jī)端的三個touch事件來實(shí)現(xiàn)監(jiān)聽,并實(shí)現(xiàn)了兩種滾動效果,一種是通過-webkit-transform,一種是通過top屬性。兩種實(shí)現(xiàn)對于滾動的基本效果夠能達(dá)到,可是top的不適合滾動中還存在滾動,可是能解決滾動中存在postion:fixed屬性的問題;而transform可以實(shí)現(xiàn)滾動中有滾動,可是又不能解決postion:fixed的問題,所以,最后選擇性考慮使用哪一種實(shí)現(xiàn)方式,用法一樣。

主要的實(shí)現(xiàn)業(yè)務(wù)邏輯

handleTouchMove(event){
 event.preventDefault();
 this.currentY = event.targetTouches[0].screenY;
 this.currentTime = new Date().getTime();
 // 二次及以上次數(shù)滾動(間歇性滾動)時間和路程重置計算,0.05是間歇性滾動的停頓位移和時間比
 if (Math.abs(this.currentY - this.lastY) / Math.abs(this.currentTime - this.lastTime) < 0.05) {
  this.startTime = new Date().getTime();
  this.resetY = this.currentY;
 }
 this.distance = this.currentY - this.startY;
 let temDis = this.distance + this.oldY;
 /*設(shè)置移動最小值*/
 temDis = temDis > this.minValue ? temDis * 1 / 3 : temDis;
 /*設(shè)置移動最大值*/
 temDis = temDis < -this.maxValue ? -this.maxValue + (temDis + this.maxValue) * 1 / 3 : temDis;
 this.$el.style["top"] = temDis + 'px';
 this.lastY = this.currentY;
 this.lastTime = this.currentTime;
 this.dispatchEvent();
 this.scrollFunc(event);
},

代碼解讀:這是監(jiān)聽touchmove事件的回調(diào),其中主要計算出目標(biāo)節(jié)點(diǎn)this.$el的top或者-webkit-transform中translateY的值,而計算的參考主要以事件節(jié)點(diǎn)的screenY的垂直移動距離為參考,當(dāng)然其中還要判斷一下最大值和最小值,為了保證移動可以的超出最大值小值一定的距離所以加了一個1/3的移動計算。這里可能主要到了有一個間歇性滾動的判斷和計算,主要是服務(wù)于慣性滾動的,目的是讓慣性滾動的值更加精確。

handleTouchEnd(event){
 /*點(diǎn)透事件允許通過*/
 if (!this.distance) return;
 event.preventDefault();
 let temDis = this.distance + this.oldY;
 /*計算緩動值*/
 temDis = this.computeSlowMotion(temDis);
 /*設(shè)置最小值*/
 temDis = temDis > this.minValue ? this.minValue : temDis;
 /*設(shè)置最大值*/
 temDis = temDis < -this.maxValue ? -this.maxValue : temDis;
 this.$el.style["transitionDuration"] = '500ms';
 this.$el.style["transitionTimingFunction"] = 'ease-out';
 /*確定最終的滾動位置*/
 setTimeout(()=> {
  this.$el.style["top"] = temDis + 'px';
 }, 0);
 // 判斷使用哪一種監(jiān)聽事件
 if (this.slowMotionFlag) {
  this.dispatchEventLoop();
 } else {
  this.dispatchEvent();
 }
 this.$el.addEventListener('transitionend', ()=> {
  window.cancelAnimationFrame(this.timer);
 });
 this.scrollFunc(event);
}

代碼解讀:這是touchend事件監(jiān)聽的回調(diào),其中這里要判斷是否要攔截click和tap事件,并且這里還要計算慣性緩動值,設(shè)置最終的最大最小值,以及設(shè)置動畫效果和緩動效果。下面來談一下滾性滾動的計算:

// 計算慣性滾動值
computeSlowMotion(temDis){
 var duration = new Date().getTime() - this.startTime;
 // 300毫秒是判斷間隔的最佳時間
 var resetDistance = this.currentY - this.resetY;
 if (duration < 300 && Math.abs(resetDistance) > 10) {
  var speed = Math.abs(resetDistance) / duration,
   destination;
  // 末速度為0 距離等于初速度的平方除以2倍加速度
  destination = (speed * speed) / (2 * this.deceleration) * (resetDistance < 0 ? -1 : 1);
  this.slowMotionFlag = true;
  return temDis += destination;
 } else {
  this.slowMotionFlag = false;
  return temDis;
 }
},

代碼解讀:滾性滾動的算法主要是根據(jù)一個路程和時間計算出初速度,以及原生滾動的加速度的大于值0.006來計算滾動的總位移。這里主要還要判斷一下一個300ms的經(jīng)驗(yàn)值。

總結(jié)

大概的流程和思考就是這樣了,后續(xù)還會增加更多的功能進(jìn)行擴(kuò)展

附上git地址:https://github.com/yejiaming/scroll

本地下載:http://xiazai.jb51.net/201710/yuanma/js-scroll-custom(jb51.net).rar

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • JavaScript函數(shù)防抖與函數(shù)節(jié)流的定義及使用詳解

    JavaScript函數(shù)防抖與函數(shù)節(jié)流的定義及使用詳解

    這篇文章主要為大家詳細(xì)介紹一下JavaScript中函數(shù)防抖與函數(shù)節(jié)流的定義及使用,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)JS有一定幫助,需要的可以參考一下
    2022-08-08
  • ES6新特性五:Set與Map的數(shù)據(jù)結(jié)構(gòu)實(shí)例分析

    ES6新特性五:Set與Map的數(shù)據(jù)結(jié)構(gòu)實(shí)例分析

    這篇文章主要介紹了ES6新特性五之Set與Map的數(shù)據(jù)結(jié)構(gòu),結(jié)合實(shí)例形式分析了ES6中Set與Map的功能、定義、屬性、結(jié)構(gòu)與相關(guān)使用技巧,需要的朋友可以參考下
    2017-04-04
  • 一文詳解如何跳出map或者foreach循環(huán)

    一文詳解如何跳出map或者foreach循環(huán)

    javascript中的遍歷方法有很多,今天主要總結(jié)一下這些遍歷方法如何跳出循環(huán),這篇文章主要給大家介紹了關(guān)于如何跳出map或者foreach循環(huán)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 分享一些不常見卻很實(shí)用的JS技巧

    分享一些不常見卻很實(shí)用的JS技巧

    有些代碼,需要的時候能寫的出來,但是也需要時間,如果有的東西長時間不接觸,再次看的時候也會感覺很陌生,這篇文章主要給大家介紹了一些不常見卻很實(shí)用的JS技巧,既可以作為一個知識的積累,又可以作為閑暇時打發(fā)時間寫寫代碼的記錄,需要的朋友可以參考下
    2021-11-11
  • javascript獲取select值的方法完整實(shí)例

    javascript獲取select值的方法完整實(shí)例

    這篇文章主要介紹了javascript獲取select值的方法,結(jié)合完整實(shí)例形式分析了javascript動態(tài)遍歷與操作頁面元素相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-06-06
  • 理解JavaScript設(shè)計模式中的建造者模式

    理解JavaScript設(shè)計模式中的建造者模式

    這篇文章主要介紹了理解JavaScript設(shè)計模式中的建造者模式,文章基于JavaScript的相關(guān)資料展開箱子內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • 深入理解選擇框腳本[推薦]

    深入理解選擇框腳本[推薦]

    選擇框是通過<select>和<option>元素創(chuàng)建的,又稱為下拉列表框。為了方便與這個控件交互,除了所有表單字段共有的屬性和方法外,javascript還提供了一些屬性和方法。本文將詳細(xì)介紹選擇框腳本
    2016-12-12
  • 微信小程序?qū)崿F(xiàn)多列選擇器

    微信小程序?qū)崿F(xiàn)多列選擇器

    這篇文章主要為大家詳細(xì)介紹了微信小程序?qū)崿F(xiàn)多列選擇器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • JS 實(shí)現(xiàn)導(dǎo)航欄懸停效果

    JS 實(shí)現(xiàn)導(dǎo)航欄懸停效果

    使用js實(shí)現(xiàn)的導(dǎo)航欄懸停效果在IE上,滾動滾動條或者鼠標(biāo)滾輪的時候,導(dǎo)航欄會抖動;而在Chrome和FF上有沒有任何問題
    2013-09-09
  • 詳解JS如何實(shí)現(xiàn)文字溢出時用省略號...顯示

    詳解JS如何實(shí)現(xiàn)文字溢出時用省略號...顯示

    這篇文章主要為大家詳細(xì)介紹了JavaScript如何實(shí)現(xiàn)當(dāng)文本內(nèi)容過長時,中間顯示省略號...,兩端正常展示,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02

最新評論