为博客添加一个页首时光状态组件:实时时钟、问候与今日进度
前言
在博客的页首区域,除了站点标题和一句副标题,还可以放置一些与访问时刻有关的信息。相比必须请求定位和第三方接口的天气组件,一个只依赖浏览器本地时间的“时光状态组件”更加轻量,也不会带来定位权限和接口失效问题。
这个组件会显示:
- 访客设备所在时区的实时时间
- 当前日期与星期
- 随早晨、上午、中午、下午、晚上和深夜变化的问候
- 今天已经过去的百分比
- 根据白天或夜晚自动变化的色彩
- 移动端布局与“减少动态效果”设置
- PJAX 页面切换后的自动恢复
本站目前暂时停用了页首展示,因为我还在调整它最合适的位置;源码和功能仍然完整保留。你可以把它放在首页页首、侧栏、导航栏或页脚。
这个组件同样不是 Hexo 专属。核心只使用原生 HTML、CSS 和 JavaScript,任何能够引入静态文件的网页都可以使用。
一、组件的设计思路
1. 不依赖服务器时间
组件通过浏览器的 Date 获取访客设备时间:
1 | |
因此,中国访客看到北京时间,身处其他时区的访客则会看到自己的本地时间。组件不会请求服务器,也不需要配置时区。
2. 根据时段改变问候
一天被划分为多个时段,每个时段有不同图标、问候和配色。例如晚上会显示月亮,深夜会提醒访客注意休息。
3. 计算今日进度
将当前的时、分、秒转换为从零点开始经过的秒数,再除以一天的 86400 秒:
1 | |
这个数值会同时更新进度条和右侧百分比。
4. 为什么暂时不加入天气
天气组件通常需要:
- 请求浏览器定位权限,或者让访客手动选择城市
- 调用 Open-Meteo、和风天气等第三方接口
- 处理接口限额、跨域、网络错误和缓存
- 向访客说明定位数据的用途
对于博客页首而言,这些成本可能超过天气信息本身带来的价值。因此当前版本只提供稳定、无权限请求的时间信息,天气适合作为后续可选模块。
二、源码下载
压缩包包含:
1 | |
为了便于直接复制,下面同时贴出完整源码。本站的长代码块会限制显示高度,可以点击展开或使用右上角复制按钮。
三、完整 JavaScript
1 | |
四、完整 CSS
1 | |
五、部署到 Hexo + Butterfly
1. 放置文件
1 | |
2. 注入主题
在 _config.butterfly.yml 中加入:
1 | |
修改后运行:
1 | |
Butterfly 首页中存在 #site-info,脚本会把组件插入社交图标之前,不需要修改主题模板。
3. 停用组件
不需要删除源码,只需注释两条注入配置:
1 | |
这也是本站当前采用的停用方式。
六、部署到普通 HTML 页面
在 HTML 中准备挂载区域并引入资源:
1 | |
如果网站没有 #site-info,可以修改 JavaScript:
1 | |
因此它可以迁移到 Hugo、MkDocs、WordPress、Vue 或 React。对于 Vue/React,更推荐将内部 HTML 改写成框架组件,并在最外层布局中挂载。
七、PJAX 为什么需要额外处理
Butterfly 开启 PJAX 后,站内跳转不一定重新加载全部 JavaScript。代码监听:
1 | |
每次切换完成后,它会重新寻找 #site-info。同时通过 #header-moment 判断组件是否已经存在,避免重复插入多个时钟。
页面从后台恢复时也会立即校准:
1 | |
八、调整组件位置
当前代码把组件插在社交图标之前:
1 | |
如果觉得页首太显眼,可以考虑:
- 放到侧栏作者信息下方
- 缩小为导航栏右侧的一行时间
- 放入页脚,与网站运行时间并列
- 只显示时间,隐藏问候与今日进度
- 桌面端显示完整组件,移动端只显示日期和时间
例如放到页脚:
1 | |
更换挂载位置时,CSS 中的宽度、背景透明度和字体大小也应一同调整。
九、常见问题
1. 页面没有显示组件
检查:
- CSS 和 JS 是否已经生成到
public/ _config.butterfly.yml的 YAML 缩进是否正确- 页面是否存在
#site-info - 浏览器是否仍在使用旧缓存
修改资源后可以增加版本号:
1 | |
2. 切换页面后出现两个组件
确保创建前检查:
1 | |
并避免在多个配置文件中重复注入脚本。
3. 时间与北京时间不一致
当前组件显示访客设备时间,而不是固定北京时间。如果希望始终显示中国时区,可以使用:
1 | |
4. 为什么不直接使用服务器时间
时钟每秒都需要更新。通过浏览器本地计算可以避免持续请求服务器,也不需要后端程序。对于装饰性博客时钟,这通常已经足够。
十、隐私与性能
当前组件:
- 不读取地理位置
- 不写入 Cookie 或本地存储
- 不请求第三方接口
- 不上传访客时间信息
- 只保留一个每秒触发的计时器
当标签页重新可见时会主动校准时间,避免浏览器后台节流造成显示滞后。
结语
一个博客时钟真正需要处理的并不只是每秒修改文字,还包括挂载位置、移动端空间、PJAX 生命周期、后台标签页校准和访客隐私。
如果只是想让网站多一点与访问时刻有关的氛围,本地时间、时段问候和今日进度已经足够。天气、节气、日出日落等信息可以在确认位置与视觉层级后,再作为独立模块逐步加入。
AI 内容声明
本文包含 AI 辅助生成内容。文章结构、部分文字表述与组件代码由 AI 协助完成,并经过作者审阅、修改和本地构建验证。




