Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Scrolling 新鮮事
Search
chph
July 06, 2016
Technology
200
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Scrolling 新鮮事
前端魔法師七月小聚 @ 達暉資訊
chph
July 06, 2016
More Decks by chph
See All by chph
Chrome Dev Tools 基礎技巧
chph
0
100
DevOpsDays Taipei 2017 敏捷思維分享
chph
0
120
在 Google Cloud Platform 架設你的網站伺服器並撰寫 Node.js 應用程式
chph
0
720
Intro to Progressive Web Apps
chph
1
76
淺談 Gzip
chph
0
140
Install WordPress on Linode
chph
0
170
Introduction Infrastructure - Linode 入門
chph
0
230
高速傳愛~三小時進化 PWA
chph
0
300
Optimize JavaScript execution and parse time using optimize-js
chph
0
170
Other Decks in Technology
See All in Technology
NetBoxを利用した作業効率化の試み_NetDevNight4
tnoha
0
390
ソフトウェアアーキテクチャ研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
2
1k
ウォーターフォール開発案件のPMとしてAI活用を模索している話
hatahata021
2
230
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
340
Power Automateアップデート情報
miyakemito
0
290
人手不足への挑戦:車両保全を支えるIoTとクラウド内製化の道【SORACOM Discovery 2026】
soracom
PRO
0
170
信頼できるテスティングAIをどう育てるか?
odan611
0
170
なぜ、あなたのAPIは使われないのか? AX時代の設計原則、ガードレール、運用体制
yokawasa
1
270
システム監視入門
grimoh
5
770
AI エージェント時代のデジタルアイデンティティ
fujie
1
1.2k
クラウドを使う側から、作る側へ / 大吉祥寺.pm 2026前夜祭
fujiwara3
8
1.9k
PLaMo 3.0 Primeの構造化出力サポート
pfn
PRO
0
140
Featured
See All Featured
Done Done
chrislema
186
16k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
Unsuck your backbone
ammeep
672
58k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Visualization
eitanlees
152
17k
A designer walks into a library…
pauljervisheath
211
24k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
350
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
How to Ace a Technical Interview
jacobian
281
24k
Transcript
曾坤福 @afutseng Scrolling 新鮮事 前端魔法師∘2016.07.06
關於我 ! 曾坤福 (Afu) @afutseng Front-end Engineer at PIXNET Web
developer since 2006 ZCE (PHP 5.3) since Jan 2012 ZCPE (PHP 5.5) since Dec 2014
Improving scroll performance with passive event listeners https://www.youtube.com/watch?v=65VMej8n23A
問題 • 瀏覽器必須等待滾動/觸控的 handler 執⾏完畢才知道是否呼叫 preventDefault(),可能使捲動不流暢 (jank) • wheel, touchstart,
touchend, touchmove • empty touch event handler 也會影響 • Google 統計 Android 超過 80% 的 touch handlers 並不會取消 預設⾏為 • 也就是說通常瀏覽器都⽩等了 • 10% delay > 100ms • 1% > 500ms
解決⽅案 - {passive: true} • 表⽰該 handler 不會取消預設⾏為 (例如滾動) •
瀏覽器不⽤等待它執⾏完成才進⾏滾動 • 執⾏ preventDefault() 無效,瀏覽器會發出警告 • Chrome 51 & Firefox 49 開始⽀援
解決⽅案 - {passive: true} document.addEventListener(‘touchstart’, function (evt) { // Do
some thing here… // But don’t block scrolling ! }, {passive: true});
可是... 第三個參數傳 object 會讓⽼舊瀏覽器出錯耶?
addEventListener @ MDN /* 現代瀏覽器 */ target.addEventListener(type, listener[, options]); options
/* optional */ • capture = false 預設為事件冒泡 (Bubbling) • passive = false 承諾 listener 永不呼叫 preventDefault • once = false ⼀次性的 listener,觸發後⾃動移除 .PEFSO
addEventListener @ MDN /* Firefox 6、IE 9、Opera 11 */ target.addEventListener(type,
listener[,useCapture]); • useCapture = false 預設為事件冒泡 (Bubbling) • optional ,可不傳
addEventListener @ MDN /* IE 8 以下⽼舊瀏覽器 */ target.addEventListener(type, listener,
useCapture); • 必須傳第三個參數,通常是 false,表⽰作為冒泡階段的 handler
若是現代瀏覽器,傳⼊ {passive: true} ⽼舊瀏覽器則給 false
回顧跨瀏覽器處理原則 Feature Detection • (X) 根據瀏覽器/版本決定作法 • if (navigator.userAgentuser.match(/MSIE/)) {
…… } • (O) 瀏覽器⽀援某個功能,則採取特定作 法,反之做降級處理 (或是放⽣)
Feature Detection for {passive} var supportsPassive = false; try {
var opts = Object.defineProperty({}, 'passive', { get: function() { supportsPassive = true; } }); window.addEventListener("test", null, opts); } catch (e) { } IUUQTHJUIVCDPN8*$(&WFOU-JTUFOFS0QUJPOTCMPCHIQBHFTFYQMBJOFSNE
Feature Detection for {passive} ! elem.addEventListener('touchstart', myHandler, supportsPassive
? { passive: true } : false ); IUUQTHJUIVCDPN8*$(&WFOU-JTUFOFS0QUJPOTCMPCHIQBHFTFYQMBJOFSNE
⼩結 • 加上 {passive: true} 讓你的網⾴觸控體驗 更流暢 • 若成效不彰,使⽤ Chrome
的 Timeline 錄 製觸控/捲動事件找出效能瓶頸! !
Scroll Anchoring 捲動錨定 調整捲動位置,以免畫⾯外內容變更時造成檢視焦點位移
Scroll Anchoring OFF
啟⽤ Scroll Anchoring 實驗功能 1. 於 Chrome 網址列輸⼊ about:flags 2.
啟⽤捲軸錨定 ! 3. 重新啟動 Chrome
Scroll Anchoring ON
WJFXQPSU BODIPSOPEF -BZPVU SFqPX TDSPMMBEKVTUNFOU
References 1. Improving scroll performance with passive event listeners, https://developers.google.com/web/
updates/2016/06/passive-event-listeners 2. New APIs to help developers improve scroll performance, Chromium Blog, https:// blog.chromium.org/2016/05/new-apis-to-help-developers-improve.html 3. Passive Event Listeners, BlineOn 2016, https://docs.google.com/presentation/d/ 1lYmNxxNWeLHZBp8eWCSZY2RHIchGK-O9Ws4mhlAwFi0/edit#slide=id.p 4. Passive Event Listeners (EventListenerOptions), https://github.com/WICG/EventListenerOptions 5. EventTarget.addEventListener(), MDN, https://developer.mozilla.org/en-US/docs/Web/API/ EventTarget/addEventListener 6. 3.6. Interface EventTarget, DOM Living Standard, https://dom.spec.whatwg.org#interface- eventtarget 7. DOM Listener: capture, passive, and once, https://www.webreflection.co.uk/blog/2016/04/17/ new-dom4-standards 8. passive 的事件监听器, http://www.cnblogs.com/ziyunfei/p/5545439.html 9. 5.5 List of TouchEvent types, https://w3c.github.io/touch-events/#list-of-touchevent-types 10. Scroll Anchoring, BlinkOn 2016, https://docs.google.com/presentation/d/ 1bgVPqd805L38oAG7WbVr4jUP-YwOazjEGPNPLsIesBg/edit#slide=id.p
Photo Credits 1. https://www.flickr.com/photos/bracketing_life/4215944196 2. http://kaohsiung.network.com.tw/ 3. http://handmadecssdesign.com/blog/end-of-life-for-ie6/ 4. http://www.srido.org.tw/resource/20
感謝聆聽 @afutseng
痞客邦 PIXNET 徵才中! • 前端⼯程師 • PHP ⼯程師 • MIS
⼯程師 • UI 設計師 • UX Researcher 請聯絡
[email protected]