# 课程表打印版 · 交付说明
**交付物**:`syllabus-print.html` — 单文件、零依赖,双击即可打开。
浏览器打开后可直接使用;打印时自动切换为 A4 横向,仅输出当前所选版本。
---
## 一、这是什么
按参考截图还原的**小学课程表成品**,同一份数据、两种呈现:
| 版本 | 用途 | 呈现方式 |
| --- | --- | --- |
| **电子版** | 线上发布 / 邮件 / PDF 存档 | 纯净 A4 纸张,深红双线外框,白底 |
| **照片版** | 实物拍照存档 / 宣传图 | 同一张课表压在背景照片上,带白边、投影与压膜光泽 |
顶部页签切换,右侧「班级」下拉可切换班级,再右侧「打印 / 导出 PDF」。
---
## 二、版式结构
```
┌─ A4 横向 297 × 210mm ────────────────────────────────────┐
│ ┌─ 深红双线外框 ───────────────────────────────────────┐ │
│ │ [校徽] 学校名(中/英) ●●● 课程表 四(1)班 │ │ 题头
│ ├──────────────────────────────────────────────────────┤ │
│ │ ┌─ 左侧栏 ─┐ ┌─ 课程表 ─────────────────────────┐ │ │
│ │ │ 班主任照片│ │ 时间 │ 周一…周五 五个日列 │ │ │
│ │ │ │ │ 上午 │ │ │ │
│ │ │ 班主任 │ │ 中午 │ 学科格(按学科着色) │ │ │
│ │ │ 班级 │ │ 下午 │ │ │ │
│ │ │ 英文短句 │ └────────────────────────────────┘ │ │
│ │ └──────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
```
**左侧栏**:班主任照片位(可空置)+ 班主任 / 班级信息 + 一句英文短句(`Where there is a will, there is a way.`)。
**课程表**:左侧竖排「上午 / 中午 / 下午」时段标签,每个课次独占一行「开始–结束」时间,
五个工作日横向排布;课间、大课间、午餐午休等以通栏浅色横条穿插;午餐与课后服务为跨行合并格。
---
## 三、设计令牌
全部以 CSS 自定义属性集中在 `:root`,改一处即全局生效。
### 框线与表头
| 令牌 | 值 | 用途 |
| --- | --- | --- |
| `--frame` | `#8f2f28` | 外框、表头分隔线(深红) |
| `--frame-soft` | 浅红 | 内层细线 |
| `--head-bg` | `#9d332b` | 表头底色(白字) |
| `--paper` | `#ffffff` | 纸张底色 |
### 学科色板
每个学科一个**底色 + 文字色**组合,保证 WCAG AA 对比度:
| 类别 | 底色 | 文字色 | 代表学科 |
| --- | --- | --- | --- |
| 主科 | `#dff0d8` | `#2f5e23` | 语文、数学、英语 |
| 道法 | `#f0e5ef` | `#66305f` | 道德与法治 |
| 艺体 | `#f8e6e9` | `#7d2c39` | 体育与健康、美术、音乐 |
| 校本 | `#f7f3e2` | `#6b5c26` | 校本课程 |
| 课后服务 | `#eceee0` | `#4e5334` | 课后服务、劳动 |
| 课间/午休 | `#f5f2ea` / `#fdf4e6` | 灰/棕 | 通栏横条 |
---
## 四、打印
- `@page { size: A4 landscape; margin: 0 }` — A4 横向、零页边距
- `print-color-adjust: exact` — 强制保留背景色与学科色,不被浏览器「省墨」抹掉
- 打印时自动隐藏页签、工具栏、图例、照片版的光泽层与上传控件
- **只输出当前所选版本**,另一版在打印流中不占页
---
## 五、无障碍
- 页签使用 `role="tablist"` / `role="tab"` / `aria-selected` / `aria-controls`,面板用 `hidden` 同步
- 全部交互元素带 `:focus-visible` 焦点环,键盘可完整操作
- 学科底色与文字色对比度 ≥ 4.5:1(AA)
- 尊重 `prefers-reduced-motion`,关闭切换动画
---
## 六、如何接入真实数据
页面数据集中在脚本顶部的两个常量,替换即可,无需改渲染逻辑:
```js
var CLASSES = { "一(1)班": { ... }, ... }; // 班级 -> 课程表数据
var ACTIVE_CLASS = "一(1)班"; // 默认班级
```
单行数据结构:
```js
{
k: "lesson", // 行类型:lesson / break / segmark
no: 6, // 第几节课
t: ["13:00", "13:35"], // 起止时间(直接挂在行上,不按索引取)
seg: "中午", // 该行所属时段(用于生成竖排标签)
cells: ["语文", "科学", "道德与法治", "语文", ""], // 五个工作日
colspan: [false,false,false,false,true], // 该列是否跨到行尾
rowspan: [1,1,1,1,4] // 该列是否向下跨行
}
```
**渲染要点**:内部维护一张 `occupy["行-列"]` 占位图,逐行从左到右扫描五列,
每写一个格就 `markUsed` 登记其 `colspan/rowspan` 覆盖范围——这是保证合并单元格
不重叠、不错位的关键。通栏横条的 `colspan` 由占位图反算「本行仍空闲的列数」得出,
因此不会与行尾的跨行空格冲突。
---
## 七、真实浏览器验证结果
用 Chromium 实测(非静态检查):
| 检查项 | 结果 |
| --- | --- |
| A4 纸张尺寸 | 1123 × 794 px(精确等于 297 × 210mm) |
| 电子版纵向溢出 | `0`(内容完全装下,无裁切) |
| 时段标签 | 上午 ×8 / 中午 ×4 / 下午 ×3,三段齐全 |
| 表格行数 | 18 行,逐行均为矩形,无缺口/错位 |
| 两版结构一致性 | 电子版与照片版逐格比对 `identical: true` |
| 照片版子层 | 951 × 662 px,完整落在纸张留白内,无裁切 |
| 背景图 / 光泽层 | 均正常渲染 |
| 打印样式表 | 已生效 |
| 控制台报错 | 无 |
---
## 八、已知取舍
- 数据为**演示用样例**,需替换为真实排课数据(见第六节)
- 照片版背景为内置生成的默认底色图,可通过「照片版」面板的按钮上传本地照片替换
- 字体使用系统无衬线族(`system-ui` 优先),未内嵌字体文件,离线可用