節(jié)流函數(shù)與頁面滾動(dòng)處理的一些方式

節(jié)流函數(shù)是防止短時(shí)間內(nèi)多次觸發(fā)的一個(gè)處理函數(shù)
如:滾動(dòng)事件溃卡,使用 addEventListener 方式添加監(jiān)聽器

window.addEventListener( "scroll",
   throttle(
      () => {
          const scrollTop = window.scrollY;
          // dosomething
      }
    )
)

function throttle(action, wait=1000) {
let time = Date.now()
return function () {
  if (time + wait - Date.now() < 0) {
      action();
      time = Date.now()
  }
}
}

為了使節(jié)流之后滾動(dòng)更加的平滑烂翰, 我們可以使用 window.requestAnimationFrame() 來實(shí)現(xiàn)節(jié)流函數(shù)

 function throttle (action){
    let call = false;
    return function () {
      call = true;
      window.requestAnimationFrame(
        () => {
          action()
          call = false
      }
    )
  }
  }

在視窗中顯示
當(dāng)需要實(shí)現(xiàn)圖片的懶加載或者是無限滾動(dòng)時(shí),需要確定元素是否出現(xiàn)在視窗中休溶, 這樣需要獲取 elem.getBoundingClientRect();

 window.addEventListener ( "scroll", () => {
  const {bottom, right, left, top} = elem.getBoundingClientRect();
  const inViewport = bottom > 0 && right > 0 && left < window.innerWidth && top < window.innerHeight;

注意: 每次調(diào)用 getBoundingClientRect 時(shí)都會(huì)觸發(fā)回流代赁, 這樣會(huì)嚴(yán)重的影響性能,特別是在事件處理函數(shù)中兽掰,會(huì)更加的嚴(yán)重影響性能芭碍;

在 2016 年之后, 可以通過 Intersection Observer 這個(gè) api 來解決問題孽尽, 它允許你追蹤目標(biāo)元素與其祖先元素或者視窗的交叉狀態(tài)窖壕, 另外只有一部分元素出現(xiàn)在視窗中,哪怕只有 1 px 杉女, 也可以選擇觸發(fā)回調(diào)函數(shù)

 const observer  = new IntersectionObserver (callback瞻讽, options);
 observer.observe(element);

滾動(dòng)邊界的問題:
當(dāng)用戶滾到末尾時(shí)熏挎, 整個(gè)頁面都會(huì)開始滾動(dòng)速勇;
連鎖滾動(dòng)的表現(xiàn), 當(dāng)滾動(dòng)有婆瓜;元素到達(dá)底部時(shí)快集,可以改變頁面的 overflow 屬性或者在滾動(dòng)元素的滾動(dòng)事件處理函數(shù)中取消默認(rèn)行為來解決這個(gè)問題

如果使用 JavaScript 處理, 那么處理的不是 scroll 事件廉白, 而是每當(dāng)用戶使用鼠標(biāo)滾輪 或者 是觸摸板時(shí) 觸發(fā)的是 wheel 事件

過度滾動(dòng)對(duì)移動(dòng)端的影響尤為的嚴(yán)重个初,下拉刷新的手勢(shì)在 安卓的chrome 瀏覽器中,問題出現(xiàn)了猴蹂,它會(huì)刷新整個(gè)頁面榜苫, 而不是加載更多的內(nèi)容碑隆;這個(gè)就會(huì)產(chǎn)生很多問題;

css 通過 overscroll-behavior 這個(gè)新屬性解決問題渔彰。它通過控制元素滾動(dòng)到盡頭時(shí)的行為來解決 下拉刷新與 連鎖滾動(dòng)帶來的問題。安卓的 glow 與蘋果中的 rubber band嫡秕。

  .element {
   overscroll-vehavior: contain;
}

準(zhǔn)確的說, IE 與 Edge 實(shí)現(xiàn)了獨(dú)有的 -ms-scroll-chaining 屬性來控制連鎖滾動(dòng);
微軟瀏覽器已經(jīng)準(zhǔn)備實(shí)現(xiàn) overscroll-behavior 這個(gè)屬性

觸屏之后

在觸屏設(shè)備上叭爱,滾動(dòng)的體驗(yàn)是一個(gè)很大的話題。

蘋果公司開發(fā)了 慣性 滾動(dòng)的專利漱病;

css 有一個(gè)很hack 的方法买雾;

 .element {
  -webkit-overflow-scrolling: touch;
 }

只支持 webkit 內(nèi)核,

但是我們會(huì)使用 touch 事件來解決這個(gè)問題杨帽,但是這個(gè)會(huì)對(duì)用戶滾動(dòng)體驗(yàn)造成很大的影響漓穿;
在現(xiàn)代的瀏覽器中,雖然知道如何使?jié)L動(dòng)變得平滑注盈,但為了 確定滾動(dòng)事件處理函數(shù)中是否執(zhí)行了 阻止默認(rèn)事件 晃危;可能任會(huì)花費(fèi) 500 mm 來等待事件處理函數(shù)執(zhí)行完畢

即使是一個(gè)空的事件監(jiān)聽函數(shù), 從不取消任何行為老客,鑒于瀏覽器會(huì)期待 preventDefault 的調(diào)用僚饭, 也會(huì)對(duì)性能造成影響

為了告訴瀏覽器不去檢測(cè)事件是否阻止了默認(rèn)事件,在 whatwg dom 標(biāo)準(zhǔn)中沿量,存在一個(gè)特性浪慌,來解決這個(gè)事件,

elem.addEventListener('event',  e => {
  dosomething
}, {passive: true }
)

這個(gè)視頻會(huì)看到帶來的性能提升: https://www.youtube.com/watch?v=NPM6172J22g

此文借鑒: http://caibaojian.com/css-scroll.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末朴则,一起剝皮案震驚了整個(gè)濱河市权纤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乌妒,老刑警劉巖汹想,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撤蚊,居然都是意外死亡古掏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門侦啸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來槽唾,“玉大人,你說我怎么就攤上這事光涂∨悠迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵忘闻,是天一觀的道長(zhǎng)钝计。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么私恬? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任债沮,我火速辦了婚禮,結(jié)果婚禮上本鸣,老公的妹妹穿的比我還像新娘疫衩。我一直安慰自己,他們只是感情好永高,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布隧土。 她就那樣靜靜地躺著提针,像睡著了一般命爬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辐脖,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天饲宛,我揣著相機(jī)與錄音,去河邊找鬼嗜价。 笑死艇抠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的久锥。 我是一名探鬼主播家淤,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼瑟由!你這毒婦竟也來了絮重?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤歹苦,失蹤者是張志新(化名)和其女友劉穎青伤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殴瘦,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡狠角,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蚪腋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丰歌。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屉凯,靈堂內(nèi)的尸體忽然破棺而出立帖,到底是詐尸還是另有隱情,我是刑警寧澤神得,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布厘惦,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宵蕉。R本人自食惡果不足惜酝静,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羡玛。 院中可真熱鬧别智,春花似錦、人聲如沸稼稿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽让歼。三九已至敞恋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谋右,已是汗流浹背硬猫。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留改执,地道東北人啸蜜。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辈挂,于是被迫代替她去往敵國(guó)和親衬横。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容