MENU

时隔五年,我的个人主页又改版了 —— 这次聊聊「毛玻璃」与新生产力工具

• July 22, 2026 • Read: 59 • 生活记录

时隔五年,我的个人主页又改版了 —— 这次聊聊「毛玻璃」与新生产力工具

上一次认真改版个人主页,还是 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 化

时钟、跑马灯、标题轮播、入场动画,各自抽成 useClockuseInfiniteSlideuseHeadlineRotateuseIsakAnimations。组件只负责结构,行为全部从 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

如果这篇文章对你有启发,欢迎在评论区聊聊你的主页故事。

时隔五年,我的个人主页又改版了 —— 这次聊聊「毛玻璃」与新生产力工具 - 原文链接:https://blog.isww.cn/1647.html

Archives QR Code Tip
QR Code for this page
Tipping QR Code
开往-友链接力