Making of · 制作复盘

一个章节是怎么做出来的

以「同色异谱」这一章为例,从确定选题方向、资料核对、写大纲,到做交互演示、移动端适配,再到收尾发布,把整个流程和真实踩过的坑完整复盘一遍。重点不是结果,而是每一步的判断依据。

开场

为什么用同色异谱复盘

这一章覆盖了一个章节会遇到的全部环节:抽象概念、必须查证的标准数据、两个从零写的交互演示、移动端布局陷阱、文案语气把控。流程跑通一遍,方法就能复用到下一章。

本项目的定位是技术科普 + 工作流说明,不是参数百科。所有方法都服务于一个目标:让读者建立直觉,而不是记住名词。
这章的难点

概念抽象

「不同光谱产生同一颜色」无法靠文字讲清楚,必须做出可以拖动、能看到颜色塌缩的演示。

这章的难点

数据要查证

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 的同色异谱指数分级。这些直接写进了演示的计算核心,错一个数演示就不可信。

标注为「示意」的部分

演示里用三个高斯峰合成的光谱不是真实测量光谱,是为了让读者能拖动、能直观比较而设计的模型。页面里明确说明这是示意模型,避免被当成实测数据引用。

第三阶段

写大纲与章节结构

用项目推荐的结构搭骨架:问题场景 → 核心直觉 → 基础定义 → 可交互演示 → 工作流落地 → 常见误区 → 资料来源。每段只讲一个要点,先讲「为什么」再讲「公式是什么」。

1

问题场景

四个真实困惑(跨屏、打样、不同人看 OLED、相机偏色)先让读者认出自己被影响过。

2

核心直觉

一句话点破:人眼把无穷维光谱压成三维 XYZ,所以无穷多种光谱可以同色。

3

基础定义

只解释后文要用到的术语:三刺激值 / CMF、同色异谱匹配、Luther 条件。

4

五种失败

把抽象概念拆成光源、观察者、视场、几何、相机五类可识别的失效场景。

5–7

两个交互演示 + 工作流落地

演示 A 证明「不同光谱可同色」,演示 B 证明「换光源会失配」,再落到摄影/印刷/显示/HDR。

8–10

误区 + 资料来源

澄清常见误解,列出可点击的权威链接收尾。

第四阶段

做交互演示:最难也最容易翻车

交互图表是为了建立直觉,不是让页面显得复杂。坐标轴、单位、刻度、曲线来源都要标清楚。这一阶段的两个坑,是整章花时间最多的地方。

坑 1 · 演示 A 的匹配不对称
症状
用 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;
坑 2 · 演示 B 换光源后 ΔE 不够明显
症状
换光源后两个样本的色差只有 Δ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 宽度逐项核查。

坑 3 · Canvas 在手机上塌成 150px
症状
图表在手机上只渲染成一条窄带,高度约 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; }
坑 4 · 媒体查询里的选择器优先级
症状
媒体查询里写了单列规则,但手机上多列布局没折叠。
原因
原规则是 .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 腔。最后过一遍发布清单,确认入口接好。

优先用

  • 观察者差异 / 明显偏差 / 显著上升
  • 光谱限制 / 设计特征
  • 形成完整工作链路

避免用

  • 时代的新痛 / 踩坑翻车
  • 奥秘 / 玄学 / 神器救命
  • 突然连成一条线 / 物理学的代价

发布前清单

页面标题和 meta description 已更新
所有资料来源链接可点击
图表坐标轴、单位、刻度完整
交互控件默认状态清晰
移动端无文字溢出或按钮挤压
首页工作流入口已接好
JS 改完跑过一次语法检查
git status 只含本次要发布的文件
收尾

可复用的方法论

把整章的流程压缩成三句话,下一章可以直接套用。

先有问题
再有内容

每章开头是一个真实困惑,不是名词定义。选题阶段就把它挂到工作流上。

先有直觉
再有公式

交互演示先让读者看到现象,再给计算模型。示意算法和真实数据要分清。

先在手机上
看一眼再发布

375px 宽度逐项核查 Canvas 高度、网格折叠、滑块溢出,再走发布清单。