# UI优化 - 自动跟随滚动位置优化 v3.13.5.3

## 📋 问题描述

### 用户反馈
在批量任务执行时，开启"自动跟随"功能后：
- ❌ 正在执行的卡片只显示在屏幕最顶部一点点
- ❌ 看不到周围的上下文（已完成和待执行的卡片）
- ❌ 视觉效果不够直观

### 期望效果
- ✅ 正在执行的卡片显示在更合适的位置
- ✅ 能看到上面一些已完成的卡片（提供上下文）
- ✅ 能看到下面更多待执行的卡片（了解进度）
- ✅ 整体视觉效果更好

---

## 🔍 原因分析

### 原有实现
```javascript
// 旧代码：将目标卡片居中显示
const itemTop = row * props.itemHeight
const containerCenter = containerHeight.value / 2
const targetScrollTop = Math.max(0, itemTop - containerCenter + props.itemHeight / 2)
```

**问题：**
- 居中显示虽然看起来合理，但实际体验不佳
- 如果卡片在列表末尾，居中可能导致下方空白过多
- 用户看不到足够的上下文信息
- 滚动幅度可能过大，视觉突兀

---

## 🔧 优化方案

### 新的滚动逻辑
将正在执行的卡片显示在 **视口的上3/4位置**

**优势：**
1. **完整历史** - 显示3/4高度的已完成卡片，提供完整的历史记录
2. **醒目位置** - 正在执行的卡片在较下方的醒目位置
3. **简洁预览** - 显示1/4高度的待执行卡片，避免信息过载
4. **专注当前** - 用户可以更专注于当前执行的任务和已完成的进度

### 实施代码
**文件：** `src/components/VirtualScrollList.vue`

```javascript
// 滚动到指定索引的item，显示在视口上3/4位置（优化后的自动跟随效果）
const scrollToIndex = (index, behavior = 'smooth') => {
  if (!containerRef.value) return
  
  // 计算该索引所在的行
  const row = Math.floor(index / columnsPerRow.value)
  
  // 🎯 优化：将目标项显示在视口的上3/4位置
  // 这样可以：
  // 1. 上方显示大量已完成的卡片（完整的历史记录）
  // 2. 正在执行的卡片在较下方的醒目位置
  // 3. 下方保留少量空间显示即将执行的卡片
  const itemTop = row * props.itemHeight
  const viewportThreeQuarters = (containerHeight.value * 3) / 4  // 视口的3/4位置
  const targetScrollTop = Math.max(0, itemTop - viewportThreeQuarters)
  
  containerRef.value.scrollTo({
    top: targetScrollTop,
    behavior
  })
}
```

---

## 📊 效果对比

### 优化前（居中显示）
```
┌─────────────────────────────────┐
│                                 │ 上方空白或少量卡片
│                                 │
│    ┌─────────────────────┐     │
│    │  正在执行的卡片      │     │ ← 居中位置
│    └─────────────────────┘     │
│                                 │
│                                 │ 下方空白或少量卡片
└─────────────────────────────────┘
```
**问题：** 上下文信息少，不够直观

### 优化后（上3/4位置）
```
┌─────────────────────────────────┐
│    ┌─────────────────────┐     │
│    │  已完成的卡片1       │     │
│    └─────────────────────┘     │
│    ┌─────────────────────┐     │
│    │  已完成的卡片2       │     │
│    └─────────────────────┘     │ 上方3/4高度
│    ┌─────────────────────┐     │ 显示已完成的卡片
│    │  已完成的卡片3       │     │ （更多历史记录）
│    └─────────────────────┘     │
│    ┌─────────────────────┐     │
│    │  已完成的卡片4       │     │
│    └─────────────────────┘     │
├─────────────────────────────────┤ ← 3/4分界线
│    ┌─────────────────────┐     │
│    │  正在执行的卡片      │     │ ← 醒目位置
│    └─────────────────────┘     │
│    ┌─────────────────────┐     │ 下方1/4高度
│    │  待执行的卡片1       │     │ 显示即将执行的卡片
│    └─────────────────────┘     │
└─────────────────────────────────┘
```
**优势：** 完整历史记录，专注当前任务，简洁预览

---

## 🎯 使用效果

### 实际场景（900个token批量任务）

#### 任务开始阶段
- ✅ 第1-3个token执行时，显示在顶部（因为上方没有足够卡片）
- ✅ 第4个token开始，上方显示已完成的历史记录

#### 任务进行中（最佳体验阶段）
- ✅ 上方：看到大量已完成的卡片（6-10个，绿色"已完成"）
- ✅ 当前：正在执行的卡片（蓝色"执行中"）在较下方的醒目位置
- ✅ 下方：看到1-2个即将执行的卡片（灰色"待执行"）

#### 任务尾声阶段
- ✅ 可以看到大量已完成的卡片在上方（完整的执行历史）
- ✅ 最后几个执行的卡片依然在醒目位置
- ✅ 下方空间逐渐减少，清晰传达任务即将完成的信息

---

## 💡 其他优化建议

### 1. 视觉高亮（可选）
可以考虑为正在执行的卡片添加更明显的视觉提示：
```css
/* 正在执行的卡片添加发光效果 */
.executing-card {
  box-shadow: 0 0 20px rgba(103, 126, 234, 0.6);
  border: 2px solid #677eea;
}
```

### 2. 滚动速度调整（可选）
可以调整滚动动画时长：
```javascript
containerRef.value.scrollTo({
  top: targetScrollTop,
  behavior: 'smooth'  // 或者使用 'auto' 实现瞬间滚动
})
```

### 3. 可配置的滚动位置（未来）
允许用户自定义正在执行卡片的显示位置：
- 上1/2位置（看到更多下方卡片）
- 上2/3位置（平衡视图）
- 上3/4位置（默认，更多历史记录）

---

## 📝 技术说明

### 滚动位置计算
```javascript
// 计算公式
itemTop = row × itemHeight                           // 卡片顶部位置
viewportThreeQuarters = (containerHeight × 3) / 4    // 视口3/4高度
targetScrollTop = itemTop - viewportThreeQuarters    // 目标滚动位置

// 示例（假设卡片高度220px，视口高度900px）
// 第10个卡片（第10行）
itemTop = 10 × 220 = 2200px
viewportThreeQuarters = (900 × 3) / 4 = 675px
targetScrollTop = 2200 - 675 = 1525px
// 结果：容器滚动到1525px，第10个卡片显示在距离顶部675px的位置（3/4位置）
```

### Grid布局适配
代码已考虑Grid布局的列数：
```javascript
const row = Math.floor(index / columnsPerRow.value)
```
- 1列布局：index 0 → row 0
- 5列布局：index 10 → row 2（第3行）
- 自动适配不同屏幕宽度

---

## 🧪 测试建议

### 测试场景
1. **小批量测试（10-20个token）**
   - 观察开始阶段的滚动效果
   - 验证上方没有卡片时的表现

2. **中批量测试（100个token）**
   - 观察中间阶段的上下文显示
   - 验证滚动是否平滑

3. **大批量测试（500-900个token）**
   - 观察尾声阶段的效果
   - 验证性能是否流畅

### 预期结果
- ✅ 滚动位置合适，能看到上下文
- ✅ 滚动动画平滑，不卡顿
- ✅ 自动跟随开关正常工作
- ✅ 手动滚动时自动停止跟随

---

## 🎨 用户体验提升

### 优化前的问题
- ❌ "怎么只看到一点点？"
- ❌ "不知道前面执行了什么"
- ❌ "看不到后面还有多少任务"

### 优化后的体验
- ✅ "一眼就能看到正在执行哪个"
- ✅ "能看到前面完成了哪些"
- ✅ "能看到后面还有什么任务"
- ✅ "整体进度一目了然"

---

## 🔄 后续优化方向

### 短期（v3.14）
- [ ] 添加正在执行卡片的高亮效果
- [ ] 优化滚动动画曲线
- [ ] 添加滚动位置的用户配置

### 中期（v3.15）
- [ ] 支持键盘快捷键（上/下箭头）手动切换关注的卡片
- [ ] 添加"跳转到首个失败"功能
- [ ] 记住用户的滚动偏好

### 长期（v3.16+）
- [ ] 支持多种滚动模式（跟随最新、跟随首个执行中、跟随失败）
- [ ] 添加小地图导航（显示整体进度，点击跳转）
- [ ] 智能预测滚动（根据执行速度预判）

---

## 📌 版本信息
- **版本号：** v3.13.5.3
- **优化类型：** UI/UX 优化
- **影响范围：** 批量任务执行的自动跟随功能
- **向后兼容：** ✅ 完全兼容
- **用户操作：** 无需任何配置，自动生效

## 📚 相关文档
- [性能优化总结 v3.13.5](./性能优化总结v3.13.5.md)
- [问题修复-WebSocket连接关闭错误 v3.13.5.2](./问题修复-WebSocket连接关闭错误v3.13.5.2.md)
- [UI优化-滚动视觉提示增强 v3.11.19](./UI优化-滚动视觉提示增强v3.11.19.md)

