在 Chrome 129 中,您可以使用 JavaScript 的 scrollSnapChange
和 scrollSnapChanging
事件。實作內建的快照事件後,先前看不見的快照狀態就會在適當時間變得可供操作,且一律正確。這並非您在沒有這些事件的情況下所享有的便利性。
在 scrollSnapChange
之前,您可以使用交集觀察器找出哪些元素跨越捲動通訊埠,但判斷哪些元素僅限於少數情況。舉例來說,您可以偵測貼齊項目是否填滿捲動端口,或填滿捲動端口的大部分空間。如要執行此操作,您必須觀察捲動區域的元素交集,然後根據哪個項目佔用捲動區域的大部分空間,假設這就是對齊目標,然後等待 scrollend
,並對對齊的項目 (對齊目標) 採取行動。
然而,在 scrollSnapChanging
之前,無法得知貼齊目標何時變更,或是貼齊目標的變更 (例如捲動快速滑過的情況)。
好消息是,這些新事件可讓您快速輕鬆取得這項資訊。這項功能可讓捲動貼齊互動超越目前的功能,並協調捲動貼齊關係和全新 UI 回饋情境。
scrollSnapChange
只有在捲動手勢導致新的對齊目標已停留時,系統才會觸發此事件,且按照以下順序觸發
- 捲動畫面後。
scrollend
之前。
這個事件只會在 scrollend
之前、捲動完成,以及只在新的貼齊目標放下時觸發。這樣一來,當捲動手勢完成時,事件就會以惰性或即時的方式執行。
scroller.addEventListener('scrollsnapchange', event => {
console.log(event.snapTargetBlock);
console.log(event.snapTargetInline);
})
scroller.onscrollsnapchange = event => {
console.log(event.snapTargetBlock);
console.log(event.snapTargetInline);
}
事件會將事件物件上的固定項目公開為 snapTargetBlock
和 snapTargetInline
。如果捲軸只有水平,snapTargetBlock
屬性會是 null
。屬性值會是元素節點。
ScrollSnapChange 的專屬詳細資料
使用者放開手勢前不會觸發
如果手指仍在螢幕上,或是手指在觸控板上,表示使用者的手勢尚未完成捲動,也就是捲動尚未結束,因此鎖定目標尚未變更,而是等待使用者完成手勢。
如果貼齊目標未變更,就不會觸發
這是針對貼齊變更的事件,而如果貼齊目標並未改變,即使使用者與捲動器互動,事件也不會觸發。不過,使用者確實捲動了畫面,因此在捲動完成後,系統仍會觸發 scrollend
事件。
scrollSnapChanging
瀏覽器判斷捲動手勢已產生或將產生新貼齊目標時,就會觸發此事件。會在捲動期間及時觸發。
scroller.addEventListener('scrollsnapchanging', event => {
console.log(event.snapTargetBlock);
console.log(event.snapTargetInline);
})
scroller.onscrollsnapchanging = event => {
console.log(event.snapTargetBlock);
console.log(event.snapTargetInline);
}
事件會將事件物件上的固定項目公開為 snapTargetBlock
和 snapTargetInline
。如果捲軸僅為垂直方向,snapTargetInline
屬性會是 null
。屬性的值會是元素節點。
ScrollSnap Change 的專屬詳細資料
在捲動手勢期間提早且頻繁觸發
與 scrollSnapChange
等待使用者完成捲動手勢不同,這個事件會在使用者用手指或觸控板捲動時立即觸發。舉例來說,如果使用者在滑動時不抬起手指,只要使用者在滑動時經過多個可能的對齊目標,scrollSnapChanging
就會在手勢期間觸發多次。使用者每次捲動畫面時,如果瀏覽器確定在發布新的貼齊目標時就會繼續觸發事件,就會觸發事件來指出這是哪個元素。
不會在前往新固定目標的過程中觸發所有固定目標
此外,請考慮飛移動作,當使用者執行捲動拋擲手勢,同時跨越多個對齊目標時,系統會針對要停留的目標觸發一次這項事件。因此,系統會盡快提供對齊目標,但不會浪費資源。
用途和範例
這些事件不僅可實現許多新的用途,也使現有模式更容易實作。其中一個主要的例子是啟用由 Spnap 觸發的動畫。在連結目標為連結項目時,根據情境顯示連結項目、連結項目的子項或相關資訊。
下列模式示範了一些可協助您直接處理效率的應用情境。
醒目顯示客戶評價
這個範例宣傳或視覺化聚焦使用者推薦的見證內容。
scroller.onscrollsnapchange = event => {
scroller.querySelector(':scope .snapped')?.classList.remove('snapped')
event.snapTargetInline.classList.add('snapped')
}
顯示已固定項目的標題
這個範例會顯示已固定項目的標題。這次示範會同時顯示這兩個事件,讓您瞭解 scrollSnapChange
和 scrollSnapChanging
之間的時間和使用者體驗差異。
為簡報投影片的孩子套用動畫一次
這個範例會在使用者停留在新的投影片時,顯示動畫內容。
document.addEventListener('scrollsnapchange', event => {
event.snapTargetBlock.classList.add('seen')
})
在捲動器中的 x 和 y 上貼齊
捲動自動對齊功能適用於允許水平和垂直捲動的捲動器。這個示範會在您捲動瀏覽格線時,同時顯示 scrollSnapChanging
和 scrollSnapChange
目標。這部示範影片會清楚說明瀏覽器對齊的元素,不一定是你預期的元素。
兩個連結的捲軸
此示範有兩個捲動貼齊容器,其中一個容器是概略的連結清單,另一個則是實際頁面內容。有了新的 scrollSnapChanging
事件,您就能輕鬆地雙向連結這些快照狀態,讓這些狀態保持同步。
OKLCH 顏色挑選器
這個示範包含 3 個捲軸,每個捲軸都代表 OKLCH 中的不同顏色管道。已接合的項目會與相關的無線電群組同步處理,然後從納入輸入內容的表單中擷取資料。如果使用者使用滑鼠或觸控裝置,則可以捲動至所需值。如果您是鍵盤使用者,請以 Tab 鍵和方向鍵。對螢幕閱讀器來說,這只是一個表單。
對齊動畫樞紐
這個示範會使用 scrollsnapchange
逐步改善捲動自動對齊體驗,並使用自動對齊觸發的轉場效果。
使用下列 JavaScript 檢查事件支援:
if ('onscrollsnapchange' in window) {
// ok to use snap change
}
可捲動的尺規輸入
這個示範以可捲動的標尺做為選取數字輸入長度的替代方法。直接在數字輸入框中輸入值,或捲動至所需大小。變更事件用於在使用者手勢期間清除選取項目,而變更事件則用於更新狀態並強化使用者的選擇。
封面流
這個示範是根據 Bramus Van Damme 重現 macOS 封面流的優異捲動動畫 (影片教學課程) 所建構。scrollSnapChanging
用於隱藏專輯標題,scrollSnapChange
則用於顯示標題。這些事件有助於協調舊標題的急迫隱藏作業,以及新標題的延遲顯示作業。
更多激發創意的點子
如今,您可以輕鬆瞭解哪些元素即將固定,哪些元素正在進行固定,因此可以發揮更多創意!以下列出一些點子,協助您發揮創意並發掘其他用途:
- 觸發延遲載入,也稱為 Snapchange 觸發的轉譯或資料擷取。
- 與較大圖片連結的膠卷縮圖。
- 切換已固定的影片縮圖中影片預告的播放/暫停功能。
- Analytics 追蹤
- Scrollytelling
- Wheel of Fortune 使用者介面/使用者體驗
- 貼齊目標會顯示錨定工具提示。
- 輕觸即可貼齊
- 輕觸即可查看
- 扣緊時發出音效
- 滑動 UI
- 可滑動的分頁或輪轉介面
其他研究
Chrome 團隊很期待聽到你使用這些新 API 建構的內容,並希望這有助於簡化捲動體驗。