微軟如何改進Microsoft Edge 的滾動效果?
微軟Microsoft Edge團隊在博客分享了他們如何改進新版Edge的滾動效果,包括改進滾動動畫和優化滾動體驗(交互和外觀)。在舊版Edge中,團隊通過與操作系統Compositor (DirectComposition)和輸入API (Direct Manipulation)的緊密集成,實現了與Windows系統一致的平滑滾動效果(Smooth Scrolling)。
由於兩者都是微軟的產品,所以Edge 團隊在實現此效果上並沒有太大的阻礙。
不過與操作系統緊密集成的弊端也顯而易見——難以將同樣的體驗移植到其他操作系統上,其中就包括舊版 Windows系統。更糟糕的是,此方案雖然獨立於瀏覽器主線程來處理輸入和輸出以提升響應速度,並提供了穩定的幀率,但這對於根據幀更新執行更新的腳本卻效果不佳,從而導致出現抖動的情況,這也是當時團隊收到的最常見反饋之一。
為此,在新版Microsoft Edge 中,團隊從過去的經驗中吸取教訓,希望改進Microsoft Edge 和所有基於Chromium 的瀏覽器的滾動效果,並在最開始的時候就明確了一件事:僅僅把此前與Windows 操作系統同樣的依賴關係照搬過來是不可行的,因為Microsoft Edge 和其他基於Chromium 的瀏覽器在兼容性和跨平台要求上有很高的標準。
在此基礎上,Edge 團隊再考慮到用戶反饋和技術方案,以及開源準則,他們決定先將精力最大程度地集中在優化滾動效果和提升性能上。
總結起來,Edge 團隊對Microsoft Edge 滾動效果的改進包括:
- 改進滾動動畫曲線
- 使用基於百分比的滾動
- 引入滾動到底時的回彈效果
- 引入舊版本Edge 的部分滾動效果
改進滾動動畫曲線
改進後的動畫曲線使得滾動速度的變化更自然,滾動時間稍微變長,讓用戶更能感受到動畫效果。簡單來說,這條曲線讓通過鼠標滾輪、鍵盤或滾動條進行的滾動以及觸控滾動都有了舊版 Edge 中的順滑效果。
Chromium 的部分上游變化:
- Add Impulse-style scroll animations
- Refactored ScrollOffsetAnimationCurve to facilitate new animations
- Implement new Windows fling animation curve
- Fling Animation Curve – Part 1
- Fling Animation Curve – Part 2
使用基於百分比的滾動(Percent-based scrolling)
滑動滾動條時,Chromium 使用了固定的的滾動增量值(使用鼠標滾輪增加100px,使用滾動條的點擊按鈕或鍵盤箭頭增加40px)。Edge 團隊改變了這一行為,它採用舊版Edge 中的方案:通過滾動條高度來計算滾動增量值而不是,這樣做的好處是當滾動條高度較小時,瀏覽器依然能提供合理的滾動範圍以瀏覽內容。
Chromium 的部分上游變化:
- Add percent-based scrolling for Windows
- Add main thread percentage scrolling for keyboard and scrollbar
引入滾動到底時的回彈效果(Overscroll bounce)
Overscroll bounce 主要是向用戶發出一個信號,告知他們已滾動至頁面的底部或頂部,類似的效果也被稱為橡皮筋特效或彈性滾動。Microsoft Edge 為任何方向的滾動都加入了此效果。
引入舊版 Edge 的部分滾動效果
scroll chaining vs. scroll latching
scroll chaining 是舊版Edge 使用的方案,它提供的效果是當子滾動條到達邊界時,父滾動條會自動跟隨滾動。
類似的場景,Chromium 已經有了scroll latching 的概念,兩者不同之處在於後者將所有的滾動操作集中到同一個滾動跳上。Edge 團隊指出幾乎所有用戶都更喜歡scroll chaining (97% 好評),所以他們決定在 Microsoft Edge 中使用 scroll chaining,不過不打算將其引入Chromium。
慣性滑動加速(Fling boosting)
此效果主要是提升快速滾動頁面時的速度,同時整合了動畫曲線。例如當用戶希望快速拉至頁面底部,fling boosting 不但提供了友好的動畫效果,還加快了滾動速度。
微軟希望Microsoft Edge 不完全照搬 EdgeHTML 的方案,而是結合Chromium 和EdgeHTML 的優點進行改進。為此,他們正在評估其他效果,並研究如何在即將到來的更新中應用這些改進,這些效果目前包括:
- 子滾動條中的回彈效果(overscroll effect)
- 縮放操作的回彈效果