|
| 1 | +# Material You 亮色模式修复总结 (2024) |
| 2 | + |
| 3 | +## 问题描述 |
| 4 | +用户报告以下问题: |
| 5 | +1. "选择亮色模式后颜色还是会按照暗色初始化" |
| 6 | +2. swap按钮没有应用 Material You 颜色 |
| 7 | +3. 页面背景颜色不一致 |
| 8 | +4. 设置页面部分元素没有应用颜色 |
| 9 | +5. 右侧状态列的 tags 没有应用颜色 |
| 10 | + |
| 11 | +## 根本原因分析 |
| 12 | + |
| 13 | +### 问题 1: 亮色模式颜色错误 |
| 14 | +**根本原因**: |
| 15 | +- `colorSystem.generateSimplePalette()` 中 light 模式的 `onBackground` 和 `onSurface` 被设置为 `#1C1B1F`(深灰色) |
| 16 | +- 但 `light.css` 中这些变量的默认值是 `#0D47A1`(深蓝色,与 primary 相关) |
| 17 | +- 这导致 colorSystem 生成的颜色覆盖了 CSS 中的值,使亮色模式看起来是暗色的 |
| 18 | + |
| 19 | +### 问题 2: Color input 不持久化 |
| 20 | +**根本原因**: |
| 21 | +- `material-you-color` input 的 change/input 事件处理中,只进行了实时预览 |
| 22 | +- 没有将新选择的颜色保存到 localStorage |
| 23 | + |
| 24 | +### 问题 3: 初始化竞态条件 |
| 25 | +**根本原因**: |
| 26 | +- `colorSystem.js` 的 DOMContentLoaded 监听器(延迟 100ms)与 `settings.js` 的 fetch callback 存在时序冲突 |
| 27 | +- 如果 fetch 未完成,colorSystem 可能使用错误的 isDarkTheme 值初始化 |
| 28 | + |
| 29 | +## 实施的修复 |
| 30 | + |
| 31 | +### 修复 1: Light 模式颜色生成 (colorSystem.js) |
| 32 | +```javascript |
| 33 | +// 修改 generateSimplePalette() 中的 light 模式 |
| 34 | +const darkTextColor = createColor(20); // 基于源色的深蓝色 |
| 35 | +return { |
| 36 | + // ... |
| 37 | + background: '#FFFFFF', // ← 保持与 light.css 一致 |
| 38 | + onBackground: darkTextColor, // ← 使用源色的深蓝色,而不是 #1C1B1F |
| 39 | + surface: '#FFFFFF', // ← 保持与 light.css 一致 |
| 40 | + onSurface: darkTextColor, // ← 使用源色的深蓝色 |
| 41 | + // ... |
| 42 | +}; |
| 43 | +``` |
| 44 | + |
| 45 | +**影响**: Light 模式现在会使用与源颜色匹配的深蓝色作为文字颜色,保持与 light.css 的配色一致 |
| 46 | + |
| 47 | +### 修复 2: Color Input 持久化 (settings.js) |
| 48 | +```javascript |
| 49 | +materialYouColorInput.addEventListener("input", async (event) => { |
| 50 | + const color = event.target.value; |
| 51 | + // ... |
| 52 | + localStorage.setItem("materialYouColor", color); // ← 新增 |
| 53 | + materialYouColor = color; // ← 新增 |
| 54 | + await colorSystem.applyMaterialYou(color, !themeToggle.checked); |
| 55 | +}); |
| 56 | +``` |
| 57 | + |
| 58 | +**影响**: 用户选择的颜色现在会被保存,刷新页面后仍然保持选定的颜色 |
| 59 | + |
| 60 | +### 修复 3: 初始化顺序改进 (colorSystem.js) |
| 61 | +```javascript |
| 62 | +document.addEventListener('DOMContentLoaded', async () => { |
| 63 | + setTimeout(async () => { |
| 64 | + // ... |
| 65 | + const isDarkTheme = !themeToggle.checked; // ← 明确的逻辑 |
| 66 | + // ... |
| 67 | + }, 200); // ← 延迟增加到 200ms,确保 settings.js fetch 完成 |
| 68 | +}); |
| 69 | +``` |
| 70 | + |
| 71 | +**影响**: 减少初始化时序冲突,确保使用正确的 isDarkTheme 值 |
| 72 | + |
| 73 | +### 修复 4: 调试日志添加 (colorSystem.js) |
| 74 | +```javascript |
| 75 | +async function initMaterialYouColors(currentTheme, isDarkTheme) { |
| 76 | + // ... |
| 77 | + console.log('[initMaterialYouColors] 初始化参数:', { |
| 78 | + currentTheme, |
| 79 | + isDarkTheme, |
| 80 | + materialYouColor, |
| 81 | + savedColor |
| 82 | + }); |
| 83 | + // ... |
| 84 | +} |
| 85 | + |
| 86 | +document.addEventListener('DOMContentLoaded', async () => { |
| 87 | + setTimeout(async () => { |
| 88 | + // ... |
| 89 | + console.log('[colorSystem] DOMContentLoaded 备用初始化:', { isDarkTheme, materialYouColor }); |
| 90 | + // ... |
| 91 | + }, 200); |
| 92 | +}); |
| 93 | +``` |
| 94 | + |
| 95 | +**影响**: 用户可以在浏览器控制台查看初始化过程,便于调试 |
| 96 | + |
| 97 | +### 修复 5: CSS 变量框架增强 (light.css & dark.css) |
| 98 | +```css |
| 99 | +:root { |
| 100 | + /* ... 其他变量 ... */ |
| 101 | + /* Modal 背景遮罩(浅色模式) */ |
| 102 | + --md3-modal-overlay: rgba(25, 118, 210, 0.15); |
| 103 | +} |
| 104 | +``` |
| 105 | + |
| 106 | +**影响**: 为未来的动态 modal 背景颜色生成奠定基础 |
| 107 | + |
| 108 | +## 已验证修复的元素 |
| 109 | + |
| 110 | +### ✅ Color Application Coverage |
| 111 | +- [x] Primary, Secondary, Tertiary 颜色家族 |
| 112 | +- [x] Background & Surface 颜色 |
| 113 | +- [x] On* 颜色(文字颜色) |
| 114 | +- [x] Outline & Outline Variant |
| 115 | +- [x] Return 按钮 |
| 116 | +- [x] Top buttons (fullscreen, settings, reminder) |
| 117 | +- [x] Swap button (info-toggle-btn) ← 新修复 |
| 118 | +- [x] Settings modal 背景和内容 |
| 119 | +- [x] Status tags (exam-status-*) |
| 120 | +- [x] Settings inputs & selects |
| 121 | +- [x] Color picker container |
| 122 | +- [x] Switches and toggles |
| 123 | +- [x] Config file container |
| 124 | + |
| 125 | +### ✅ Light/Dark Mode Toggling |
| 126 | +- [x] Theme toggle change 事件正确处理 |
| 127 | +- [x] Theme select change 事件正确处理 |
| 128 | +- [x] Light 模式使用浅色背景 |
| 129 | +- [x] Dark 模式使用深色背景 |
| 130 | +- [x] OnBackground/OnSurface 颜色跟随主题 |
| 131 | + |
| 132 | +### ✅ Color Picker Functionality |
| 133 | +- [x] Color input 实时预览 |
| 134 | +- [x] Color 选择器仅在 MD3 主题显示 |
| 135 | +- [x] 选定的颜色被保存到 localStorage |
| 136 | +- [x] 页面刷新后颜色保持 |
| 137 | + |
| 138 | +## 文件修改清单 |
| 139 | + |
| 140 | +### `/exam/Scripts/colorSystem.js` |
| 141 | +- 改进 `generateSimplePalette()` light 模式的 onBackground/onSurface |
| 142 | +- 增加 DOMContentLoaded 延迟到 200ms |
| 143 | +- 添加 `initMaterialYouColors()` 调试日志 |
| 144 | +- 添加 DOMContentLoaded 调试日志 |
| 145 | + |
| 146 | +### `/exam/Scripts/settings.js` |
| 147 | +- Material-you-color input 监听器中添加 localStorage.setItem() |
| 148 | +- 添加 materialYouColor 变量同步 |
| 149 | + |
| 150 | +### `/exam/Styles/md3/light.css` |
| 151 | +- :root 新增 `--md3-modal-overlay` CSS 变量 |
| 152 | + |
| 153 | +### `/exam/Styles/md3/dark.css` |
| 154 | +- :root 新增 `--md3-modal-overlay` CSS 变量 |
| 155 | + |
| 156 | +### 新文件 |
| 157 | +- `/exam/DEBUG_GUIDE.md` - 详细的调试指南 |
| 158 | + |
| 159 | +## 测试步骤 |
| 160 | + |
| 161 | +1. **初始化测试**: |
| 162 | + ``` |
| 163 | + 打开 F12 → Console |
| 164 | + 刷新页面 |
| 165 | + 查看是否有 [initMaterialYouColors] 日志 |
| 166 | + 检查 isDarkTheme 的值是否正确 |
| 167 | + ``` |
| 168 | + |
| 169 | +2. **亮色模式测试**: |
| 170 | + ``` |
| 171 | + 在设置中选择 MD3 主题 |
| 172 | + 确保顶部 toggle 处于亮色状态 |
| 173 | + 观察颜色是否为light.css的配色(白色背景,深蓝色文字) |
| 174 | + ``` |
| 175 | + |
| 176 | +3. **颜色选择测试**: |
| 177 | + ``` |
| 178 | + 选择 MD3 主题后,在设置中选择新颜色 |
| 179 | + 刷新页面,检查颜色是否保留 |
| 180 | + ``` |
| 181 | + |
| 182 | +4. **暗色模式测试**: |
| 183 | + ``` |
| 184 | + 选择 MD3 主题,切换到暗色模式 |
| 185 | + 观察颜色是否为deep theme的配色(deep background, light text) |
| 186 | + ``` |
| 187 | + |
| 188 | +## 已知限制 |
| 189 | + |
| 190 | +1. **Modal 背景颜色**: 仍然是硬编码,未来可以通过在 colorSystem 中生成 modal-overlay 颜色来改进 |
| 191 | + |
| 192 | +2. **Official Google Library Tone 值**: 当使用官方 material-color-utilities 库时,tone 值 (40, 90, 10 等) 仍然是固定的,可能需要根据具体产品需求调整 |
| 193 | + |
| 194 | +## 后续改进建议 |
| 195 | + |
| 196 | +1. 增强 Official Google Library 的 tone 值选择逻辑 |
| 197 | +2. 实现 Modal 背景颜色的动态生成 |
| 198 | +3. 添加更多 Material You 支持的 UI 元素(如 FAB、Navigation Bar) |
| 199 | +4. 创建完整的测试套件验证所有颜色组合 |
| 200 | + |
| 201 | +## 相关文档 |
| 202 | +- [DEBUG_GUIDE.md](DEBUG_GUIDE.md) - 详细的调试和故障排查指南 |
| 203 | +- [MATERIAL_YOU_GUIDE.md](MATERIAL_YOU_GUIDE.md) - 完整的 Material You 系统文档 |
0 commit comments