This commit is contained in:
oneao committed 2026-10-17 17:17:39 +08:00
1 parent 025d3232c4
commit 1d7d75eeba
98 files changed
+4144 -12063

No files matched your search

@@ -85,85 +85,13 @@ description: 组件库的字号、字重、行高与数字对齐约定,以及
实测比文字中心高约 1.5px。按钮自身的 `align-items: center` 只能居中 `span` 这一层,
治不了 `span` **内部**的基线对齐。
## 数值列:等宽数字
金额、数量、单号、序号这类列要加 `font-variant-numeric: tabular-nums`。
比例数字(默认)里每个字形宽度不同,`1` 比 `8` 窄,于是每换一行小数点与个位
就在水平方向抖一下,整列看着参差不齐。等宽数字把 0–9 钉成同一宽度,数字按位对齐。
`G3Table` 已经在组件内部处理好,**业务方不需要自己加**:
```scss
.g3-table__inner td.text-r {
font-variant-numeric: tabular-nums;
}
```
判据是**右对齐**而不是「内容是数字」:库渲染 `td` 时读不到单元格的值,而本库约定里
金额/数量/数值列一律用 `align: 'right'` 声明(见 `docs/examples/table/*.vue`)。
⚠️ 类名是 `text-r`,由 `stk-table-vue` 的 `getTDProps` 打上:
| `col.align` | 类名 |
|---|---|
| `'right'` | `text-r` |
| `'center'` | `text-c` |
| `'left'`(默认) | **不带类** |
左对齐的列没有任何类,所以 `td.text-r` 不会误伤普通文本列 —— 中文与拉丁文本来就
不需要等宽数字,强行套上去反而会让正文字距松散。
## 表格边框:外框与格线的归属
`G3Table` 的外框(1px 描边 + 8px 圆角)由组件**自绘**在根节点上,格线仍走底座的
`background-image` 渐变。这套组合下,有两条线容易画重或画丢,判据按下面的来。
**为什么格线不能改成真 `border`**:行内编辑器被钉死在 `var(--row-height)`(默认 30px),
而 `td` 高度是按内容撑开的 —— 一旦 `td` 多出 1px 边线,内容盒只剩 29px 放不下 30px 的
编辑器,整行被顶到 31px。行高是虚拟滚动 `translateY` 的计算基准,涨 1px 会一路累积成
行错位。**背景渐变不参与盒模型**,所以格线只能走 `background-image`。
### 最右列竖线:按「是否贴住内右缘」判断
| 情形 | 处理 | 原因 |
|---|---|---|
| 右固定列(`.fixed-cell--right`) | 摘掉自身右线,交给外框 | 它贴住容器内右缘,自己的线会与外框叠成两条 |
| 普通末列 | **保留**自身右线 | 列宽没铺满时它离内缘还有距离,摘了就「线凭空消失」 |
实测:右固定列的 `th`/`td` 右边缘都在内缘上(1242px)且自带 `270deg` 渐变;
而列宽未铺满的表(容器内宽 1084px、列只到 800px)末列离内缘差 284px。
### 最后一行横线:按「行区是否铺满」判断
这是**唯一需要 JS 参与**的一处 —— 纯 CSS 表达不了「行区高度是否等于可用高度」。
组件侧量出行区是否铺满,用 `.g3-table.is-body-fill` 把结论传进来:
| 行区状态 | 最后一行底边线 | 原因 |
|---|---|---|
| 铺满 | 交给外框 | 两者重合,否则叠成 2px |
| 未铺满 | **该行自己画** | 外框内底边在它下面很远,摘了就缺线 |
⚠️ 判据**不能**是「是不是最后一行」(`tr:last-child`)。实测 180px 高的容器里只放
1 行 30px 数据时,该行底边在 440px、外框内底边在 554px —— **差 114px 根本够不着**,
此时摘线等于那唯一一条分隔线消失。这两个条件只有行区铺满时才等价。
### 空态
库的 `.stk-table-no-data.no-data-full` 会撑满剩余高度并**自带一条 `border-bottom`**,
与外框的 `border-bottom` 落在同一条 y 上(实测都在 218px)→ 底部出现重叠线。
组件已移除它自带的底边,**空态底边统一归外框**。
> 以上都由组件内部处理,业务方不需要写任何样式。若自定义了 `--g3-border-color`,
> 外框与格线会一起跟随。
## 硬规定
| 项 | 取值 | 原因 |
|---|---|---|
| 字号 | `12 / 14 / 16`(偶数) | 避开 `13 / 15`:Windows 125% / 150% 缩放下奇数字号的亚像素误差会被放大 |
| 控件高度 | `24 / 32 / 40`(8 的倍数) | 与栅格对齐,缩放后不易出现半像素 |
| 数字列 | `tabular-nums` | 见上 |
| 数字列 | `tabular-nums` | 等宽数字按位对齐,列不随数字宽度抖动 |
字号与控件高度已由 `@g3soft/tokens` 提供:`--g3-font-size-sm/-/lg`、
`--g3-control-height-sm/-/lg`。
@@ -195,7 +123,7 @@ description: 组件库的字号、字重、行高与数字对齐约定,以及
## 自测
改动字体栈或行高后,**整行的基线与行高都会重算**,必须把所有小尺寸组件回归一遍
(按钮三档尺寸、标签、分段控制器、分页器、表格行内编辑器)。
(按钮三档尺寸、标签、分段控制器、分页器)。
- 定性:playground 里逐个尺寸目视比对
- 定量:`FontMetrics` API 可读浏览器实际采用的度量,但**它给不出「这行实际用了哪款字体」**
@@ -207,5 +135,3 @@ description: 组件库的字号、字重、行高与数字对齐约定,以及
- 跨 OS 像素级一致**做不到**,见页首结论。
- 翻译成 `ar` 等语言时字体栈需另行调整(语言包目前只有 `zhCN` / `enUS`)。
- 若业务方覆盖了 `--g3-font-family`,`G3Table` 内部硬编码的 `font-size` 不受影响,
但行高与基线会变 —— 需重新回归。