纯CSS樱花飘落效果需用transform+opacity替代top/left以避免重排,配合will-change、随机keyframes、cubic-bezier缓动及clip-path优化性能,兼顾移动端适配与无障碍。
纯 CSS 就能做出轻量、流畅的樱花飘落效果,不需要 JavaScript 或外部库;但直接套用网上常见的“多层 animation + @keyframes”方案,大概率会卡顿、重叠失真、或在移动端失效。
transform + opacity 而不是 top/left
CSS 动画性能关键在是否触发重排(reflow)。用 top 或 left 移动元素会强制浏览器反复计算布局,尤其当飘落粒子超过 20 个时,60fps 很难维持。而 transform: translateY() 和 opacity 属于合成属性(composited),由 GPU 加速,实测 50+ 樱花也能保持流畅。
transform,禁用 top、left、margin 等触发布局的属性will-change: transform, opacity(仅对 Chrome/Edge 有效,但能提前提示合成层)8s~12s,太短显得突兀,太长则视觉密度不足@keyframes 必须带随机偏移和旋转真实樱花下落不是垂直直线——它有横向晃动、轻微自旋、速度起伏。如果所有粒子共用同一段 @keyframes,一眼就能看出“复制粘贴感”,失去自然感。
@keyframes,比如 fall-1、fall-2,每组的 translateX() 幅度、rotate() 角度、opacity 变化节奏都不同--tx、--r)配合 calc() 在元素上微调,例如:transform: translateY(var(--y)) translateX(calc(var(--tx) * 1px)) rotate(var(--r));
ease-in-out 这类通用缓动——改用 cubic-bezier(0.2, 0.8, 0.4, 1) 模拟空气阻力下的减速感桌面端可放 30~40 朵,但 iOS Safari 对 will-change 和图层数量敏感,超过 25 朵就可能掉帧;Android 中低端机更明显。不能靠“越多越好”硬堆。
立即学习“前端免费学习笔记(深入)”;
prefers-reduced-motion: reduce 媒体查询自动关闭动画(符合 WCAG):@media (prefers-reduced-motion: reduce) { .sakura { animation: none; opacity: 1; }}
clip-path 限制樱花只在视口内渲染(比如 clip-path: inset(0 0 0 0 round 16px)),避免滚动时大量元素持续动画background-image 引入 SVG 而非 PNG——体积小、缩放无锯齿、支持 currentColor 动态换色最易被忽略的是 z-index 层级和透明度叠加:多个半透樱花快速经过同一区域时,若没控制好 z-index 随机值和初始 opacity(建议 0.6~0.9),会出现局部“发白”或“糊成一团”。得让每朵的 z-index 和起始透明度也带轻微随机性,而不是写死。