一个章节是怎么做出来的
以「同色异谱」这一章为例,从确定选题方向、资料核对、写大纲,到做交互演示、移动端适配,再到收尾发布,把整个流程和真实踩过的坑完整复盘一遍。重点不是结果,而是每一步的判断依据。
为什么用同色异谱复盘
这一章覆盖了一个章节会遇到的全部环节:抽象概念、必须查证的标准数据、两个从零写的交互演示、移动端布局陷阱、文案语气把控。流程跑通一遍,方法就能复用到下一章。
概念抽象
「不同光谱产生同一颜色」无法靠文字讲清楚,必须做出可以拖动、能看到颜色塌缩的演示。
数据要查证
CIE 色匹配函数、各光源光谱、ISO 同色异谱指数,都不能凭记忆,必须回到标准原文。
演示要可信
两个 Canvas 演示要让匹配真的成立又真的失效,背后是一套需要调参的数值模型。
确定选题方向
每篇文章先回答一个具体问题,而不是从名词百科开始。选题阶段只做两件事:把问题问对,把它挂到工作流上。
好选题:先有困惑
- 为什么手机屏看色卡总差一点
- 为什么不同人看同一台 OLED 颜色不一致
- Assign 和 Convert 为什么不是一回事
坏选题:名词罗列
- 同色异谱知识点汇总
- CIE 色度学参数介绍
- Metamerism Index 标准说明
同色异谱最终被定位成「色彩管理一切难题的根」——这句话决定了它在工作流里的位置:放在最前面的「基础」段,后面拍摄、后期、显示三段的问题都能回头挂到它身上。选题不只是定标题,更是定它和其他章节的关系。
资料核对与立论
涉及标准参数、格式、厂商曲线时必须查资料,不凭记忆写。引用优先级:ITU-R / SMPTE / ICC / W3C / 厂商官方文档。
必须查证的数据
CIE 1931 2° 色匹配函数(逐 5nm 的 x̄ ȳ z̄ 表)、D65/D50/A/F2 等光源光谱、ISO 18314-4 的同色异谱指数分级。这些直接写进了演示的计算核心,错一个数演示就不可信。
标注为「示意」的部分
演示里用三个高斯峰合成的光谱不是真实测量光谱,是为了让读者能拖动、能直观比较而设计的模型。页面里明确说明这是示意模型,避免被当成实测数据引用。
写大纲与章节结构
用项目推荐的结构搭骨架:问题场景 → 核心直觉 → 基础定义 → 可交互演示 → 工作流落地 → 常见误区 → 资料来源。每段只讲一个要点,先讲「为什么」再讲「公式是什么」。
问题场景
四个真实困惑(跨屏、打样、不同人看 OLED、相机偏色)先让读者认出自己被影响过。
核心直觉
一句话点破:人眼把无穷维光谱压成三维 XYZ,所以无穷多种光谱可以同色。
基础定义
只解释后文要用到的术语:三刺激值 / CMF、同色异谱匹配、Luther 条件。
五种失败
把抽象概念拆成光源、观察者、视场、几何、相机五类可识别的失效场景。
两个交互演示 + 工作流落地
演示 A 证明「不同光谱可同色」,演示 B 证明「换光源会失配」,再落到摄影/印刷/显示/HDR。
误区 + 资料来源
澄清常见误解,列出可点击的权威链接收尾。
做交互演示:最难也最容易翻车
交互图表是为了建立直觉,不是让页面显得复杂。坐标轴、单位、刻度、曲线来源都要标清楚。这一阶段的两个坑,是整章花时间最多的地方。
- 症状
- 用 B 给一个看起来不鲜艳的颜色,让 A 去匹配,怎么调都匹配不上。
- 原因
- A 用窄高斯峰、B 用宽高斯峰。振幅相同时,宽峰的积分能量是窄峰的 3–4 倍,A 永远追不上 B 的亮度。
- 修复
- 对高斯峰按面积归一化,让振幅直接等于总功率,宽窄峰就能对称匹配。
// 改前:振幅相同,宽峰积分能量是窄峰的 3–4 倍 → A 永远追不上 B sum += (amps[k] / 100) * gaussian(lam, peak.c, peak.w); // 改后:按面积归一化,振幅 = 总功率,宽窄峰可对称匹配 const norm = 1 / (peak.w * Math.sqrt(2 * Math.PI)); sum += (amps[k] / 100) * gaussian(lam, peak.c, peak.w) * norm;
- 症状
- 换光源后两个样本的色差只有 ΔE≈1.7,肉眼几乎看不出,失去教学冲击力。
- 原因
- 样本反射率太平、太亮,对波长不够敏感,换光源时颜色变化被平均掉了。
- 修复
- 把样本 A 设计成对波长高度选择性(黄橙窄峰、低底噪),样本 B 用三个分离峰。结果:D65 下 ΔE=0.48(匹配),换到白炽灯 A 光源 ΔE=6.72、F2 荧光 ΔE=4.35、商用 LED ΔE=4.62(明显失配)。
buildSPD()、planckianSPD()),不要写进绘图循环;演示的「成功」和「失败」都要能稳定复现,否则读者拖两下就破功。细节调整与移动端适配
桌面端写完只是一半。多列布局、Canvas 高度、滑块溢出在手机上都会出问题,必须用 375px 宽度逐项核查。
- 症状
- 图表在手机上只渲染成一条窄带,高度约 150px。
- 原因
canvas { height: 100% }需要父元素有明确的 height 才能解析;父元素只有min-height时百分比高度失效,canvas 回退到 HTML 默认的 150px。- 修复
- 把父元素的
min-height改成明确的height(或让父元素进入 grid/flex 由布局给出确定高度)。
/* 失效:父元素只有 min-height,canvas 塌回 150px */ .canvas-box { min-height: 240px; } canvas { height: 100%; } /* 有效:父元素给明确 height,height:100% 才能解析 */ .canvas-box { height: 240px; }
- 症状
- 媒体查询里写了单列规则,但手机上多列布局没折叠。
- 原因
- 原规则是
.parent .child(两级),媒体查询里只写.child(一级),优先级更低,覆盖不掉。 - 修复
- 媒体查询里用同等或更高优先级的选择器。
/* 不生效:优先级低于原规则 */ @media (max-width:560px){ .summary-chain{ grid-template-columns:1fr; } } /* 生效:保持同等优先级 */ @media (max-width:560px){ .gamma-summary .summary-chain{ grid-template-columns:1fr; } }
375px 发布前四项核查
1. 多列布局是否折叠为单列。 2. Canvas 实际渲染高度是否接近设计值,而不是 150px。 3. readout / tooltip 是否遮挡图表主体(加 max-width 限制)。 4. input[type=range] 是否在容器内、没有横向溢出(窄屏要 min-width:0; width:100%)。
收尾与发布
文案语气要克制、可验证,避免营销腔和 AI 腔。最后过一遍发布清单,确认入口接好。
优先用
- 观察者差异 / 明显偏差 / 显著上升
- 光谱限制 / 设计特征
- 形成完整工作链路
避免用
- 时代的新痛 / 踩坑翻车
- 奥秘 / 玄学 / 神器救命
- 突然连成一条线 / 物理学的代价
发布前清单
git status 只含本次要发布的文件可复用的方法论
把整章的流程压缩成三句话,下一章可以直接套用。
再有内容
每章开头是一个真实困惑,不是名词定义。选题阶段就把它挂到工作流上。
再有公式
交互演示先让读者看到现象,再给计算模型。示意算法和真实数据要分清。
看一眼再发布
375px 宽度逐项核查 Canvas 高度、网格折叠、滑块溢出,再走发布清单。
相关文档
这页是经验复盘,落地规范都写在项目文档里,新章节请以文档为准。