嗨👋!很久没和大家见面,临近年底,寒冷的空气和繁忙的工作大大降低了创作的欲望,但也是在这种氛围下,可以让我回过头去重新看看先前的项目。
于是这个月以来,陆陆续续把博客翻新了一下,如果说装修的过程是创造,那翻新的过程就是取舍,就让我介绍一下这个“翻新”的博客。
导航栏
第一眼注意到的应该是导航栏的重新设计。
在先前开源的博客框架 Nextme 中,导航栏放置在底部,采用图标加文字的方式呈现。
先前的导航栏
这种设计更偏向实用性,在切换页面的时候也有一个简单的过渡动画指示。
但在阅读文章时,尤其在移动端上,导航栏与路径栏的位置过于靠近,在屏幕上整体的视觉风格会让人比较有压力,也降低了阅读的体验。
因此在翻新的过程中,采用了激进的的方式:
- 剔除导航栏中的文字,只保留图标
- 将导航栏的位置从底部移动至顶部
- 剔除不必要的模糊效果,采用渐变的方式来提高导航栏与内容的对比度。
于是便有了目前新版的导航栏,在新的导航栏下,阅读时不会再去干扰底部内容的可读性,同时更简洁的导航栏也为以后的新增页面预留了更多的空间。
首页
欢迎动画
在翻新导航栏后,下一步则是添加了首页的欢迎效果。
在首次进入首页时,在顶部会出现一个类似彩虹聚光灯的效果,表示对来访的欢迎👏。
💡这个效果的灵感来自于 Vercel 部署成功后,顶部出现的彩虹条纹提示。
这种提示或者说庆祝效果,不侵入用户的页面内容,十分的自然美观。
在代码实现上,出现与消失效果通过 farmer-motion 控制,内部的颜色变换效果通过 css 实现。
'use client'
import { useStatus } from 'lib/status-context'
import { AnimatePresence, m } from 'framer-motion'
export default function AnimatedHeader() {
const { status } = useStatus()
return (
<AnimatePresence>
{status && (
<m.div
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
transition={{ duration: 0.8 }}
className="pointer-events-none z-999 flex h-50 w-50 items-center justify-center"
>
<div className="fixed -top-52 right-0 left-0 flex h-[300px] items-center justify-center overflow-hidden blur-[80px] saturate-150">
<div className="animate-orbit absolute h-[500px] w-[500px]">
<div className="absolute top-[125px] left-[125px] w-[250px] rounded-full bg-sky-500 pb-[250px]"></div>
</div>
<div className="animate-orbit2 absolute h-[250px] w-[500px]">
<div className="absolute top-[50px] left-[125px] w-[200px] rounded-full bg-fuchsia-500 pb-[200px]"></div>
</div>
<div className="animate-orbit3 absolute h-[500px] w-[500px]">
<div className="absolute top-[250px] left-[150px] w-[150px] rounded-full bg-cyan-400 pb-[150px]"></div>
</div>
<div className="animate-orbit4 absolute h-[500px] w-[250px]">
<div className="absolute top-[125px] left-[62.5px] w-[150px] rounded-full bg-green-400 pb-[150px]"></div>
</div>
</div>
</m.div>
)}
</AnimatePresence>
)
}
在 className 中使用了 animate-orbit 动画,其实就是一个简单的 spin 效果,在
tailwind.config.ts
中定义:从整体的角度看,就是四个圆形在变换位置,从而体现颜色渐变的效果。
最后将这个效果固定在顶部,只显示出底部的部分,就完成了这个欢迎动画效果。
歌曲切换
now-playing 组件在歌曲切换时也有了动画。
通过 farmer-motion ,使用
<AnimatePresence/>
与<m.div/>
将封面与歌曲名称分别包裹起来,在切换时,通过修改 id 来触发切换动画效果。在
<AnimatePresence/>
中,通过设置initial
为false
来避免首次进入页面的触发动画。同时,需要将
mode
设置为“wait”
,避免退出未完成时就有新动画插入。实时指针
在先前的文章中,介绍过博客站点中的实时指针:
在这次翻新中,通过两个方面改进了用户体验:
- 指针外观
- 显示逻辑
在先前的版本中,采用较浅与低饱和度的颜色作为指针颜色,虽然观感不错,但与博客内使用的色彩并不搭配。
因此目前全部都采用了 Tailwind CSS 中定义的颜色,选用了较深的颜色以在浅色与暗色模式下都有着不错的观感。
同时,在指示器上增加一个内阴影与文字阴影,带来一些立体的效果。
在现实逻辑上也进行了优化,先前在全部的页面都会显示本地的指针指示器,而页面内是否有其他的在线用户实际上是不可知的。
因此,在翻新后的逻辑下,只有当前浏览页面存在着其他在线用户,指示器才会显示出来。
所以当你在某个页面发现鼠标旁出现了指示器,按下 / 与其他用户打个招呼吧👋。
悬浮操作栏
在翻新的过程中,最有意思的就是各式的悬浮操作栏了,先前已在更新提示中实现:
而现在的悬浮操作栏拓展到了评论的操作上:
相同的,动画由 farmer-motion 控制,通过定义初始与退出动画来实现悬浮工具栏效果。
景深效果按钮
扁平的按钮看多了确实有些无趣,虽然简洁,但是缺少了一些灵动和有趣。
搭配内阴影与文字阴影皆可给按钮带来一些立体的感觉,当鼠标移至按钮上,仿佛真有按下的错觉。
在实现上,在 Tailwind CSS v3 版本中,并没有对应可用的类,但我们可通过自定义内阴影与直接定义样式来实现这两个样式,在 className 中,通过对 shadow 类进行自定义,在按钮文字上,直接传入文字阴影样式。
新页面
本次翻新还带来了一个新页面,我称之为 Darkroom(暗室),用以展示一些博客数据与后端服务信息。
数据从 prometheus 中获取,通过 SSE 的方式实时流式传输到博客前端。
访客位置则是通过 cloudflare 传递的 Header 中获取。
欢迎多来 Darkroom 转转,有许多来自世界不同地方进行访问站点的朋友😄。
性能
性能永远都十分重要,无论加入了多少新功能。
Webp
趁着翻新,将博客全部的图片都压缩更新为了 webp 格式,不仅可以大幅降低图片存储空间占用,也带来了更快的页面访问速度。
Next.js 15 + React 19
升级后采用 turbopack 进行本地的开发与调试,构建时采用了 React 编译器,带来了不错的开发性能与编译速度的提升。
Tailwind CSS v4 + inlineCss
借助 Tailwind CSS v4 带来的新编译引擎,开发中页面对于样式的修改更加迅速了。
同时,在
next.config.mjs
配置文件中,启用实验性特性inlineCss
,可降低用户首次打开页面时 FCP(First Contentful Paint) 所需要的时间。性能监测
在经过这些优化处理并观察一段时间后,博客站点的性能保持在了不错的水平😄。
取舍
在这次的翻新中,为了更好的性能,取消了常驻的模糊效果,与一些页面的大范围动画效果,尽可能让动画融入到页面内容中,尽量不让用户明确感知到动画的存在。
虽然站点增加了一些笨重感,但长远来看,简洁的设计、充实的内容再加上一些小彩蛋,才让一个博客站点有其独特的意义。
感谢你的阅读,我们 2026 再见,装修还是翻新?那得取决于上班摸鱼的时间。