# Square Tab 滚动行为差异化设计 **日期**: 2026-06-11 **状态**: 已通过 spec 评审 **作者**: Claude (brainstorming session) ## 背景 `square.vue` 页面通过 `activeContentTab` 切换 星河 / 星榜 / 广场 三个内容。 当前所有 tab 共用同一个外层 ``, 导致三个 tab 的滚动行为完全一致:都是页面整体滚动。 需求:三个 tab 的滚动行为需要差异化: | Tab | 期望行为 | | --- | --- | | 星河 (`xinghe`) | 完全禁用滚动(外层 + 内部都不滚) | | 星榜 (`xingbang`) | 页面不滚动,只有 `HotCategoryBlock` 内部 grid 区域可滚 | | 广场 (`guangchang`) | 保持当前行为(外层 scroll-view 整体滚动) | ## 目标 1. 不重构页面骨架 2. 不修改 `StarGalaxy` 任何样式(保留 `top: -128rpx`、`min-height: 1440rpx` 等视觉设计) 3. 仅通过外层 `scroll-view` 的 `scroll-y` 动态绑定 + `HotCategoryBlock` 内部增加独立 scroll 容器达成 4. 切换 tab 时重置外层 scrollTop,避免残留滚动位置 ## 设计 ### 1. 模板改动 (`frontend/pages/square/square.vue`) 唯一改动:把 `` 上的 `scroll-y` 从静态改为动态绑定。 ```vue ``` **样式改动**:给 `.hot-category-wrapper` 固定高度,让 `HotCategoryBlock` 的内部 scroll 有边界: ```scss .hot-category-wrapper { position: relative; /* 100vh - header(208rpx) - banner(360rpx) - tabs(88rpx) = 可用 body 高度 */ height: calc(100vh - 208rpx - 360rpx - 88rpx); } ``` ### 2. HotCategoryBlock 内部改造 (`frontend/pages/square/components/HotCategoryBlock.vue`) 把 grid 区域(loading 骨架 / items-grid)包到一个新的内部 `` 中。 **模板改动**: ```vue ``` **样式改动**: ```scss .hot-category-block { height: 100%; display: flex; flex-direction: column; overflow: hidden; } .content-scroll { flex: 1; min-height: 0; /* flex 子项需要 min-height: 0 才能正确伸缩 */ overflow: hidden; } ``` ### 3. 切换 tab 时重置 scrollTop 在 `square.vue` 的 `