# 侧边栏修复说明
## 问题说明
原有的 `ReportSidebar.astro` 组件在窄屏幕(移动端)状态下存在以下问题:
1. 目录按钮点击无响应
2. 事件监听器绑定可能失效
3. 面板动画不流畅
## 修复内容
### 1. 修复了现有的 ReportSidebar 组件
位置:`src/components/report/ReportSidebar.astro`
**主要修复:**
- 增强了事件处理,添加 `preventDefault()` 和 `stopPropagation()`
- 改进了 `setCollapsed` 函数,确保移动端面板正确显示/隐藏
- 添加了键盘事件支持(ESC 键关闭)
- 增加了背景点击关闭功能
- 强化了事件监听器绑定机制
### 2. 创建了统一的脚本文件
新增文件:
- `src/scripts/toc-sidebar.ts` - 基于您提供代码风格的新TOC侧边栏
- `src/scripts/report-sidebar.ts` - 报告侧边栏增强脚本
### 3. 创建了新版本的 TOC 组件
新增文件:`src/components/common/TOCSidebar.astro`
基于您提供的代码创建,具有以下特性:
- 支持嵌套目录结构(h2, h3, h4)
- 响应式设计(桌面端和移动端)
- 玻璃质感UI设计
- 滚动高亮
- 折叠/展开功能
- 键盘导航支持
## 使用方法
### 方法1:使用修复后的 ReportSidebar
```astro
---
import ReportSidebar from '../../../components/report/ReportSidebar.astro';
---
```
### 方法2:使用新的 TOCSidebar 组件
```astro
---
import TOCSidebar from '../../../components/common/TOCSidebar.astro';
---
```
## 主要修复点
### 事件处理增强
```javascript
// 修复前
toggleBtn.addEventListener('click', handleToggle);
// 修复后
const handleToggleClick = (e) => {
e.preventDefault();
e.stopPropagation();
const isOpen = sidebar.classList.contains('toc-sidebar--open');
setSidebarOpen(!isOpen);
};
currentToggleBtn.addEventListener('click', handleToggleClick, { passive: false });
```
### 面板动画改进
```javascript
// 在移动端确保面板正确显示/隐藏
if (!mediaQuery.matches) {
if (isOpen) {
panel.style.transform = 'translateY(0)';
requestAnimationFrame(() => {
panel.style.transform = 'translateY(0)';
});
} else {
panel.style.transform = 'translateY(100%)';
}
}
```
### 强制重新绑定事件
```javascript
// 移除可能存在的旧事件监听器,重新绑定
const newToggleBtn = toggleBtn.cloneNode(true);
toggleBtn.parentNode.replaceChild(newToggleBtn, toggleBtn);
```
## 调试功能
在修复版本中添加了调试日志:
```javascript
console.log('Toggle clicked'); // 调试用
console.log('Close clicked'); // 调试用
```
可以在浏览器开发者工具中查看这些日志,确认事件是否正确触发。
## 测试建议
1. 在桌面端测试侧边栏展开/收起
2. 在移动端(设备宽度 < 1024px)测试按钮响应
3. 测试目录链接跳转功能
4. 测试滚动高亮效果
5. 测试键盘导航(ESC 键关闭)
## 样式特性
- 响应式断点:1024px
- 移动端:底部弹出式面板
- 桌面端:左侧固定侧边栏
- 玻璃质感设计,符合 Morandi 主题
- 安全区域适配(支持刘海屏等)