国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

移動端模擬滾動

douzifly / 678人閱讀

摘要:背景由于移動端原生滾動的局限性以及兼容性,部分特定場景的需求無法滿足。示例模擬滾動知識點通過移動端的系列事件觸發模擬滾動,獲取手指滑動的偏移量,進而改變來進行位置偏移。

背景

由于移動端原生滾動的局限性以及兼容性,部分特定場景的需求無法滿足。例如,筆者最近就接了一個需求:整個頁面分為三塊,每塊內容的高度不等(但都超過一屏),要求滾動到內容的臨界點有一個停頓的效果,下拉可以看到下一塊的部分內容,滿足條件則滑到下一塊內容。這種場景下,原生的滾動根本無法支持。因此,本文的主角就亮相了:模擬滾動,即盡可能的模擬原生滾動,但是又提供了一些擴展,滿足復雜場景的需求。

本文將從模擬滾動需要實現的功能、技術分析和方案來進行闡述,通讀本文,讀者將對模擬滾動的常見功能和技術要點有一定了解。

示例:模擬滾動

知識點

通過移動端的touch系列事件觸發模擬滾動,獲取手指滑動的偏移量,進而改變translateY來進行位置偏移。

滾動容器

滾動容器擁有高度,滾動區域的高度大于滾動容器,在滾動時,我們對滾動區域進行偏移,以達到滾動的視覺效果。

通過滾動區域的高度可以通過offsetHeight獲取,但是在以下情況下會遠遠小于實際高度。

內聯樣式:在DOM節點生成時,樣式還未渲染完成,此時獲得的高度是默認樣式的高度,待樣式渲染完成后,高度可能會有變化

圖片高度:img節點的高度開始是0,在圖片加載完成時,才會等于圖片高度,因此這里也會存在誤差

慣性滾動

我們知道,為了讓滾動更加流暢,原生的滾動會有一個慣性滾動的效果,即手指快速滑動松開后,滾動區域會繼續滾動一段距離后停止。

為了實現這個功能,我們需求知道手指滑動的速度,根據比率計算目標滾動位置,然后驅動滾動,讓其到達目標位置。

這里筆者嘗試了兩種方案:

通過requestAnimationFrame不斷進行偏移,直到到達目標位置

使用transition進行過渡,設置動畫曲線讓其到達目標位置

筆者對比了兩種方案,最終選擇了方案2,原因是transition過渡會更加的流暢,而requestAnimationFrame會有略微的卡頓,但是transition過渡,我們實時觸發滾動事件時,不好拿到其當前的位置,查閱了一些資料,筆者最終找到了解決方法,即getComputedStyle,這個API可以拿到當前頁面渲染的實時樣式,也就是說,哪怕它處于過渡動畫中,我們可以實時拿到它的真實位置。

邊界回彈

當滾動超出邊界時,通常我們還可以讓其繼續滾動,但是這時候會設置阻礙,即滾動速度慢下來,當滾動停止時,我們再將其拽回到邊界線。我們可以通過監聽transitionend事件來判斷慣性滾動停止,這里的技術點不做過多分析,感興趣可以在文末中的源碼找答案。

默認行為

通常情況下,我們需要阻止瀏覽器的默認行為(如滾動),但是這樣也會誤殺一些我們需要的默認行為(如超鏈接跳轉、輸入框聚焦)。

解決方法很簡單,在touchstart觸發時,我們判斷一下目標節點是否需要阻止默認行為,比如說tagName=INPUT,我們不阻止默認行為。

點擊事件

默認行為被阻止,綁定在子節點上的點擊事件就無法觸發了,因此這里我們需要判斷一下是否需要觸發點擊事件。可以通過touch系列事件模擬點擊行為,然后通過document.createEvent("Event")來主動觸發click事件。

滾動指示器

在滾動區域中,通常在右側會有一個指示器,用于查看當前在整個內容區塊的大概位置。

為了方便使用,筆者注冊了一系列的鉤子,方便使用者調用,scroll鉤子就是其中之一,在滾動的時候它會實時觸發,在這里就派上用場了。我們通過scroll鉤子改變指示器的位置,唯獨要注意的是滾動超出邊界時,指示器會變短然后恢復。

@axe/scroller

基于以上知識點和技術分析,筆者寫了一個模擬滾動js庫(無任何依賴):https://github.com/ansenhuang/axe/blob/master/packages/scroller/README.md

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97644.html

相關文章

  • 移動滾動研究

    摘要:還會有一個性能上的問題就是當頁面的列表過長,元素過多時,在模擬滾動,下拉刷新這段時間內,頁面也會有卡頓現象,這里采取了一個優化策略即列表較長時數量較多時,在觸發下拉刷新的時機時將頁面視窗之外的元素隱藏或者存放在里面。 移動web滾動問題 在移動端如果使用局部滾動,意思就是我們的滾動在一個固定寬高的div內觸發,將該div設置成overflow:scroll/auto;來形成div內部的...

    ghnor 評論0 收藏0
  • Issues with position fixed & scroll(移動 fixed

    摘要:同時,請在其他移動端瀏覽器也這么處理,不要只對蘋果做這些處理。蘋果對于虎頭蛇尾的做法真讓人頭疼,這作風跟巨硬真像。 轉載請注明英文原文及譯文出處 原文地址:Issues with position fixed & scrolling on iOS 原文作者:Remy Sharp譯文地址:移動端 fixed 和 scroll 問題 譯文作者:鎏金圣手火麒麟 最近在做iOS端的H5頁面...

    Jiavan 評論0 收藏0
  • Issues with position fixed & scroll(移動 fixed

    摘要:同時,請在其他移動端瀏覽器也這么處理,不要只對蘋果做這些處理。蘋果對于虎頭蛇尾的做法真讓人頭疼,這作風跟巨硬真像。 轉載請注明英文原文及譯文出處 原文地址:Issues with position fixed & scrolling on iOS 原文作者:Remy Sharp譯文地址:移動端 fixed 和 scroll 問題 譯文作者:鎏金圣手火麒麟 最近在做iOS端的H5頁面...

    ZoomQuiet 評論0 收藏0
  • 動畫歷程之滾動的坑

    摘要:很多時候我們在上做動畫一般都是選擇滾動事件來觸發。而在移動端的瀏覽器或中,滾動事件的觸發頻率也是不同的。在中在視圖的滾動過程中,事件不會被觸發在滾動結束后,才會觸發和不受此影響。但是滾動觸發事件與滾動距離以及完成的時間有關。 很多時候我們在web上做動畫一般都是選擇滾動事件來觸發。因為動畫需要判斷是否處于視口內,或者是否到達某個臨界點。而滾動在不同的瀏覽器中,不同操作系統中的實現都有不...

    asce1885 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<