如何在 Vue 3 + Element Plus 项目中实现动态设置主题色以及深色模式切换

news2024/9/20 14:08:06

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、引言
    • 二、项目依赖和环境配置
      • 1. VueUse
      • 2. use-element-plus-theme
      • 3. 安装依赖
    • 三、实现深色模式切换
      • 1. 设置深色模式状态
      • 2. 模板中的深色模式切换按钮
      • 3. 深色模式的效果展示
    • 四、动态切换主题色
    • 五、总结

一、引言

在现代 Web 应用中,主题切换功能尤其是深色模式和自定义主题色的动态切换,已经成为提升用户体验的关键要素之一。它不仅能够根据用户的喜好自动调整界面风格,还能够为不同的场景提供更好的视觉效果,特别是在夜间使用时,深色模式可以减轻眼睛的疲劳。

本文将结合 Vue 3 和 Element Plus 框架,通过实际代码示例展示如何实现深色模式和主题色的动态切换。

请添加图片描述

二、项目依赖和环境配置

在实现动态主题切换功能之前,我们需要确保项目环境中安装了必要的依赖工具。这些工具将帮助我们简化深色模式切换和主题颜色的动态修改。下面将详细说明这些依赖的作用和安装方式。

1. VueUse

VueUse 是一个基于 Vue 3 的工具库,提供了许多方便的 Composition API 工具,极大地简化了 Vue 3 中常见功能的实现,比如深色模式切换、存储管理、时间处理等。

在本项目中,我们使用 VueUse 来实现深色模式的管理和用户主题色选择的持久化存储。

2. use-element-plus-theme

use-element-plus-theme 是一个专门用于 Element Plus 组件库的插件,它允许我们在运行时动态更改 Element Plus 的主题色。

这个插件将主题管理过程简化为一个简单的 API 调用,极大地提升了开发效率。通过 use-element-plus-theme,我们可以根据用户的选择实时调整应用的主题色,而不需要重新编译或刷新页面。

3. 安装依赖

在项目中使用 pnpm(或者你也可以使用 npmyarn)来安装这些依赖工具。运行以下命令来安装:

pnpm install @vueuse/core use-element-plus-theme
  • @vueuse/core 是 VueUse 的核心包,包含了实现深色模式和持久化存储所需的工具。
  • use-element-plus-theme 是实现 Element Plus 组件主题色动态切换的关键插件。

接下来我们将通过实际代码示例展示如何实现主题切换。


三、实现深色模式切换

深色模式和浅色模式的切换可以通过 VueUse 提供的 useDarkuseToggle 两个工具函数来实现。

  • useDark:用于检测和管理深色模式的状态。
  • useToggle:用于在深色模式和浅色模式之间切换。

1. 设置深色模式状态

首先,在代码中使用 useDark 来检测当前是否为深色模式,并通过 useToggle 来切换深色与浅色模式:

import { useDark, useToggle } from '@vueuse/core';

const isDark = useDark();  // 检测当前是否为深色模式
const toggleDark = useToggle(isDark);  // 用于切换深色和浅色模式

2. 模板中的深色模式切换按钮

在模板中,可以使用一个按钮来切换模式,按钮的文本根据当前模式动态变化,显示“Dark”或“Light”:

<template>
  <el-button type="primary" @click="toggleDark()">
    {{ isDark ? 'Dark' : 'Light' }}
  </el-button>
</template>

3. 深色模式的效果展示

使用 useDark 后,我们可以观察到,当深色模式开启时,<html> 标签将会自动添加一个 dark 类名。

这个类名可以通过 CSS 来影响整个页面的样式,使其适配深色模式。你可以使用 dark 类名为页面定义特定的样式规则,如背景颜色、文字颜色等。

在这里插入图片描述

经过上面的设置,我们得到以下效果:

请添加图片描述


四、动态切换主题色

除了深色模式的切换,用户可能还会需要根据个人喜好自定义应用的主题色。比如用户想要主题色为红色或者其他颜色的按钮和菜单栏,为了实现这一功能,我们可以利用 use-element-plus-theme 插件来动态切换 Element Plus 组件库的主题色。

  1. 首先在代码中引入 use-element-plus-theme 并设置默认的主题色:

    import { useStorage } from '@vueuse/core';
    import { useElementPlusTheme } from 'use-element-plus-theme';
    
    const layoutThemeColor = useStorage('layout-theme-color', '#243db9');  // 默认主题色
    const { changeTheme } = useElementPlusTheme(layoutThemeColor.value);  // 初始化主题色
    

    useStorageVueUse 提供的一个工具函数,用于在浏览器的 localStoragesessionStorage 中存储数据,它会自动同步数据并在页面刷新后恢复。

    通过 useStorage('key', defaultValue),你可以持久化存储用户的选择,例如主题色,并且这个值是响应式的,页面重新加载时会自动恢复之前保存的数据。

    useElementPlusTheme 则是用于动态修改 Element Plus 组件库的主题色。

    通过调用 changeTheme(color),你可以实时更改整个应用的主题颜色,使页面组件如按钮、菜单栏等元素的颜色立即生效。

  2. 在模板中,设置一些不同的颜色方块,用户可以选择并应用新的主题色:

     <div style="margin: 10px">
         <span
             v-for="item in themeColors"
             :key="item.themeName"
             :style="{
                 background: item.color,
                 width: '20px',
                 height: '20px',
                 display: 'inline-block',
                 marginRight: '10px',
                 cursor: 'pointer',
                 border: '1px solid #333',
                 borderRadius: '10%',
             }"
             @click="changeThemeColor(item.color)"
         ></span>
     </div>
    

    这里我们设置一些供用户选择的主题色:

    const themeColors = [
      { color: '#1b2a47', themeName: '道奇蓝' },
      { color: '#722ed1', themeName: '深紫罗兰色' },
      { color: '#eb2f96', themeName: '深粉色' },
      { color: '#f5222d', themeName: '猩红色' },
      { color: '#fa541c', themeName: '橙红色' },
      { color: '#13c2c2', themeName: '绿宝石' },
      { color: '#52c41a', themeName: '酸橙绿' },
    ];
    
  3. 在脚本部分,通过 changeThemeColor 函数来更新主题色:

    const changeThemeColor = (color: string) => {
      layoutThemeColor.value = color;  // 保存主题色
      changeTheme(color);  // 修改 Element Plus 组件主题色
    };
    
  4. 为了更加明显的看到对 elementplus 主题色切换的效果,可以在官网上随便复制一段菜单的代码进行测试。到此,一个简单的主题切换已经完成。

    在这里插入图片描述

在正式的项目开发中,主题色的动态切换功能会非常有用,特别是在需要增强用户体验、提供个性化设置的场景下。以下是一些关键点,说明该功能在项目中的实际应用价值:

  1. 品牌一致性:项目可能需要根据品牌颜色动态调整整个应用的主题色。通过主题色切换,可以轻松确保界面与品牌风格保持一致,并且根据用户需求快速调整颜色方案。

  2. 用户个性化定制:某些应用希望给用户提供更大的自由度,允许他们根据个人偏好自定义界面颜色。使用动态主题色切换功能,可以让用户随时调整界面配色,提高用户黏性和满意度。

  3. 多主题支持:在大型项目中,往往需要支持多种主题(如深色模式、浅色模式,以及不同的颜色方案)。利用动态主题切换可以方便地管理多个主题,并让切换过程平滑且高效。

  4. 响应式存储:通过 useStorage,用户在切换主题色后,即使刷新页面或重新访问,之前的主题偏好也能自动恢复,增强了体验的连续性。

  5. 组件库的灵活应用:这种方式不仅适用于 Element Plus,也可以扩展到其他组件库,通过集中化管理主题色,使整个项目更加模块化、灵活且易于维护。

因此,在正式的项目开发中,动态切换主题色功能能够提供更强的品牌表达、提升用户体验,并且能够轻松应对复杂的多主题需求。


五、总结

本文展示了如何使用 Vue 3 和 Element Plus 实现深色模式和主题色的动态切换。通过结合 VueUseuse-element-plus-theme,我们能够方便地管理和修改应用的外观,使其更加灵活且用户友好。希望本文能为你在项目中实现个性化主题和深色模式提供参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2140490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

平安养老险阜阳中心支公司开展金融教育宣传专项活动

为全面深入开展“金融教育宣传月”的各项工作&#xff0c;不断完善金融惠民利民举措&#xff0c;提升金融服务质效&#xff0c;帮助基层群众增强维权意识、防非反诈的自我保护能力。近日&#xff0c;平安养老保险股份有限公司&#xff08;以下“平安养老险”&#xff09;阜阳中…

神经网络_使用tensorflow对fashion mnist衣服数据集分类

from tensorflow import keras import matplotlib.pyplot as plt1.数据预处理 1.1 下载数据集 fashion_mnist keras.datasets.fashion_mnist #下载 fashion mnist数据集 (train_images, train_labels),(test_images, test_labels) fashion_mnist.load_data()print("t…

食品包装识别系统源码分享

食品包装识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

IDEA复制代码到MD笔记格式还手动调,赶紧试试这个功能,一步到位

你是否曾经有过这种复制代码到笔记代码块的经历&#xff0c;选中后代码左侧有一些空格 然后粘到Markdown笔记里除第一行外&#xff0c;其他几行都要手动向前缩进&#xff0c;真是逼死强迫症啊 但是&#xff0c;其实idea工具中有一个“列选择模式”的功能&#xff0c;我们可以…

51单片机-LCD1602(液晶显示屏)- 写驱动

时间永远是检验真理唯一标准&#xff01;Whappy&#xff01; 主要简单写出几个驱动 初始化、显示字符、显示字符串、显示整形数据、有符号数据、十六进制、二进制&#xff01; void LCD_Init(); void LCD_ShowChar(unsigned char Line,unsigned char Column,char Char); vo…

【网络安全的神秘世界】csrf客户端请求伪造

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 一、概述 跨站请求伪造&#xff0c;是一种挟持用户在当前已登陆的web应用程序上执行非本意操作的攻击方法&#xff0c;允许攻…

Comsol 利用多孔材料填充复合吸声器,拓宽低频完美吸声

参考文献&#xff1a;Cheng B , Gao N , Huang Y ,et al.Broadening perfect sound absorption by composite absorber filled with porous material at low frequency:[J].Journal of Vibration and Control, 2022, 28(3-4):410-424.DOI:10.1177/1077546320980214. 为了提高低…

端侧大模型系列 | 斯坦福手机端侧Agent大模型,为Android API而生!

0. 引言 峰峦或再有飞来&#xff0c;坐山门老等。泉水已渐生暖意&#xff0c;放笑脸相迎 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖铁观音的小男孩。今天这篇小作文主要介绍端侧大模型中的函数调用&#xff0c;即常说的Function calling…

即插即用!高德西交的PriorDrive:统一的矢量先验地图编码,辅助无图自动驾驶

Driving with Prior Maps: Unified Vector Prior Encoding for Autonomous Vehicle Mapping 论文主页&#xff1a;https://misstl.github.io/PriorDrive.github.io/ 论文链接&#xff1a;https://arxiv.org/pdf/2409.05352 代码链接&#xff1a;https://github.com/missTL/Pr…

【数据结构】排序算法---直接插入排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 7. 折半插入排序代码实现——C 结语 1. 定义 直接插入排序是一种简单直观的排序算法。它的工作原理为将待排列元素划分为「已排序」和「未排序」两部分&#xff0c;每次从「未排序的」…

PHP Swoole实现简易聊天室,附加小程序端连接websocket简易代码

目录 用到的工具&#xff1a; PHP Swoole拓展 | PHP Redis拓展 | Redis 7 一、安装上述必要工具&#xff08;下面是以宝塔面板中操作为例&#xff09; 给PHP安装Swoole和Redis拓展&#xff1a; 安装Redis软件 二、创建websocket服务器文件"wss_server.php" 具…

node.js+Koa框架+MySQL实现注册登录

完整视频展示&#xff1a;https://item.taobao.com/item.htm?ftt&id831092436619&spma21dvs.23580594.0.0.52de2c1bg9gTfM 效果展示&#xff1a; 一、项目介绍 本项目是基于node.jsKoamysql的注册登录的项目,主要是给才学习node.js和Koa框架的萌新才写的。 二、项目…

java数据结构----图

图的存储结构: 代码实现 public class Graph {// 标记顶点数目private int V;// 标记边数目private int E;// 邻接表private Queue<Integer>[] adj;public Graph(int v) {V v;this.E 0;this.adj new Queue[v];for (int i 0; i < adj.length; i) {adj[i] new Queu…

C++的类与对象中(主讲默认成员函数)

目录 1.类的默认成员函数 2.构造函数 1.全缺省构造函数 2.第7点中的对自定义类型的成员变量构造&#xff08;调用编译器自动生成的默认构造函数&#xff09; 3.析构函数 4.拷贝构造函数 5.运算符重载 1.概念 2.赋值运算符重载 6.const成员函数 1.类的默认成员函数 默…

微服务——网关路由(Spring Cloud Gateway)

网关路由 1.什么是网关 网关又称网间连接器、协议转换器&#xff0c;是在网络层以上实现网络互连的复杂设备&#xff0c;主要用于两个高层协议不同的网络之间的互连。网关就是网络的关口。数据在网络间传输&#xff0c;从一个网络传输到另一网络时就需要经过网关来做数据的路由…

【深度智能】:迈向高级时代的人工智能全景指南

​ ​ 前几天偶然发现了一个超棒的人工智能学习网站&#xff0c;内容通俗易懂&#xff0c;讲解风趣幽默&#xff0c;简直让人欲罢不能。忍不住分享给大家&#xff0c;人工智能立刻跳转&#xff0c;开启你的AI学习之旅吧&#xff01; 第一阶段&#xff1a;基础知识 1. 计算机科…

人脸防伪检测系统源码分享

人脸防伪检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【Python基础】Python 装饰器(优雅的代码增强工具)

本文收录于 《Python编程入门》专栏&#xff0c;从零基础开始&#xff0c;分享一些Python编程基础知识&#xff0c;欢迎关注&#xff0c;谢谢&#xff01; 文章目录 一、前言二、装饰器基础三、语法糖 四、带参数的装饰器五、多层装饰器六、总结 一、前言 在Python编程的世界里…

【手撕】快排-分治

1. 颜色分类 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/sort-colors/description/ 代码 class Solution {public…

Neo4j入门案例:三星堆

创建一个关于三星堆的知识图谱可以是一个非常有趣的项目&#xff0c;它可以帮助理解如何使用Neo4j来存储和查询复杂的关系数据。三星堆文化以其独特的青铜器、金器和其他文物而闻名&#xff0c;这为我们提供了一个丰富的历史背景来构建知识图谱。 数据模型定义 实体类型&#…