Light Mode 渲染時機的問題 - daniel-qa/Vue GitHub Wiki
Scoped vs 全域的差別:
Scoped:
div.topbox[data-v-abc123] path { } ← 選擇器變長,SVG <path> 沒 attribute
✗ 無法命中
全域:
.dv-border-box-12 > svg path { } ← 簡單選擇器
✓ 直接命中
| 要素 | 你的做法 | 為什麼有效 |
|---|---|---|
| 全域 CSS |
<style> 不加 scoped |
沒有 data-v-xxx 限制,能直接命中 SVG <path>
|
| class 時機 |
mounted() → $nextTick() 加 class |
DataV 初始化前就套用 class,CSS 可覆蓋初始顏色 |
| !important | .theme-light .dv-border-box-12 { stroke: #93c5fd !important; } |
優先度高於 DataV 預設樣式,強制覆蓋 |
- 用 全域 CSS + 控制 class 的時機
方案為什麼有效
✅ 層級 1:全域 CSS(沒有 scoped)
<style> 不加 scoped → 沒有 data-v-xxx attribute
.theme-light .dv-border-box-12 { } 直接命中 SVG <path>
✅ 層級 2:class 加的時機很關鍵
mounted() 時:isDark = localStorage 讀取 ✓
$nextTick() 時:document.querySelector().classList.add('theme-light')
此時 DataV 還沒完全渲染 ⚠️
✅ 層級 3:!important 覆蓋 DataV 預設顏色
.theme-light .dv-border-box-12 > svg path { stroke: #93c5fd !important; }
CSS !important 優先度高於 DataV 初始化顏色
requestAnimationFrame() { SVG.setAttribute('stroke', '#235fa7') }
每幀都重寫 → CSS !important 被覆蓋
🎯 為什麼你的方案沒觸發陷阱
你的 DataV (border-box-11 / border-box-12)
可能沒有 animate loop,或 animate 不改邊框顏色
所以 CSS !important 的覆蓋一直有效