原文連結
本文檔介紹如何在 JavaScript 中使用節流閥來提高動畫效能,並應用節流閥來解決滾動動畫不穩定的問題。它還比較了油門在應用之前和之後的差異。
節流是一種限制函數在「特定時間間隔」內「最多呼叫一次」的技術。換句話說,即使某個事件在短時間內發生多次,但函數在節流閥設定的時間間隔內只會執行一次。例如,如果某個函數的節流為 100ms,即使事件在 1 秒內發生 10 次,則函數最多也會執行 10 次(間隔 100ms)。
油門可以在以下情況下使用:
嘗試根據滾輪事件實現平滑的滾動動畫,但在應用油門之前,動畫出現斷斷續續的情況。
原因:這是因為wheel事件發生頻率非常高,導致window.scrollBy函數被過度調用,導致瀏覽器無法處理所有請求。
useEffect(() => { const container = scrollContainerRef.current; if (!container) return; const handleWheel = (event) => { event.preventDefault(); window.scrollBy({ left: event.deltaY, behavior: 'smooth' }); }; container.addEventListener('wheel', handleWheel); return () => { container.removeEventListener('wheel', handleWheel); }; }, []);
在這段程式碼中,每次發生滾輪事件時都會執行handleWheel函數。函數使用事件的 deltaY 值計算滾動量,並透過呼叫 window.scrollBy 函數進行滾動。問題在於,wheel 事件會在很短的時間內發生多次,導致 window.scrollBy 被過度調用,導致動畫斷斷續續。
useEffect(() => { const container = scrollContainerRef.current; if (!container) return; const handleWheel = (event) => { event.preventDefault(); window.scrollBy({ left: event.deltaY, behavior: 'smooth' }); }; container.addEventListener('wheel', handleWheel); return () => { container.removeEventListener('wheel', handleWheel); }; }, []);
在節流程式碼中,throttleTimer 變數用於管理函數執行。過程的工作原理如下:
setTimeout 的初始延遲
setTimeout用來實現限流機制。 setTimeout 在指定的延遲(本例為16毫秒)後執行回呼函數。因此,當第一個滾輪事件發生時,window.scrollBy 在 16ms 延遲後被呼叫。這種最初的延遲可能會導致感覺缺乏即時反應能力,可能被解釋為口吃,特別是在車輪快速移動時。 (未來將探討進一步的改進...)
以上是[翻譯] 在 JavaScript 中使用 Throttle 實作動畫的詳細內容。更多資訊請關注PHP中文網其他相關文章!