您好,登錄后才能下訂單哦!
小編給大家分享一下如何利用JS實現scroll自定義滾動效果,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1、js屬于一種解釋性腳本語言;2、在絕大多數瀏覽器的支持下,js可以在多種平臺下運行,擁有著跨平臺特性;3、js屬于一種弱類型腳本語言,對使用的數據類型未做出嚴格的要求,能夠進行類型轉換,簡單又容易上手;4、js語言安全性高,只能通過瀏覽器實現信息瀏覽或動態交互,從而有效地防止數據的丟失;5、基于對象的腳本語言,js不僅可以創建對象,也能使用現有的對象。
選擇滾動監聽的事件
因為是自定義手機端的滾動事件,那我選擇的是監聽手機端的三個touch事件來實現監聽,并實現了兩種滾動效果,一種是通過-webkit-transform,一種是通過top屬性。兩種實現對于滾動的基本效果夠能達到,可是top的不適合滾動中還存在滾動,可是能解決滾動中存在postion:fixed
屬性的問題;而transform可以實現滾動中有滾動,可是又不能解決postion:fixed
的問題,所以,最后選擇性考慮使用哪一種實現方式,用法一樣。
主要的實現業務邏輯
handleTouchMove(event){ event.preventDefault(); this.currentY = event.targetTouches[0].screenY; this.currentTime = new Date().getTime(); // 二次及以上次數滾動(間歇性滾動)時間和路程重置計算,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; /*設置移動最小值*/ temDis = temDis > this.minValue ? temDis * 1 / 3 : temDis; /*設置移動最大值*/ 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); },
代碼解讀:這是監聽touchmove事件的回調,其中主要計算出目標節點this.$el
的top或者-webkit-transform中translateY的值,而計算的參考主要以事件節點的screenY的垂直移動距離為參考,當然其中還要判斷一下最大值和最小值,為了保證移動可以的超出最大值小值一定的距離所以加了一個1/3的移動計算。這里可能主要到了有一個間歇性滾動的判斷和計算,主要是服務于慣性滾動的,目的是讓慣性滾動的值更加精確。
handleTouchEnd(event){ /*點透事件允許通過*/ if (!this.distance) return; event.preventDefault(); let temDis = this.distance + this.oldY; /*計算緩動值*/ temDis = this.computeSlowMotion(temDis); /*設置最小值*/ temDis = temDis > this.minValue ? this.minValue : temDis; /*設置最大值*/ 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); // 判斷使用哪一種監聽事件 if (this.slowMotionFlag) { this.dispatchEventLoop(); } else { this.dispatchEvent(); } this.$el.addEventListener('transitionend', ()=> { window.cancelAnimationFrame(this.timer); }); this.scrollFunc(event); }
代碼解讀:這是touchend事件監聽的回調,其中這里要判斷是否要攔截click和tap事件,并且這里還要計算慣性緩動值,設置最終的最大最小值,以及設置動畫效果和緩動效果。下面來談一下滾性滾動的計算:
// 計算慣性滾動值 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; } },
代碼解讀:滾性滾動的算法主要是根據一個路程和時間計算出初速度,以及原生滾動的加速度的大于值0.006來計算滾動的總位移。這里主要還要判斷一下一個300ms的經驗值。
以上是“如何利用JS實現scroll自定義滾動效果”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。