摘要:很多時候我們在上做動畫一般都是選擇滾動事件來觸發(fā)。而在移動端的瀏覽器或中,滾動事件的觸發(fā)頻率也是不同的。在中在視圖的滾動過程中,事件不會被觸發(fā)在滾動結(jié)束后,才會觸發(fā)和不受此影響。但是滾動觸發(fā)事件與滾動距離以及完成的時間有關(guān)。
很多時候我們在web上做動畫一般都是選擇滾動事件來觸發(fā)。因?yàn)閯赢嬓枰袛嗍欠裉幱谝暱趦?nèi),或者是否到達(dá)某個臨界點(diǎn)。而滾動在不同的瀏覽器中,不同操作系統(tǒng)中的實(shí)現(xiàn)都有不同。這些就是我們需要注意的坑~
滾動的觸發(fā)頻率在我們先入為主的思想中,我們總覺得滾動事件是每PX都會觸發(fā)。但是事實(shí)并非如此:
下面請看demo:
chrome 移動端滑動模擬,速度是比較慢速的滑動。
我們可以看到觸發(fā)的頻率并不是按像素的,在時間上,我們計(jì)算可得,間隔大致上是15ms-18ms。而這剛好是每秒60幀的頻率。
而在移動端的瀏覽器或webview中,滾動事件的觸發(fā)頻率也是不同的。
ios UIwebview (uc qq) 回調(diào)事件需要在滾動完成時觸發(fā)。
在 iOS UIWebViews中, 在視圖的滾動過程中,scroll 事件不會被觸發(fā);在滾動結(jié)束后,scroll 才會觸發(fā). Safari 和 WKWebViews不受此bug影響。--MDN events/scroll
Android chrome
在我們滾動的時候,可以看到觸發(fā)頻率比PC上的高。
但是滾動觸發(fā)事件與滾動距離以及完成的時間有關(guān)。有些瀏覽器還有慣性滾動的處理,所以并不能一概而論說觸發(fā)一定是每秒60幀的頻率
只是想說明,滾動事件的觸發(fā)頻率不是按照PX
element.scrollTop 屬性可以獲取或設(shè)置一個元素的內(nèi)容垂直滾動的像素數(shù)
document.body.scrollTopchrome不適用
document.documentElement.scrollTop chrome適用
推薦獲取滾動值 document.body.scrollTop + document.documentElement.scrollTop 因?yàn)閮烧咧挥?strong>一個生效
window.scrollY返回文檔在垂直方向已滾動的像素值。IE9不支持
滾動的模擬因?yàn)闈L動事件的兼容性,有一些曲線救國的模擬滾動出現(xiàn)啦,當(dāng)然,會犧牲一定的性能。
在移動端有touch事件,包含:
touchstart
touchend
touchmove
touchcancel
方向和距離通過監(jiān)聽start,end事件。對開始和結(jié)束時pageX,pageY進(jìn)行計(jì)算來判斷滾動的方向,并獲得滾動距離。
位置的移動獲取方向和距離之后,我們就可以在touchmove的回調(diào)中通過requestAnimationFrame或setTimeout來設(shè)置觸發(fā)的頻率(時間間隔)。位置的移動通過改變元素的transform:translate來實(shí)現(xiàn),之所以不使用left,是因?yàn)槭褂肅SS3的位置變化會讓設(shè)備開啟硬件加速,性能比使用left高。
再說幾句 減少回調(diào)執(zhí)行時間因?yàn)闈L動事件在大部分設(shè)備和瀏覽器中觸發(fā)的頻率十分高,所以我們可以通過節(jié)流處理來減少滾動事件中回調(diào)函數(shù)的執(zhí)行次數(shù)。
減少回調(diào)中DOM操作因?yàn)闈L動事件的觸發(fā)很快,相對于DOM的操作是非常迅速的,所以在回調(diào)事件中如果對于DOM有很復(fù)雜的操作,這時候你會發(fā)現(xiàn)一些用戶體驗(yàn)不好的現(xiàn)象,比如閃動,卡頓,位置抖動等....但是沒辦法,有時候要實(shí)現(xiàn)這個功能,也只有這一個辦法,哭唧唧~~
滾動動畫有時我們需要做一個返回頂部,或者滾動到頁面中的位置的功能。這時候直接改變scrollTop,整個過程會非常的突兀,這時候我們可以通過Tween.js來實(shí)現(xiàn)滾動的ease,easein這些類型的動畫。
獻(xiàn)上代碼:
// 二次方 緩速動畫 easeout模式 /* * t {number} 開始時間 * b {number} 開始位置 * c {number} 結(jié)束位置 * d {number} 結(jié)束時間 */ function QuadEaseOut(t, b, c, d) { return -c * (t /= d) * (t - 2) + b; } // 判斷是否有requestAnimationFrame if (!window.requestAnimationFrame) { requestAnimationFrame = function (fn) { setTimeout(fn, 17); }; } /* * target {string} 目標(biāo)DOM的ID */ function scrollAnimation(target) { var startPosition = document.documentElement.scrollTop + document.body.scrollTop; var toTarget = document.getElementById(target).offsetTop - startPosition; var endTimer = 400; var startTimer = 0; var step = function () { document.documentElement.scrollTop = QuadEaseOut(startTimer, startPosition, toTarget, endTimer); document.body.scrollTop = QuadEaseOut(startTimer, startPosition, toTarget, endTimer); startTimer += 20; if (startTimer <= endTimer) { // 繼續(xù)運(yùn)動 requestAnimationFrame(step); } else { // 動畫結(jié)束 } }; step(); }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95779.html
摘要:解決的痛點(diǎn)首先我們需要明白和理解和的設(shè)計(jì)初衷和理念。所有框架要解決的問題應(yīng)對需求變化,防止大面積重寫。參考文獻(xiàn)漸進(jìn)式框架理解核心功能原理解析百度網(wǎng)盤視頻學(xué)習(xí)以及源碼資源提取密碼 vue解決jquery的痛點(diǎn) 首先我們需要明白和理解jquery和vue的設(shè)計(jì)初衷和理念。 jquery官網(wǎng)給出的開篇介紹是,jquery是一個快,小,功能豐富的js庫,它讓html文檔遍歷和操作,事件處理...
摘要:為了提高自己,最近在學(xué)習(xí)微信小程序,選題是仿網(wǎng)易云音樂。查文檔發(fā)現(xiàn),小程序中圖片加載完成后,有一個加載完成事件。前者在微信客戶端版本就不開始維護(hù)了,后者低版本需做兼容處理。目前還有一些功能暫未實(shí)現(xiàn),會在以后繼續(xù)完善項(xiàng)目,繼續(xù)學(xué)習(xí)。 為了提高自己,最近在學(xué)習(xí)微信小程序,選題是仿網(wǎng)易云音樂。期間踩過了大把的坑,bug出現(xiàn)的難受和解決bug歡喜,一直是伴隨我階段性學(xué)習(xí)這個項(xiàng)目的心情。初步完成...
閱讀 2377·2021-11-22 14:56
閱讀 1183·2019-08-30 15:55
閱讀 3215·2019-08-29 13:29
閱讀 1366·2019-08-26 13:56
閱讀 3511·2019-08-26 13:37
閱讀 568·2019-08-26 13:33
閱讀 3356·2019-08-26 13:33
閱讀 2237·2019-08-26 13:33