Skip to content

🐛 修复暗色模式下页面初次加载白屏闪烁的问题#1499

Closed
CodFrm wants to merge 1 commit into
mainfrom
fix/1497-dark-mode-flash
Closed

🐛 修复暗色模式下页面初次加载白屏闪烁的问题#1499
CodFrm wants to merge 1 commit into
mainfrom
fix/1497-dark-mode-flash

Conversation

@CodFrm

@CodFrm CodFrm commented Jun 10, 2026

Copy link
Copy Markdown
Member

Checklist / 检查清单

  • Fixes mentioned issues / 修复已提及的问题
  • Code reviewed by human / 代码通过人工检查
  • Changes tested / 已完成测试

Description / 描述

fix #1497

问题:暗色主题下,options / popup / install 等页面初次加载时会先白屏一闪。根因是 arco-theme 属性由 React 挂载时的 JS(AppContext.tsx)设置,在此之前模板内联样式里的 var(--color-bg-2) 无定义,body 回退为白色。

方案(结合 issue 中两边的讨论):

  1. 三个 HTML 模板(options.html / popup.html / template.html)的内联样式中增加系统暗色兜底,仅在主题尚未初始化时生效:

    @media (prefers-color-scheme: dark) {
      body:not([arco-theme]) {
        background-color: #232324; /* arco-theme=dark 时 --color-bg-2 的默认值 */
      }
    }
  2. AppContext.tsx 的 light 分支由 removeAttribute("arco-theme") 改为显式 setAttribute("arco-theme", "light"),使 body:not([arco-theme]) 精确等价于"JS 尚未初始化主题"。这样不需要 issue 里原始提案中的 :has(#root:empty)(回应 @cyfung1031:has 的性能顾虑),同时让 index.css 中已有的 body[arco-theme='light'] 滚动条规则真正生效(此前是死代码)。

    注:评论中单独的 html.dark CSS 变量方案无法解决本问题——class="dark" 同样是 React 挂载时才由 JS 设置,JS 运行前依然白屏,因此必须依赖 prefers-color-scheme 媒体查询。

各场景行为:

用户主题设置 系统主题 首帧表现
auto / dark 暗色 ✅ 暗色背景,无白闪
auto / light 亮色 ✅ 白色背景(原有行为)
light 暗色 首帧短暂暗色,挂载后转亮(CSS-only 方案的固有限制,issue 作者已认可)
dark 亮色 仍有白闪(CSS 无法读取 localStorage;MV3 CSP 禁止内联脚本,无法在首帧前读取用户设置)

测试

  • 新增 e2e/theme-flash.spec.ts:通过 CDP Emulation.setScriptExecutionDisabled 固定"React 挂载前"首帧状态,模拟系统暗色验证三个模板页面 body 背景为 rgb(35, 35, 36),并验证亮色系统下无"黑闪"。修复前三个用例均失败(实测白色 rgb(255, 255, 255)),修复后通过。
  • 新增 src/pages/store/AppContext.test.tsx:验证 light / dark / auto 模式下 arco-theme 属性均被显式设置。

验证结果:单测 959 全部通过;e2e 32 全部通过;pnpm run lint 0 错误。

Screenshots / 截图

修复前(系统暗色、脚本执行前首帧,e2e 截图):body 为白色;修复后同状态 body 为 #232324

@cyfung1031 cyfung1031 marked this pull request as draft June 10, 2026 02:33
@cyfung1031

cyfung1031 commented Jun 10, 2026

Copy link
Copy Markdown
Collaborator

如果系统是深色,用户设定为 light mode, 会倒过来出现 dark flash

AppContext.tsx 的载入已经是 React 在跑, 但问题是 React 跑之前。改 AppContext.tsx 不切实制。 我怀疑AI用e2e乱测一通

await context.newPage(); 已经是载入好了吧

@CodFrm

CodFrm commented Jun 10, 2026

Copy link
Copy Markdown
Member Author

如果系统是深色,用户设定为 light mode, 会倒过来出现 dark flash

AppContext.tsx 的载入已经是 React 在跑, 但问题是 React 跑之前。改 AppContext.tsx 不切实制。 我怀疑AI用e2e乱测一通

await context.newPage(); 已经是载入好了吧

应该不是,是另外的问题,我再调整一下

@cyfung1031

Copy link
Copy Markdown
Collaborator

如果系统是深色,用户设定为 light mode, 会倒过来出现 dark flash
AppContext.tsx 的载入已经是 React 在跑, 但问题是 React 跑之前。改 AppContext.tsx 不切实制。 我怀疑AI用e2e乱测一通
await context.newPage(); 已经是载入好了吧

应该不是,是另外的问题,我再调整一下

我把 #1498 改好了。也测试好了。你看看吧
我敢肯定我的方法能解决 #1497 , 而且不会有黑闪问题
你这个预设 @media (prefers-color-scheme: dark) { 应该也能解决白闪,但解不了黑闪,不过你喜欢吧

@CodFrm CodFrm closed this Jun 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

White flash during initial load

2 participants