← 全部复盘

后台编辑器深色模式下正文区域忽白忽黑

后台样式异常(不影响前台读者) #Decap CMS#样式

自定义主题后正文编辑区时白时黑,同一条 CSS 规则时灵时不灵——根因是富文本与原始 Markdown 是两棵独立的 DOM 树,各藏一层白底。

现象

给管理后台换肤后,深色模式下正文编辑区颜色不稳定:有时正常,有时整块发白,切换编辑模式后必然「复发」。

排查

  1. 写了个亮度扫描脚本:遍历页面元素、按背景色亮度阈值找出所有「亮色残留」;
  2. 对比两次扫描结果,发现命中的元素类名在 cms-editor-visual 与 cms-editor-raw 之间切换——切换编辑模式时 Decap 挂载的是两棵完全不同的 DOM 树;
  3. 原始模式还有一层「透明 textarea + 无类名 token span」的高亮层,token 颜色写死为浅色主题的深灰蓝,在深色底上不可读;
  4. sticky 工具栏透明透字的问题定位为特异性竞争:Decap 的 emotion 规则带元素名(div.css-xxx,0,1,1)且注入顺序靠后,同分时我方规则落败。

根因

  1. 只覆盖了两棵编辑器画布之一,另一棵(原始 Markdown 模式)从未被处理;
  2. 高亮层 token 颜色来自组件内置浅色主题,且无类名可选中;
  3. CSS 特异性不足 + 注入顺序不利。

解决

  • 两棵树(cms-editor-visual / cms-editor-raw)都加容器级覆盖;
  • token 层放弃逐 token 配色,按容器整体接管为墨色——牺牲语法多色,换双主题可读;
  • sticky 工具栏规则加 html body 前缀提高特异性。

复盘

  • 「时灵时不灵」几乎总是状态未穷举:这次是两棵 DOM 树,下次可能是弹层、移动端、错误态。给第三方组件换肤时,先把它的全部 UI 状态列出来再动手;
  • 自动化扫描(按亮度找亮色)比肉眼高效得多,值得沉淀成小脚本;
  • 计算样式里查不到的装饰(伪元素渐变)用「逐个隐藏」实验定位最快。

← 返回复盘列表