时隔五年,我的个人主页又改版了 —— 这次聊聊「毛玻璃」与新生产力工具
上一次认真改版个人主页,还是 2021 年 7 月 8 日。那篇《个人主页改版遇到的一些问题》写完之后,这个站点就一直在「老年模式」里安安静静地躺着。
文章链接:https://blog.isww.cn/1132.html
旧版主页:https://www.isww.cn/old/
五年,足够让一个前端er 把整套技术栈换一遍。
也足够让一个人从学生时代的「通宵改 CSS 不觉得累」,变成下班后瘫在沙发上、连开 IDE 都要挣扎五分钟。这五年里,换了工作、搬了家、换了好几台电脑,每次想动主页的念头都被「下周再说」一次次推回去。打开旧仓库看一眼,搜一下当年那个魔幻的 jQuery 写法,默默关掉——这一套动作在过去五年里我重复了不下十次。
直到最近苹果在新系统里推的那套「液态玻璃(Liquid Glass)」磨砂 UI 深深戳中了我——通透、有层次、随光线流动,看一眼就想动手把它搬到自己的主页上。再加上这一年多 React 已经成了我的主力,于是某个加完班回家的夜里,我没有像往常一样瘫进沙发,而是打开五年前的那份代码,默默新建了一个文件夹。
说实话,这一版最后落地的并不是苹果那种真正的「液态玻璃」——没有那层随光线和内容实时折射的高光镜面,只是老老实实的 backdrop-filter 毛玻璃。但拉满质感、统一语言这件事,我尽力做到了。
这篇文章不讲什么宏大架构,就当是和朋友喝茶,聊聊这次改版我在视觉和技术上做了哪些取舍。
一、先说说上一版

上一版其实也挺有意思——当时参考了苹果官网那种序列帧滚动动画:页面往下滚,产品图跟随滚动条一帧一帧地切换,像翻一本翻页书。这种效果在 2021 年很潮,放到今天也依然能打。
翻出当年那份代码的时候,有点像在收拾老房子抽屉:满眼都是当年自己写的注释、给自己打气的 TODO、还有那种「先把效果跑起来再说」的莽撞劲。一边看一边笑,一边也确实看不下去了。
但问题也很明显:
- 大部分 DOM 和样式都是「手搓」的,CSS 一把梭,维护起来越来越痛;
- 动画逻辑和业务逻辑混在一起,改一个地方要全局搜索半天;
- 想换主题?只能改 CSS 变量,动效背景完全是「黑盒」;
- 移动端体验只能说「能看」,谈不上精致。
于是这次改版的核心目标很清晰:保留质感,重写骨架。
二、这一版的视觉方向:毛玻璃

简单总结这一版的视觉关键词:
- 通透:大面积使用
backdrop-filter: blur() saturate() brightness()做毛玻璃; - 悬浮感:卡片、按钮、侧边栏都有一层半透明的高光描边和柔和投影;
- 流动:背景不是静态图片,而是跑在 WebGL 上的实时着色器,正好补上了毛玻璃本身偏「静」的那一面;
- 可切换:主题不再是「亮/暗」二选一,而是配色 + 背景 + 模式的自由组合。
在 SCSS 里我抽象了一个 glass-effect 的 mixin,所有玻璃质感的卡片、按钮、面板统一调用它,参数化的东西做完了,后面就是调参:
@mixin glass-effect(
$bg-opacity: 0.55,
$brightness: 1.05,
$blur: 20px,
$border-opacity: 0.35,
$shadow-alpha: 0.06
) {
background: rgba(255, 255, 255, $bg-opacity);
border: 1px solid rgba(255, 255, 255, $border-opacity);
backdrop-filter: blur($blur) saturate(160%) brightness($brightness);
-webkit-backdrop-filter: blur($blur) saturate(160%) brightness($brightness);
box-shadow: 0 8px 32px rgba(0, 0, 0, $shadow-alpha);
}这玩意儿看起来简单,但统一入口这件事很重要——以前每个组件自己写一份 backdrop-filter,改一个参数要满世界搜替换,现在一行 @include glass-effect(); 搞定。
三、技术栈:从「手搓」到「React 化」
graph TB
ROOT[个人主页技术栈]
ROOT --- A[框架] & B[样式] & C[动画] & D[动态背景 WebGL] & E[主题系统] & F[其它]
A --- A1[Next.js 16] --- A2[React 19] --- A3[TypeScript 5]
B --- B1[SCSS / Sass] --- B2[Bootstrap 5 栅格] --- B3[glass-effect mixin]
C --- C1[GSAP 序列动画] --- C2[Lenis 平滑滚动]
D --- D1[OGL 着色器框架] --- D2[three.js] --- D3[postprocessing]
D --- D4[GridScan] --- D5[LineWaves] --- D6[FaultyTerminal]
E --- E1[next-themes] --- E2[body class 配色] --- E3[localStorage]
F --- F1[Swiper] --- F2[react-fast-marquee] --- F3[ESLint]1. 框架:Next.js 16 + React 19 + TypeScript
这一版彻底转向了 Next.js。App Router 的目录结构、内置的 metadata、SSR/静态导出能力,都非常适合个人主页这种内容相对静态、但又想要现代交互的站点。TypeScript 不用多解释,五年前的我写得有多爽,现在的我改得就有多香。
2. 样式:SCSS + Bootstrap 5 栅格
没用 Tailwind,也不是 CSS-in-JS,而是继续沿用了 SCSS——个人主页有大量「一次性」的视觉表达,写 mixin 和嵌套比写原子类舒服得多。Bootstrap 只用它的栅格系统(.container / .row / .col-lg-7),剩下的视觉全部自己写。
3. 动画:GSAP + Lenis
- Lenis 负责平滑滚动,让滚动条本身变成一种「丝滑」的体验;
- GSAP 负责序列动画、文字出场、卡片入场时间轴。
这套组合是当下比较成熟的「高级感动效」标配,踩坑资料也多。
4. 背景:跑在 WebGL 上的实时着色器
这次最满意的部分——背景全部跑在 WebGL 上,基于 OGL + postprocessing + three.js 实现了三套可切换的动态背景:
| 背景 | 效果 | 技术 |
|---|---|---|
| GridScan | 网格扫描线,带 bloom 与色散 | Fragment Shader + 后处理 |
| LineWaves | 流动的彩色等高线,会跟随鼠标 | OGL + 鼠标交互 |
| FaultyTerminal | 故障终端 / 矩阵雨风格 | 噪声 + chromatic aberration |

这些不是 GIF,是实时渲染的着色器,性能开销可控,而且每一套都暴露了一堆参数(扫描线粗细、bloom 强度、色散、噪声、曲率……),想怎么调就怎么调。
5. 多主题:next-themes + body class
主题系统分两层:
- 明暗模式:交给
next-themes,它会自动处理 SSR 闪烁问题; - 配色变体:通过给
<body>切换body-v1 / body-v2 / dark-v1 …这类 class 实现,所有 SCSS 颜色变量挂在 body 上。
用户在右下角的设置面板里可以随意组合,选择会写进 localStorage,下次访问自动恢复。

四、几个值得一提的小决定
① 动画逻辑全部 hook 化
时钟、跑马灯、标题轮播、入场动画,各自抽成 useClock、useInfiniteSlide、useHeadlineRotate、useIsakAnimations。组件只负责结构,行为全部从 hook 里「插」进来——这是从手搓时代到 React 时代最关键的转变。
② 序列帧滚动被保留
五年前的序列帧效果我实在舍不得丢,这次用 GSAP 重新实现了一遍,代码量大概是原来的三分之一,性能反而更好。
五、效果对比

一句话总结:视觉上跃迁了一代,工程上跃迁了两代。
- 视觉:毛玻璃质感拉满,背景从「静态图片」升级为「实时着色器」;
- 工程:从 jQuery 时代的 DOM 操作,彻底转向组件化 + hook + 类型系统;
- 体验:多主题随意切换,配色与背景解耦,用户可以自己「玩」出喜欢的组合。
六、改完之后
上线那天其实没什么仪式感——按下部署按钮的时候是凌晨两点,窗外安静得能听见空调外机的嗡嗡声。没有截图发朋友圈,也没有立刻写文章,只是把页面打开,来回滚动了几遍,看着那些毛玻璃卡片在 WebGL 背景上慢慢划过,像在确认「这件事真的做完了」。
然后关掉电脑,洗漱,睡觉。第二天照常上班。
但心里那块搁了五年的小石头,算是落地了。
七、一点碎碎念
做个人主页这件事很奇妙——它没什么 KPI,也没什么用户反馈,甚至连 PV 都没几个。它存在的唯一理由,就是「我想把脑海里那个画面搬到屏幕上」。
五年前那一版,教会了我怎么把苹果的序列帧扒下来,那年我熬夜到凌晨四点,为了把一帧的过渡曲线调到顺眼。
这一版,教会了我怎么用着色器去逼近一块「会流动的玻璃」。依然是熬夜,依然在那些别人都睡了、只有我和屏幕亮着的夜里——只是第二天不能再像学生时代那样睡到中午了。
有人说「个人主页是程序员的电子自留地」,我挺认同的。社交平台是租来的,主页才是自己买下来的那块地。地里种什么、长什么样、什么时候翻新,都只跟自己交代。它不会带来流量,也不会变现,但它会一直提醒你——你还是那个会因为一个 CSS 效果而兴奋半天的人。
白天写的是公司的代码,晚上写的才是自己的代码。这块小小的自留地,大概就是我和「代码」这件事最纯粹的关系。
下一版会是什么样?我不知道。也许是 2029 年,也许就是下个月。可能是被某个新框架戳中,也可能是某次加班回家后突然来了兴致。
但有一件事是确定的:只要还在写代码,就一定还会再改版。
新版地址:https://www.isww.cn
旧版(归档):https://www.isww.cn/old/
上一篇改版记:https://blog.isww.cn/1132.html
如果这篇文章对你有启发,欢迎在评论区聊聊你的主页故事。
部分素材来源于网络,如有侵权请联系删除!
© 版权声明:本文为奇异纬度的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
时隔五年,我的个人主页又改版了 —— 这次聊聊「毛玻璃」与新生产力工具 - 原文链接:https://blog.isww.cn/1647.html