捲動式動畫是網路上常見的使用者體驗模式。捲動導向的動畫會連結至捲動容器的捲動位置。也就是說,當您向上或向下捲動時,連結的動畫會直接回應前進或後退。例如視差背景圖片或閱讀指標,這些效果會隨著捲動畫面而移動。
開發人員通常會使用 JavaScript 回應主執行緒上的捲動事件,藉此建立捲動驅動動畫。因此,由於捲動事件是異步傳送,因此很難建立與捲動同步的效能良好的捲動驅動動畫,而且由於位於主執行緒,因此經常會導致卡頓。
不過,您現在可以透過新的CSS 和 UI 功能,建立宣告式捲動驅動動畫。透過捲動時間軸和檢視畫面時間軸,您可以使用新概念,整合現有的 Web Animations API (WAAPI) 和 CSS Animations API,只需幾行程式碼,即可在主執行緒中執行流暢的捲動驅動動畫。在本個案研究中,您將瞭解 Tokopedia、redBus 和 Policybazaar 如何透過這項新功能獲得良好成效。
Tokopedia
Tokopedia 將先前的自訂 JavaScript 導入作業改為捲動驅動動畫,以便改善網頁效能,並提升電子商務轉換漏斗的整體瀏覽體驗。
相較於使用傳統 JavaScript 捲動事件,我們成功將程式碼行數減少了 80%,並發現捲動時的平均 CPU 使用率從 50% 降至 2%。 Andy Wihalim,Tokopedia 資深軟體工程師
程式碼
下列實作使用 scroll()
函式設定匿名捲動進度時間軸,以控制 CSS 動畫的進度。頂端固定桿的顯示設定會根據定義 animationRange
中的捲動位置而改變。
const toggleBar = keyframes({
to: { height: 48 },
});
export const cssWrapper = css({
position: 'fixed',
left: 0,
width: '100vw',
pointerEvents: 'none',
marginTop: 120,
height: 0,
overflow: 'hidden',
display: 'flex',
flexDirection: 'column',
justifyContent: 'flex-end',
animation: `${toggleBar} linear both`,
animationTimeline: 'scroll()',
animationRange: '20px 70px',
});
redBus
redBus 在待辦事項到達網頁上,為行動裝置和電腦提供不同的動畫,並在轉換漏斗的早期向所有使用者顯示。有了捲動驅動動畫,他們就能用 CSS 取代這些自訂 JavaScript 實作項目,以達到相同效果。
用途
代碼 (行動裝置)
在前述範例中,Tokopedia 使用了匿名捲動進度時間軸。在以下程式碼中,redBus 使用命名的檢視進度時間軸。動畫會變更元素最近祖系捲軸中定義的 animation-range
內 <img>
元素的 opacity
和 clip-path
,也就是本例中的相片庫捲軸。
const reveal = keyframes`
from {
opacity: 0;
clip-path: inset(45% 20% 45% 20%);
}
to {
opacity: 1;
clip-path: inset(0% 0% 0% 0%);
}`
const CardImage = styled.div`
width: 100%;
height: 100%;
img {
border-top-left-radius: 0.75rem;
border-top-right-radius: 0.75rem;
height: 100%;
width: 100%;
object-fit: cover;
view-timeline-name: --revealing-image;
view-timeline-axis: block;
/* Attach animation, linked to the View Timeline */
animation: linear ${reveal} both;
animation-timeline: --revealing-image;
/* Tweak range when effect should run*/
animation-range: entry 25% cover 50%;
}
`;
我們很高興看到這項功能,因為它完美結合了成效和更好的使用者體驗,可提升網頁體驗信號的 SEO 成效。此外,由於學習曲線極短,因此是每個電子商務網站的必備工具。我們也獲得其他團隊的正面意見回饋和支持,幫助他們利用 SDA 取得更多使用者歷程。— redBus 資深工程經理 Amit Kumar
Policybazaar
比較保險方案是使用者重複採取的關鍵行動,做為他們的決策制定程序。使用捲動驅動動畫後,Policybazaar 會根據使用者捲動資料表的情況,縮小低優先順序元素的大小。這樣做可以提供流暢的捲動體驗,同時提升可讀性。
我們使用捲動驅動動畫,盡可能擴大可視區域空間,讓使用者比較保險方案,確保閱讀體驗專注且不雜亂。—Rishabh Mehrotra,PolicyBazaar 人壽保險事業群設計主管。
程式碼
與先前的 Tokopedia 範例相似,Policybazaar 使用 scroll()
函式設定匿名捲動進度時間軸,以便控制 CSS 動畫的進度。在本例中,系統會根據定義的 animation-range
內的捲動位置,縮小字型大小並淡出標頭。
@supports (animation-timeline: scroll()) {
.plan-comparison .inner-header {
animation: move-and-fade-header linear both;
}
.plan-comparison .left-side {
animation: shrink-name linear both;
}
.plan-comparison .inner-header, .plan-comparison .left-side {
animation-timeline: scroll();
animation-range: 0 150px;
}
}
@keyframes move-and-fade-header {
to {
translate: 0% -5%;
top:103px;
}
}
@keyframes shrink-name {
to {
font-size: 1.5rem;
}
}
捲動驅動動畫是使用者歷程中常見的模式
所有精選的電子商務公司都在內含資訊卡的頁面上使用捲動式動畫,以及為資訊卡呈現動畫效果來吸引使用者註意。以下範例顯示使用者旅程中不同部分的卡片捲動效果。這通常是使用匿名檢視進度時間軸來控制自訂 CSS 動畫的進度,如以下 CSS 程式碼片段所示。
@keyframes animate-in {
0% { opacity: 0; transform: translateY(10%); }
100% { opacity: 1; transform: translateY(0); }
}
@keyframes animate-out {
0% { opacity: 1; transform: translateY(0); }
100% { opacity: 0; transform: translateY(-10%); }
}
.flyin_animate {
animation: animate-in linear forwards;
animation-timeline: view();
animation-range: entry;
}
redBus (首頁)
Policybazaar (產品資訊頁面)
Tokopedia (產品詳細資料頁面)
使用捲動驅動動畫 API 時的注意事項
您可以為不支援的瀏覽器為捲動驅動動畫進行 polyfill,例如使用捲動時間表 polyfill。如果您這麼做,就需要進行額外測試,確保該功能可與架構搭配運作,且使用 polyfill 的瀏覽器不會發生動畫失敗或卡頓的情形。
在 CSS 中,您可以先使用 @supports
測試是否支援動畫時間軸,再使用捲動導向的動畫。例如:
@supports (animation-timeline: scroll()) {
}
資源
- 捲動驅動動畫示範
- 使用捲動導向的動畫,為捲動的元素加上動畫效果
- 程式碼研究室:開始使用 CSS 中的捲動驅動動畫
- Chrome 擴充功能:捲動驅動動畫偵錯工具
- 捲動時間軸填充
- 要回報錯誤或推出新功能嗎?歡迎與我們分享你的意見!
歡迎參閱本系列的其他文章,瞭解電子商務公司如何透過使用新的 CSS 和 UI 功能 (例如 View Transitions、Popover、Container Queries 和 has()
選取器) 獲益。