前言
给博客添加动态背景效果,是提升视觉体验的常见手法。Hexo 生态中有经典的 canvas-ribbon 和 canvas-fluttering-ribbon 方案,本文介绍如何在 Hugo 博客中实现类似效果——基于 Canvas 2D API 的 HSL 色相旋转彩色飘带动画。
效果概览
| 功能 | 说明 |
|---|---|
| 🎨 色相旋转 | HSL 色彩空间,颜色持续渐变,视觉丰富 |
| 🌊 流动飘带 | 分段三角从屏幕边缘随机流入,自然流动感 |
| 🎯 随机分布 | 每条飘带随机 Y 轴起点,左/右方向随机 |
| 🔄 自动再生 | 飘带片段流出屏幕后自动生成新飘带 |
| 📐 视差效果 | 随页面滚动轻微偏移,增强空间层次 |
| ⚡ 性能优化 | 页面不可见时自动暂停动画,减少资源消耗 |
| 📱 高DPI适配 | 支持 Retina 屏幕,Canvas 按设备像素比缩放 |
| 🏠 首页兼容 | Banner 全屏背景图区域自动遮盖飘带 |
技术实现
架构设计
飘带效果的层级关系:
1z-index 层级(从下到上):
2 -1 → 🎨 彩色飘带 Canvas(最底层)
3 0 → 🖼️ 首页 Banner 背景图
4 1 → 📄 文章卡片、侧边栏、面包屑等组件
5 100 → 🔝 顶部导航栏
69999 → 📊 阅读进度条
Canvas 位于 z-index: -1,确保飘带在所有内容模块下方。同时 body 和 .main-wrapper 背景设为透明,让飘带透过页面背景展示,而文章卡片、侧边栏小组件等自带不透明背景的元素自然覆盖飘带。
核心算法
每条飘带由多个三角分段组成,从屏幕左/右边缘随机流入:
1// 每个分段有独立的淡入淡出动画
2segments.push({
3 point1: { x: prev.x, y: prev.y },
4 point2: { x: next.x, y: next.y },
5 point3: { x: third.x, y: third.y },
6 color: i * colorCycleSpeed, // 色相索引
7 delay: i * 4, // 延迟出现
8 alpha: 0, // 初始透明度
9 phase: 0 // 动画相位
10});
每帧渲染时,分段透明度通过 Math.sin(phase) 曲线从 0 渐变到 1 再回到 0,实现自然的淡入淡出效果。颜色通过 HSL 色相旋转持续变化,配合 hueOffset 全局偏移,让多条飘带之间颜色错落有致。
动画循环
1function animate() {
2 drawSegments(); // 绘制所有分段
3 cleanupAndSpawn(); // 清理已消失的分段,生成新飘带
4 animId = requestAnimationFrame(animate);
5}
使用 requestAnimationFrame 实现 60fps 流畅动画,页面不可见时通过 visibilitychange 事件自动暂停,节省资源。
配置说明
在 hugo.toml 中配置飘带参数:
1[params.ribbon]
2 enable = true # 总开关
3 count = 4 # 飘带数量(2-5 推荐)
4 alpha = 0.3 # 透明度 0~1
5 saturation = "50%" # 颜色饱和度
6 brightness = "35%" # 颜色亮度
7 colorCycleSpeed = 5 # 色相旋转速度
8 horizontalSpeed = 180 # 水平流动速度
9 parallaxAmount = -0.2 # 视差效果强度
10 strokeSize = 0 # 描边宽度(0=无描边)
| 参数 | 默认值 | 说明 |
|---|---|---|
count | 3 | 飘带数量,越多越密集 |
alpha | 0.5 | 整体透明度,值越大越显眼 |
saturation | 70% | HSL 饱和度,影响颜色鲜艳度 |
brightness | 55% | HSL 亮度,影响颜色明暗 |
colorCycleSpeed | 5 | 色相旋转速度,值越大颜色变化越快 |
horizontalSpeed | 180 | 水平流动速度,值越大飘带移动越快 |
parallaxAmount | -0.2 | 视差偏移量,负值向上偏移 |
strokeSize | 0 | 描边宽度,0 为纯色填充 |
参考来源
本实现参考了 Hexo butterfly 主题的 canvas-fluttering-ribbon 方案,对其进行了简化和适配,使其能直接在 Hugo 模板中通过 Go Template 语法渲染配置参数。
总结
动态彩色飘带为博客增添了流动的视觉层次感,HSL 色相旋转让颜色持续变化,分段淡入淡出让飘带流动自然不突兀。配合合理的 z-index 层级设计,飘带始终在内容模块下方,不影响阅读体验。
留言评论
期待你的想法评论加载中