2026-03-02 23:04:42
在 Element Plus 项目中,通过自定义属性实现暗黑模式切换图标的核心逻辑是利用自定义属性 i 结合 CSS 选择器动态匹配图标类名。以下是具体实现步骤和原理说明:
1. 自定义属性 i 的作用ep-sunny:非暗黑模式(默认)显示的图标类名。
dark:ep-moon:暗黑模式下显示的图标类名(通过 dark: 前缀标识条件)。
通过以下选择器实现动态切换:
非暗黑模式:
[i~="ep-sunny"] { /* 显示太阳图标(默认) */}选择器 [i~="ep-sunny"] 会匹配 i 属性中包含 ep-sunny 的元素。
暗黑模式:
.dark [i~="ep-moon"] { /* 显示月亮图标(覆盖默认) */}当根元素添加 class="dark" 时,.dark [i~="ep-moon"] 优先级更高,覆盖默认样式。
在切换按钮中嵌入自定义属性的 <i> 标签:
<el-button @click="toggleDark"> <i i="dark:ep-moon ep-sunny"></i></el-button>步骤 2:CSS 样式定义两种模式的图标样式:
/* 非暗黑模式:显示太阳图标 */[i~="ep-sunny"] { display: inline-block; /* 其他图标样式(如背景图、SVG等) */}/* 暗黑模式:显示月亮图标 */.dark [i~="ep-moon"] { display: inline-block; /* 其他图标样式 */}步骤 3:JavaScript 切换逻辑通过 toggleDark() 函数切换 dark 类:
function toggleDark() { document.documentElement.classList.toggle('dark');}方案 1:动态绑定类名通过 Vue 的 :class 动态切换:
<i :class="isDark ? 'ep-moon' : 'ep-sunny'"></i>优点:标准 Vue 语法,易于理解。
缺点:需维护 isDark 状态变量。
方案 2:CSS 变量使用 CSS 变量控制图标:
:root { --icon-class: ep-sunny;}.dark { --icon-class: ep-moon;}i::before { content: attr(data-icon);}优点:纯 CSS 实现,无 JavaScript 依赖。
缺点:需配合伪元素和 data-* 属性。
自定义属性方案的优势:
通过上述方法,可以高效实现暗黑模式下的图标动态切换,同时保持代码简洁和可维护性。