给网页增加一个好看的动态落叶背景🍁
最近想给博客加个有点氛围感的背景效果,传统的 Canvas 方案代码量大且复杂,于是尝试用 SVG + CSS 动画实现了一个轻量级的落叶飘落效果。
效果
现在你看到的这个页面就有落叶背景 🍂 48片叶子随机飘落,透明度、速度、旋转角度各不相同,营造静谧的秋日氛围。
动态页面链接:https://wswx.top/image/svgdir/Leaf_background.html
实现
1. CSS 动画定义
.leaf {
position: fixed;
pointer-events: none; /* 不阻挡点击 */
z-index: -1; /* 置于背景层 */
animation: fall linear infinite;
}
@keyframes fall {
0% {
transform: translateY(-100px) rotate(0deg);
opacity: 0;
}
10%, 90% {
opacity: var(--alpha);
}
100% {
transform: translateY(calc(100vh + 100px))
rotate(var(--rotation))
translateX(var(--drift));
opacity: 0;
}
}
2. JavaScript 动态生成叶子
const LEAF_COUNT = 48;
const SVG_PATHS = [
'/image/svgdir/orangeleaves.svg',
'/image/svgdir/redleaves.svg',
'/image/svgdir/yellowleaves.svg'
];
function createLeaf() {
const img = document.createElement('img');
img.className = 'leaf';
img.src = SVG_PATHS[Math.floor(Math.random() * SVG_PATHS.length)];
// 随机参数
const size = random(30, 60);
const duration = random(12, 25);
const delay = random(0, 20);
const startX = random(-50, window.innerWidth + 50);
const rotation = random(360, 1080);
const drift = random(-150, 150);
const alpha = random(0.4, 0.8);
img.style.cssText = `
width: ${size}px;
left: ${startX}px;
top: -${random(50, 150)}px;
--rotation: ${rotation}deg;
--drift: ${drift}px;
--alpha: ${alpha};
animation-duration: ${duration}s;
animation-delay: -${delay}s; /* 负延迟让叶子初始就分布在各处 */
`;
document.body.appendChild(img);
}
关键技巧
负延迟动画(animation-delay: -Xs)
这是让叶子在页面加载时就分布在屏幕各处的关键。负延迟会让动画从中间某帧开始播放,而不是从头开始。
CSS 变量传递随机值
通过 --rotation、--drift、--alpha 等自定义属性,将 JavaScript 生成的随机值传递给 CSS 动画。
z-index: -1
确保落叶在所有内容后方,不会遮挡文字和交互元素。
优化项
- pointer-events: none:落叶不响应鼠标事件,避免影响页面交互
- CSS 动画:利用 GPU 加速,比 JavaScript 动画更流畅
- 适量叶子:48片叶子在性能和视觉效果间取得平衡
- SVG 格式:矢量图形,缩放不失真,文件体积小
相比传统的 Canvas 方案,SVG + CSS 动画的实现更加优雅:
- 代码量少
- 性能更好(浏览器原生优化)
- 更易维护和定制
- 视觉效果同样出色