2026-02-10 20:34:15
在 Element Plus 中,使用 <i> 标签实现暗黑模式图标切换的核心原理是通过 CSS 类名动态匹配 和 优先级覆盖 来切换不同模式下的图标样式。以下是具体实现方式及原理说明:
1. 基础实现代码<i :class="isDark ? 'dark:ep-moon' : 'ep-sunny'"></i><!-- 或通过动态绑定多个类名 --><i class="ep-sunny" :class="{ 'dark:ep-moon': isDark }"></i>当启用暗黑模式时,Element Plus 会在根元素(如 <html> 或 <body>)上添加 class="dark" 属性。例如:
<html class="dark"> <!-- 页面内容 --></html>(2) CSS 选择器优先级机制通过以下 CSS 规则实现样式切换:
/* 非暗黑模式下的图标样式 */[i~="ep-sunny"] { /* 默认显示太阳图标(明亮模式) */ background-image: url('sunny-icon.svg');}/* 暗黑模式下的图标样式 */.dark [i~="dark:ep-moon"] { /* 显示月亮图标(暗黑模式) */ background-image: url('moon-icon.svg');}根元素添加 dark 类。
CSS 选择器 .dark [i~="dark:ep-moon"] 优先级更高,显示月亮图标。
根元素移除 dark 类。
默认规则 [i~="ep-sunny"] 生效,显示太阳图标。
若项目已引入 Element Plus 图标库,可更简洁地实现:
<template> <el-switch v-model="isDark" @change="toggleDark" /> <component :is="isDark ? 'Moon' : 'Sunny'" class="icon" /></template><script setup>import { ref } from 'vue';import { Sunny, Moon } from '@element-plus/icons-vue';const isDark = ref(false);const toggleDark = () => { isDark.value = !isDark.value; };</script><style>.icon { width: 24px; height: 24px;}</style>5. 总结通过以上方法,可以高效实现 Element Plus 的暗黑模式图标切换功能。