NAVIGATION SYS
首页折腾手记造点东西投资笔记做点音乐想点事情

NCC-1701-D // SYSTEM ONLINE

Deep Space Viewport
造点东西

AI帮我造博客(七):底部导航栏设计——3D透视踩坑与人机协同的边界

舸扬
造点东西
发布: 2026-03-18
更新: 2026-03-30
标签博客搭建前端AI辅助开发UI设计
AI帮我造博客(七):底部导航栏设计——3D透视踩坑与人机协同的边界
本文字数:3900预计阅读:10 分钟

在前面的介绍里,我故意跳过了一个小组件:首页最底部的导航栏。它看起来不起眼,里面的门道却挺多。

我觉得它值得单开一篇文章聊聊。

TL;DR

  • 场景:博客首页底部导航栏原本是一排扁平的文字链接,我想把它改成类似“飞船操作台”那种带点物理纵深感和反馈的按键。
  • 痛点:要让代码写出“透视感”,直接丢需求给 AI 不太行。它要么用一堆阴影堆出上世纪 90 年代的拟物风,要么把变形角度算错。加上 Tailwind 的摇树优化、CSS 悬停带来的物理脱离抖动,这些小坑很难一次避开。
  • 解决方案:别用“科技感”、“立体感”这种模糊的形容词去指挥 AI,直接调用底层原封不动的 CSS 3D 透视属性(rotateX 翻转配合 perspective 视距层深)。对于调参,我让 AI 直接输出一份配置参数说明书,把盲目的黑盒“猜指令”变成了有说明书的手动“微调”。
  • 核心洞见:大模型很擅长把设计思路转写为底层代码或文档,前提是我们给的数据和方向是对的。通过参数化,我们可以把难以名状的“美感火候”牢牢抓在自己手里。

先来看看最终完成的导航栏效果——

Control Deck 最终效果

/// Control Deck 最终效果 ///

1. 为什么一个底部导航栏需要这么讲究?

博客分为五个具体的栏目,最稳妥的做法,是在顶部平铺五个文字超链接。干净利落,大家也都这么干。

但我们这套博客首页走的是“太空探索”风:顶部是星空视窗(Viewport),中间是悬浮的仪表盘(Tactical Dashboard)。如果视线一路往下,最后收尾的仅仅是一排平面的文字,之前建立的科幻感瞬间就破功了。

所以目标很明确:底部必须像飞船控制台的一排物理按键。有微凸的质感、有环境反光,最好还要有点向内凹陷的 3D 环抱感。这不是为了刻意炫技,主要是为了补齐整体沉浸感。

2. 初次尝试:AI 的认知盲区与扁平化设计

刚开始,我把底栏需求连同中控一起丢给 AI:

"底部操作台区域,背景使用这张带有金属纹理的图像,上方放置五个具备科技感的导航按键。"

代码很快就出来了。确实放在了金属背景图上,但看着很死板,就像五张纸片贴在变形的背景上面。这就是典型的“语义偏差”,AI 确实给你画了这些东西,但它不懂你需要的那种三维空间里的“质感”。

第一版导航栏

/// 第一版导航栏 ///

既然页面太平了,我决定从视觉修饰入手。

2.1 尝试一:用阴影塑造体积感(为何变成复古风?)

想要体积感,我的第一反应是加阴影。我接着让 AI 修改:

"给按键加上高光和内阴影,让它像凸出于控制台的独立实体按键。"

AI 反手就是一套让人眼花缭乱的 box-shadow。代码跑完一看,出来的不是想要的高级哑光按键,而是几个像果冻一样浮夸的反光块。这种纯靠阴影硬生生堆出来的立体感,带着一股浓浓的 90 年代老网页拟物风,跟现代冷峻的 UI 格格不入。

2.2 尝试二:全局变形带来的文字扭曲

阴影走不通,我换了个思路。真实的物理按键侧面通常是个梯形,我让 AI 试着调几何结构:

"利用 CSS 的 transform: skewX 把左右两方的按键倾斜一下,模拟出梯形的立体侧面感。"

问题又来了,skewX 是全局变形。按钮一倾斜,里面的文本和图标也跟着歪了,全变成了倒伏的斜体字。就算后来套了好几层 div,用负倾斜角度反向把字给“掰直”,这几个梯形依然让人觉得生硬。它们本质上还是二维平面画出来的形状,根本没有纵深。

到这里我明白了:想骗过眼睛制造出自然的深邃感,靠 2D 属性的小修小补不行,必须上纯正的 CSS 3D 透视(3D Transforms)

3. 引入 CSS 3D:从复杂计算到“大道至简”的顿悟

一开始想到要用代码做 3D 凹陷,我脑袋里浮现的是复杂的空间坐标系计算。

3.1 误区:各自改变偏转角带来的“扇面效应”

我想当然地以为,要做出“整体环抱”的效果,得让最左边的按键往右折一个角度,右边的按键往左折一个角度,中间再依次递减。因为我对 rotateY 的正负空间方向没搞清楚,实际跑出来的效果是:这几个按键不仅没有朝里收拢,反而像折扇一样朝外散开了,看着非常诡异。

就在我因为计算每个按钮的偏置角而焦头烂额时,顺嘴问了 AI 一句有没有更简化的思路。它的回答直接推翻了我的原有假设:根本不需要去单独计算每个按键的扭转角度。

核心代码仅仅只有一行:

transform: rotateX(25deg);

只要让所有的按键在 Z 轴上统一向后“躺倒” 25 度,再加上父容器视距(perspective: 600px),奇妙的作用就发生了。
借助浏览器底层自带的“近大远小”渲染规律,这排向后仰倒的平行块,在视野两端自然产生了向内收束的效果。完全不需要额外的计算。顺应物理引擎底层的机制,确实省下了大把不必要的逻辑折腾。

css 3D 统一透视图解

/// css 3D 统一透视图解 ///

3.2 细节:透视中心点(perspective-origin)的修正

查阅了一下 CSS 规范才知道,系统相机默认的观测中心(perspective-origin)是瞄死在父容器的正中心的。但在我这个页面结构里,为了适配手机端的滑动,左右两侧原本就留了不对称的 Padding(内边距留白)。因为观察点没对齐,原本往中间收束的透视自然就跑偏了。

跟 AI 解释了这个规律后,我们在最外层包围盒加了一句 perspective-origin: 50% -100px(相当于把虚拟摄影机固定在了屏幕水平中垂线上,并稍微调高点位置)。仅仅这一行,整个透视视角又回到了完美的对称状态。

3.3 破局:让 AI 梳理出一套完整的调参说明

大方向对了,可是这类视觉驱动的开发往往免不了要经历痛苦的“微调”。透视感是不是过深了?按键躺下的角度能不能浅个两度?
这时候如果你依然对着 AI 吼:“你再把它往上抬一点”,通常没两轮它就自己乱套了。这种属于“感官美学”的东西,大模型根本抓不到火候。

于是我试了一种极其顺手的人机协同路子:我不让 AI 去改代码了,我让它给我写说明书。
我让 AI 根据现在的面板结构,整理一份《前端交互核心参数对照速查》。当拿到那份清单——比如 perspective 从 400 到 1000px 对应什么样的视觉坡度,rotateX 决定什么样的基础面板切角,顶部 padding 如何改变整体重心高度——接下来的事情简单极了,我就像对照着图纸拧螺丝一样,自己把界面调到了舒服的程度。

AI 猜不透人类眼里那种绝对理想的审美标准,但它非常擅长抽丝剥茧。用它把玄学翻译成几组具体的参数控制器,剩下的手工作业,还是得真人来接管。

4. 两场不易察觉的前端体验打磨

骨架硬派了,但在组件完工之前,还有几个藏在暗处的底盘坑需要填满。

4.1 背景图纹理与多模块视图的统一融合

为了增加重机械的斑点质感,按键底部垫了一张做旧剥落设定的图片。
如果直接用 background-size: cover(等比铺满),图片的上下边缘极容易被裁掉。为了保住那点斑驳的纹理边缘,我放弃了等比缩放,而是强制让图片横向撑满(高度不切割)。

这时候坑就全露出来了。不同页面的组件非常容易错位:中间的仪表盘和底栏没有复用等量的左右 Padding(内边距)。一旦用户屏幕够大,本该严丝合缝的上下层模块立马断层割裂。这提醒我们在日常提问中,如果不刻意向模型申明“全局视野与上下文对齐”,它只会盯着眼下的那几十行代码猛敲。

4.2 Tailwind 摇树优化:消失的渐变炫光

在最终的点缀阶段,我给每个类目上了各自代表的主题亮色投影(比如知识库的蓝,音乐的绿)。配上 mix-blend-screen(滤色模式:一种让深色背景变透明、只留下亮光的特效),渲染出科技舱那种浮空光带。

尴尬的事情发生了:在本地开发看一切正常,可一旦打包推到线上网站时,五光十色的渐变全成了毫无生气的死灰白,而且浏览器也找不到任何报错。

硬扛着翻了 Tailwind(我们用的样式框架)的底层机制才明白原因。原来在项目“打包压缩”准备上线时,系统为了让网站加载更快,会自动开启 Tree Shaking(摇树优化)(Tree shaking,一种自动剔除未匹配代码的打包机制),就像摇树一样,把它认为没用的 CSS 样式“摇”掉剔除。

像这种 AI 极为推崇的动态简写代码:

jsx
// AI 喜欢这么写,自动拼接颜色名 className={`from-${color}-500/20`}

这是大家都爱用的字符串拼接。可问题就在这里:打包工具在分析代码时,压根没法提前猜出 ${color} 最后会变成 purple 还是 yellow。既然认不出这个连体名字,它索性就把这些彩色样式当成“废弃代码”全扫地出门了。

解决办法简单粗暴,就是放弃所谓的“高级动态拼接”,老老实实把每种颜色完整地写出来。比如:bg-gradient-to-b from-purple-900/60 to-purple-950/80。虽然代码看着稍微长了一点,但换回的是发布后的渲染稳若磐石,再也不会无故丢失样式。

4.3 交互体验:用看不见的“底层面具”解决悬停抽风

最后再提个折磨人的小毛病:鼠标悬停时的狂乱抖动。

在我的设想里,当光标置于按键上方,按钮本体会自动向上飘起 8 个像素并且发光。
但这引出了一个致命的错位:一旦鼠标移上去触发动画,按键立马往上飞。可按键一飞,它就脱离了鼠标光标当前停留的区域。浏览器判定鼠标“离开了”,于是按键又跌回原地;一跌回来,又恰好碰到底下的鼠标,于是再次起飞…… 这个死循环导致的结果,就是用户会看到按键在屏幕上疯狂地上下抽搐。

这是典型的视觉变化导致判定区域丢失的问题。这里有个极其干净优雅的解法:引入一层看不见的隐形感应底座(Hit Area Extender)

在按钮背后,我们神不知鬼不觉地垫了一个比它大一圈的透明盒子:

jsx
{/* 一个比按钮更大、永远静止不动的透明感应区 */} <div className="absolute -top-10 -bottom-10 -left-4 -right-4 z-0 bg-transparent" />

它比按键本身大,且永远钉在最底层不动,充当了鼠标事件的“避雷针”。自此以后,由于这个底座涵盖了足够的缓冲空间,用户光标实际上是触发在底层那个静止的隐形盒子上。无论上层的按键怎么飞、怎么动,底部的感应区稳如泰山,抽搐问题彻底解决。

5. 核心选型决策说明

复盘整个组件的折腾路:

功能需求
被验证的最终手段
排除的备选方案
为什么这么选
纵深物理感实现原生 rotateX 加上父级 perspective 透视。为每个按键计算不同 rotateY 偏转角的死办法。利用 CSS 3D 的原生机制自动实现近大远小,代码干净无冗余。
预防组件悬空时抖动失控静置的隐形判断延伸底板(Hit Area Extender)套壳挂载带延时的定时器防抖钩子我们用在视图本身的物理补件治视图乱飘的毛病,不随便牵来用处不大的额外 JS 负担。
背景多尺寸环境将宽尺寸强填拉伸。等比例遮盖(cover)。哪怕有点比例失调也要留住它图画角落最边缘的破旧边际。
类名动态打包防丢失机制放弃拼接直接强敲原生的字符串长词典依托模板字面内构建的高度插值我们更需要安全平稳的无声上线,所以放弃少许封装的艺术美学。

6. 从猜盲盒到拿捏变量

回头看看这个底部导航栏,仅仅几个按键,挖出的技术坑远超它在页面上的面积。

这也恰恰暴露出 AI 辅助设计的一个真相:如果你把“科技感”、“要质感”这种极其抽象的情感词汇全都扔给 AI,指望它像变魔术一样给你一套完美无缺的代码,最后必然会陷入相互听不懂的拉扯中。

对于这类强视觉导向的需求,我们需要转变人机协同的思路:**不要期望 AI 一次猜中你的审美,而是把它当成一个“控制面板生成器”。**你让它梳理出一份可调参数的清单或者说明册(比如某个值管倾斜,某个值管景深),然后你亲自动手,去把界面微调到最舒服的状态。

把模糊的黑箱,变成手里看得见、调得动的旋钮。只有这样,我们才能真正拿捏最终的作品体验。

核心复盘
遭遇的具体挑战
沉淀的实战认知
下一站
从平面文字究竟怎么演变为 3D 控制台?经历了模型曲解命令、视觉透视跑偏、动画疯狂抽搐,以及发布后神秘变灰的打包惨案。CSS 3D 透视法是降维打击、宁垫隐形底座不写 JS 防抖;最重要的一条:指挥 AI 提供《调节说明书》而非直接要最终代码。完成了这些花里胡哨的外壳,下一篇,我们要回归纯粹的阅读体验:博客正文页设计实录

下一篇:AI帮我造博客(八):文章页设计

📚 AI帮我造博客系列导航

上一篇:AI帮我造博客(六):零设计基础做首页——从蒙眼指挥到截图驱动的三轮进化
下一篇:AI帮我造博客(八):文章页设计(本系列持续更新,敬请关注)

END OF LOG_
ID: AI-BUILD