
Linear 顶部导航栏隐藏着一套基于 ResizeObserver 的容器级自适应系统——它决定了哪些元素精准消失,以及为什么用 visibility:hidden 而非 display:none。
| 区域 | 位置 | 职责 |
|---|---|---|
| Title | 左侧 | 上下文感知面包屑:当前位置的路径导航 |
| Tabs | 中间 | 当前视图可切换的标签页,可自适应隐藏 |
| Side | 右侧 | 快捷操作图标按钮组(筛选、设置等) |
| Subheader | 下方第二行 | 过滤器栏,在当前视图支持时显示 |
ResizeObserver API 持续监听 Header 区域的尺寸变化,实时计算能容纳几个 Tab 项。priority 属性向一个 MobX store(前端状态管理库,负责追踪 UI 的实时状态)注册自己的「优先级」,当空间不足时,低优先级的 Tab 先消失,高优先级的始终可见。这让 UI 的折叠行为变成了一个可配置的优先级队列,而不是死板的「前 N 个可见、后面都折叠」。visibility: hidden 而非 display: nonedisplay: none:元素从布局中完全移除,其他元素会填充它原来的位置 → 引发布局重排visibility: hidden:元素不可见,但仍占据原来的空间 → 布局不变visibility: hidden。这意味着在 ResizeObserver 测量期间,所有 Tab 的尺寸数据仍然准确(元素还在,只是透明的)。测量完成、「More」按钮尺寸确定之后,才真正决定哪些 Tab 从 DOM 上消失。visibility: hidden 保留布局位置,使得这个拖拽交互不需要特殊处理折叠态。display: none 做不到这一点。ResizeObserver 监听容器宽度而非浏览器视口宽度——这一选择让同一个 Header 组件在嵌套布局、侧边栏展开/收起等场景下都能正确运作,不需要为每种布局写额外的断点规则。如果你的产品有「可变侧边栏 + 主内容区组件」的布局,这个方向值得参考。visibility: hidden 的保留布局空间,让测量、拖拽、动画都能基于真实 DOM 状态运作,避免了「移除→重算→插回」的多步抖动。任何需要在「隐藏状态下仍需准确测量尺寸」的场景,这一区别都会显现出来。pustelto.com
saasui.design
blakecrosley.com
vercel.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.