打开网易新闻 查看精彩图片

Tab组件是界面里最没存在感的元素之一。用户每天点几十次,却很少有人记得住它的样子。

但最近一套开源方案让这件事变了。有人在Shadcn/ui基础上叠了弹簧动画、卡片堆叠、悬停展开三个效果,把最枯燥的导航栏做成了会让人多停留几秒的东西。

这不是炫技。有产品团队测试后发现,带动态反馈的Tab让页面停留时长涨了40%——用户下意识觉得"这个界面在回应我"。

为什么静态Tab正在被淘汰

为什么静态Tab正在被淘汰

传统的Tab切换只有两种状态:显示和隐藏。用户点一下,内容直接跳过去,大脑需要额外0.3秒确认"刚才发生了什么"。

这套方案的核心逻辑是:用物理动画替代状态跳转。活跃指示器不是瞬移,而是用弹簧曲线滑过去;非活跃内容不是消失,而是叠在后面形成景深;鼠标悬停时,堆叠的卡片会像扑克牌一样扇形展开。

三个动画各司其职:弹簧指示器解决"我在哪"的定位焦虑,卡片堆叠制造"还有别的内容"的探索暗示,悬停展开则是给好奇用户的即时奖励。

技术实现上,它把Framer Motion的弹簧物理(spring physics)和Shadcn/ui的CSS变量体系焊在一起。前者负责让动画有重量感,后者保证换主题时颜色不会崩。

一个细节:弹簧动画的阻尼系数调了17版。太快像抽搐,太慢像卡顿,最后定在0.3的刚度——刚好让人感觉到"弹了一下",又不会等得不耐烦。

打开网易新闻 查看精彩图片

组件架构:三层嵌套,每层只做一件事

组件架构:三层嵌套,每层只做一件事

整个系统拆成三个独立模块。AnimatedTabMotion是入口,只管数据流向;Tabs负责导航栏和状态同步;FadeInStack处理所有视觉层动画。

这种拆分不是过度设计。实际开发中,产品团队经常要换导航样式但保留动画,或者反过来。解耦后,改Tab按钮的圆角半径不会碰坏卡片堆叠的逻辑。

数据流用TypeScript严格约束。Tab项必须包含id、label、content三个字段,content可以是React节点或字符串。这个限制逼你在组装数据时就想清楚:每个Tab到底承载什么信息量。

FadeInStack是最复杂的部分。它要同时管理三个状态:当前活跃卡片、堆叠在后的卡片、悬停时的展开动画。实现上用AnimatePresence做进出场,用layoutId让指示器在Tab按钮间平滑迁移。

一个容易踩的坑:堆叠卡片的z-index和scale要反向设置。越靠后的卡片z-index越低,但scale缩得更小,这样视觉上才有"压在后面"的纵深感。反过来做会变成奇怪的悬浮效果。

从复制粘贴到真正可用,还差三步

从复制粘贴到真正可用,还差三步

Shadcn Space提供了CLI一键安装,但这只是起点。要让组件在自己的项目里跑顺,得处理三个实际问题。

第一,主题适配。Shadcn/ui的CSS变量命名有规范,但你的设计系统可能叫--color-primary而不是--primary。得在tailwind.config里做一层映射,或者直接改组件里的变量引用。

打开网易新闻 查看精彩图片

第二,内容高度不一致。如果Tab A是短表单,Tab B是长列表,切换时容器高度会跳动。解决方案是给FadeInStack包一个min-h,或者干脆让所有Tab内容等高——取决于你想牺牲视觉还是牺牲一致性。

第三,移动端降级。悬停展开在触屏上不存在,得额外加一个长按触发,或者干脆在窄屏下关掉堆叠效果,只保留弹簧指示器。

这些调整没有标准答案。有团队选择完全保留桌面端体验,移动端用户反而觉得"这个App和其他不一样";也有团队做激进适配,把堆叠改成横向滑动。数据上两种选择都没错,区别只在产品气质。

谁已经在用,效果怎么样

谁已经在用,效果怎么样

这套方案最早出现在几个开源仪表盘项目里,后来被拿去做SaaS产品的设置页面。一个常见的反馈是:用户误触率下降了——因为弹簧动画让"当前在哪"变得极其明确,不再有人点错Tab后困惑内容为什么没变。

另一个意外发现是客服工单减少。原来静态Tab切换太快,用户经常没意识到自己换了页面,以为功能丢了。动画的0.4秒延迟刚好够大脑完成认知衔接。

也有团队尝试往里面加更多东西:粒子背景、声音反馈、3D翻转。结果普遍不好。这套设计的克制本身就是卖点,堆料反而稀释了"轻量级物理反馈"的核心体验。

维护者最近在讨论一个激进改动:把Framer Motion换成CSS @starting-style,让组件零依赖。但测试发现弹簧效果很难用纯CSS还原,讨论还在僵持。

如果你现在想试试,最快的方式是跑一遍Shadcn Space的安装命令,然后直接改FadeInStack的fan-out角度。默认是15度展开,调到25度会更戏剧化,8度则几乎察觉不到——这是调性的选择,不是技术问题。

最后一个问题留给实际用的人:当Tab都能做成这样,那些还没动静的面包屑、分页器、下拉菜单,是不是也该重新算一笔账了?