feat(chart): add multi-axis overlay controls

This commit is contained in:
李启源
2026-07-20 15:35:19 +08:00
parent 0cab86f7b6
commit c9e4dae25f
44 changed files with 1882 additions and 523 deletions

View File

@@ -5,9 +5,11 @@
在"多道紧凑"compact模式下当多个波形轨道叠加显示时Y 轴标签会出现重叠现象,导致标签无法阅读。
### 问题截图位置
- 红色标记处Y 轴标签 "BT2_2M" 和 "BT1_2M" 重叠
### 根本原因
1. 紧凑模式下,每个轨道的高度被压缩以容纳更多波形
2. Y 轴标签是垂直旋转放置的,每个标签需要约 80px 的高度空间
3. 当轨道高度 < 80px 相邻轨道的标签会发生重叠
@@ -47,12 +49,12 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
#### 显示规则
| 轨道高度 | 显示策略 | 示例 |
|----------|---------|------|
| 80px | 显示所有标签 | 轨道 0, 1, 2, 3 都显示 |
| 40-79px | 每隔 1 个显示 | 轨道 0, 2, 4 显示 |
| 27-39px | 每隔 2 个显示 | 轨道 0, 3, 6 显示 |
| < 27px | 每隔 3+ 个显示 | 轨道 0, 4, 8 显示 |
| 轨道高度 | 显示策略 | 示例 |
| -------- | -------------- | ---------------------- |
| 80px | 显示所有标签 | 轨道 0, 1, 2, 3 都显示 |
| 40-79px | 每隔 1 个显示 | 轨道 0, 2, 4 显示 |
| 27-39px | 每隔 2 个显示 | 轨道 0, 3, 6 显示 |
| < 27px | 每隔 3+ 个显示 | 轨道 0, 4, 8 显示 |
---
@@ -107,6 +109,7 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
## 📊 效果对比
### 修复前
```
轨道 0: BT2_2M ← 标签
轨道 1: BT1_2M ← 标签 ⚠️ 与轨道 0 重叠
@@ -114,6 +117,7 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
```
### 修复后(轨道高度 40px
```
轨道 0: BT2_2M ← 显示标签 ✅
轨道 1: ← 隐藏标签 ✅
@@ -125,6 +129,7 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
## 🧪 测试验证
### 测试结果
```bash
✅ 所有测试通过 (24/24)
✅ TypeScript 类型检查通过
@@ -134,24 +139,29 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
### 手动测试场景
#### 场景 1独立坐标模式
- **预期**: 所有标签都显示轨道高度通常 > 80px
- **结果**: ✅ 符合预期
#### 场景 2多道分离模式
- **预期**: 所有标签都显示(轨道间有间隔)
- **结果**: ✅ 符合预期
#### 场景 3多道紧凑模式 - 2 个轨道
- **轨道高度**: ~200px
- **预期**: 两个标签都显示
- **结果**: ✅ 符合预期
#### 场景 4多道紧凑模式 - 5 个轨道
- **轨道高度**: ~60px
- **预期**: 显示轨道 0, 2, 4 的标签
- **结果**: ✅ 符合预期,无重叠
#### 场景 5多道紧凑模式 - 10 个轨道
- **轨道高度**: ~30px
- **预期**: 显示轨道 0, 3, 6, 9 的标签
- **结果**: ✅ 符合预期,无重叠
@@ -161,21 +171,25 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
## 💡 设计考量
### 为什么不直接缩小字体?
- ❌ 字体太小难以阅读
- ❌ 仍然会重叠(只是延迟问题)
- ✅ 间隔显示更清晰
### 为什么不使用横向布局?
- ❌ 横向标签占用更多水平空间
- ❌ 会与波形图重叠
- ✅ 垂直标签是行业标准
### 为什么使用间隔显示而不是全部隐藏?
- ❌ 全部隐藏用户无法识别波形
- ✅ 间隔显示保留关键信息
- ✅ 用户可以通过显示的标签推断其他波形
### 为什么添加背景?
- ✅ 提高标签与网格线的对比度
- ✅ 防止标签与波形线重叠时难以阅读
- ✅ 视觉层次更清晰
@@ -185,6 +199,7 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
## 🚀 未来优化方向
### 短期(可选)
1. **悬浮显示完整信息**
- 鼠标悬浮在轨道上时,显示该轨道的完整标签
- 使用 Tooltip 或临时文本
@@ -194,6 +209,7 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
- 完整名称通过 title 属性提供
### 中期(可选)
3. **可配置阈值**
- 允许用户自定义 `MIN_HEIGHT_FOR_LABEL`
- 添加 props: `minLabelHeight?: number`
@@ -203,6 +219,7 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
- 保持在可读范围内10-14px
### 长期(可选)
5. **外部标签面板**
- 在图表右侧添加独立的标签列表
- 点击标签高亮对应波形
@@ -215,22 +232,25 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
### 文件:`src/components/WaveformChart.vue`
#### 1. 新增函数(+26 行)
```typescript
function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean {
const MIN_HEIGHT_FOR_LABEL = 80
if (trackHeight >= MIN_HEIGHT_FOR_LABEL) return true
const labelSpacing = Math.ceil(MIN_HEIGHT_FOR_LABEL / trackHeight)
return trackIndex % labelSpacing === 0
}
```
#### 2. 更新模板(修改 15 行)
- 添加条件判断 `shouldShowYAxisLabel(track.height, track.index)`
- 使用 `<g>` 包裹标签和背景
- 添加标签背景 `<rect class="waveform-chart__y-axis-label-bg">`
#### 3. 新增样式(+5 行)
```css
.waveform-chart__y-axis-label-bg {
fill: white;
@@ -240,6 +260,7 @@ function shouldShowYAxisLabel(trackHeight: number, trackIndex: number): boolean
```
### 总代码变更
- **新增**: 46 行
- **修改**: 15 行
- **删除**: 10 行