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