后台编辑器深色模式下正文区域忽白忽黑
自定义主题后正文编辑区时白时黑,同一条 CSS 规则时灵时不灵——根因是富文本与原始 Markdown 是两棵独立的 DOM 树,各藏一层白底。
现象
给管理后台换肤后,深色模式下正文编辑区颜色不稳定:有时正常,有时整块发白,切换编辑模式后必然「复发」。
排查
- 写了个亮度扫描脚本:遍历页面元素、按背景色亮度阈值找出所有「亮色残留」;
- 对比两次扫描结果,发现命中的元素类名在
cms-editor-visual与cms-editor-raw之间切换——切换编辑模式时 Decap 挂载的是两棵完全不同的 DOM 树; - 原始模式还有一层「透明 textarea + 无类名 token span」的高亮层,token 颜色写死为浅色主题的深灰蓝,在深色底上不可读;
- sticky 工具栏透明透字的问题定位为特异性竞争:Decap 的 emotion 规则带元素名(
div.css-xxx,0,1,1)且注入顺序靠后,同分时我方规则落败。
根因
- 只覆盖了两棵编辑器画布之一,另一棵(原始 Markdown 模式)从未被处理;
- 高亮层 token 颜色来自组件内置浅色主题,且无类名可选中;
- CSS 特异性不足 + 注入顺序不利。
解决
- 两棵树(
cms-editor-visual/cms-editor-raw)都加容器级覆盖; - token 层放弃逐 token 配色,按容器整体接管为墨色——牺牲语法多色,换双主题可读;
- sticky 工具栏规则加
html body前缀提高特异性。
复盘
- 「时灵时不灵」几乎总是状态未穷举:这次是两棵 DOM 树,下次可能是弹层、移动端、错误态。给第三方组件换肤时,先把它的全部 UI 状态列出来再动手;
- 自动化扫描(按亮度找亮色)比肉眼高效得多,值得沉淀成小脚本;
- 计算样式里查不到的装饰(伪元素渐变)用「逐个隐藏」实验定位最快。