日期: 2026-09-01
状态: 已确认
范围: web-admin 主内容区业务列表(list-body + el-table/ListTable + list-pager-bar);弹窗内小表、小程序不在本期。
交互 Demo: docs/list-table-scroll-demo.html
用户反馈两个问题:
多数业务列表未给表格设定可视高度,整表随 #app-content 页面滚动:
规范 §7.6 与 fresh-mint-green.html 已描述 .table-scroll + max-height + sticky 表头,但业务落地不一致;部分模块(bx 等)仅有 overflow-x: auto、无高度约束,问题仍在。
| 项 | 结论 |
|---|---|
| 方案 | A:表体内嵌滚动(el-table / ListTable 动态 height) |
| 高度策略 | 尽量撑满视口;分页条始终可见;分页底边到内容区底留 10px |
| 不做 | 方案 B(页面滚 + 悬浮横条)、方案 C(顶部镜像横条)本期不做 |
| 非目标 | 弹窗内明细小表默认行为、小程序、改分页交互本身 |
#app-content 可视区域
│ 内容区 padding(现有,如 24px)
│ page-head / panel
│ filter-block(可选,高度可变)
│ list-toolbar
│ ┌─ 表(height = 动态)────────────┐
│ │ thead 固定在表体顶 │
│ │ tbody 纵向滚动 │
│ │ 横向滚动条贴表体可视区底部 │
│ └──────────────────────────────────┘
│ pagination.list-pager-bar(始终可见)
│ ░░░░░ 10px ░░░░░ ← 分页底边 → 内容区底
tableHeight = floor( contentViewportBottom - tableTop - pagerHeight - 10 )
tableHeight = max(tableHeight, MIN_HEIGHT) // 建议 MIN_HEIGHT = 240
#app-content)的可视底边(或等价测量点),而非整窗 window,避免顶栏/Tab 误差。.pagination.list-pager-bar 实际高度(含 padding);无分页时该项为 0,底隙 10px 仍保留在表底与内容区底之间。resizenextTick)ResizeObserver 观察筛选区、工具栏、分页条重算后对表格调用 doLayout()(若持有 ListTable/el-table ref)。
新增 composable,建议名:useListTableViewportHeight(路径:web-admin/src/composables/)。
输入(示意):
tableTop)pagerHeight;可空)minHeight(默认 240)、bottomGap(默认 10)#app-content)输出:
tableHeight: Ref<number> — 绑定 :height="tableHeight"recalc() — 供页面在筛选展开等时机手动触发不在 ListTable 内隐式写死高度(避免弹窗/嵌套表误伤);由列表页显式接入。
list-body.list-wrap → 表 → .pagination.list-pager-bar。:height="tableHeight"(优先 height 而非仅 max-height,以便空数据/少行时高度稳定)。.table-scroll 上设与表体冲突的 overflow-y: auto + 另一套 max-height(若保留 .table-scroll 仅作横向兜底,须与 EP 高度模式兼容,推荐 wrap 仅 min-width: 0)。fixed="right";滚动在 EP 内部时与现有全局「list-wrap 避免乱设 overflow:hidden」规则不冲突。| 现状 | 处理 |
|---|---|
规范 §7.6 max-height: min(520px, …) |
更新为「视口填满 − 分页 − 10px」,去掉写死 520px 作为主策略 |
bx .table-scroll { overflow-x: auto; overflow-y: hidden } |
接入动态 height 后,以 EP 内滚为准,避免双滚动容器 |
已有 :max-height="400" 等局部小表 |
弹窗/统计卡小表保持原样;仅主列表替换为视口高度策略 |
| 场景 | 行为 |
|---|---|
| 筛选展开导致表区过矮 | height 不低于 MIN_HEIGHT(240);超出部分由 #app-content 外层滚动 |
| 展开行 / 树表 | 内容在表体内滚动;展开/收起后 doLayout |
| 空数据 / 行很少 | 仍使用同一动态 height,避免空态高度跳动、横条位置不稳 |
| 无分页列表 | pagerHeight = 0,表底到内容区底留 10px;注意无分页时 list-wrap 圆角裁剪既有规则仍适用 |
| 窄屏 | 公式不变;内容区 padding 变化由测量自然消化 |
| 双表 / Tab 多列表 | 每个可见列表各自锚点 + 各自 height;隐藏 Tab 可暂停观察或显示时再算 |
docs/list-table-scroll-demo.html)对齐文案。ListTable 列表(如 system 模板页、bx/pl/db 已统一结构的列表)验证。ui-conventions 增加对应 SHALL(与 Fresh Mint 文档同步)。fixed="right"、勾选列表现正常。max-height)docs/list-table-scroll-demo.htmldocs/web-admin-ui-spec-fresh-mint.md §7.5–7.6docs/fresh-mint-green.html(.table-scroll)web-admin/src/components/business/list-table/index.vue