vue3 element-plus 暗黑模式(主题切换)简易版

暗黑模式是说明

暗黑模式是指在应用程序或操作系统中使用暗色背景和浅色文本的界面设计。与传统的亮色模式相比,暗黑模式具有以下特点:

  1. 减少眼部疲劳:使用暗色背景可以减少屏幕发出的蓝光,减轻长时间使用电子设备对眼睛的疲劳程度。这对于在晚上或低光环境下使用设备的人来说尤为重要。

  2. 节省电池寿命:在有机发光二极管(OLED)或柔性有机发光二极管(AMOLED)屏幕上,黑色像素是不发光的,因此在暗黑模式下使用这些屏幕可以节省电池寿命,延长续航时间。

  3. 强调内容:暗黑模式通过减少背景的明亮度,使内容元素更加突出。这有助于提高可读性,并使用户更专注于应用程序或网站中的核心信息。

  4. 美观与时尚:暗黑模式因其现代感和时尚外观而受到很多用户的欢迎。它为用户提供了一种与传统亮色界面不同的视觉体验。

暗黑模式现在广泛应用于各种应用程序和操作系统中,包括移动设备、计算机操作系统和各种在线服务。许多应用程序和平台都提供了切换到暗黑模式的选项,以便用户根据自己的偏好进行设置。

前端如何实现,逻辑是什么

在前端实现暗黑模式时,主要涉及以下几个方面的逻辑:

  1. CSS样式:使用CSS来定义不同主题下的样式。创建两套样式表,一套是亮色主题的样式表,另一套是暗黑主题的样式表。根据当前选择的主题,动态加载相应的样式表。

  2. 主题切换:为用户提供切换主题的选项,通常是一个切换按钮或开关。当用户切换主题时,通过JavaScript来切换样式表。

  3. 存储用户选择:为了记住用户的主题偏好,可以使用本地存储(如localStorage)来保存用户选择的主题。这样,在下次访问时,可以根据存储的值来加载正确的主题。

vue3 + element-plus 项目中实现

  1. main 引入暗黑主题css
    import ‘element-plus/theme-chalk/dark/css-vars.css’
import { createApp } from 'vue'
import App from './App.vue'
import router from './router'import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import zhCn from 'element-plus/es/locale/lang/zh-cn'
import 'element-plus/theme-chalk/dark/css-vars.css'
import '@/styles/main.css'
import pinia  from '@/store'const app = createApp(App)
app.use(ElementPlus, { locale: zhCn })
app.use(pinia)
app.use(router)
app.mount('#app')import '@/router/permission'
  1. index.html配置
    class=“light”
<!DOCTYPE html>
<html lang="zh-CN" class="light"><head><meta charset="UTF-8"><link rel="icon" href="/favicon.ico"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>渠道管理</title></head><body><div id="app"></div><script type="module" src="/src/main.ts"></script></body>
</html>
  1. 具体实现组件
<template><div class="dark-box"><el-button text class="switch" :class="isDark ? 'isDark-switch' : 'noDark-switch'" @click="toggleDark"><el-icon v-if="isDark"><svg viewBox="0 0 24 24"><pathd="M6.05 4.14l-.39-.39a.993.993 0 0 0-1.4 0l-.01.01a.984.984 0 0 0 0 1.4l.39.39c.39.39 1.01.39 1.4 0l.01-.01a.984.984 0 0 0 0-1.4zM3.01 10.5H1.99c-.55 0-.99.44-.99.99v.01c0 .55.44.99.99.99H3c.56.01 1-.43 1-.98v-.01c0-.56-.44-1-.99-1zm9-9.95H12c-.56 0-1 .44-1 .99v.96c0 .55.44.99.99.99H12c.56.01 1-.43 1-.98v-.97c0-.55-.44-.99-.99-.99zm7.74 3.21c-.39-.39-1.02-.39-1.41-.01l-.39.39a.984.984 0 0 0 0 1.4l.01.01c.39.39 1.02.39 1.4 0l.39-.39a.984.984 0 0 0 0-1.4zm-1.81 15.1l.39.39a.996.996 0 1 0 1.41-1.41l-.39-.39a.993.993 0 0 0-1.4 0c-.4.4-.4 1.02-.01 1.41zM20 11.49v.01c0 .55.44.99.99.99H22c.55 0 .99-.44.99-.99v-.01c0-.55-.44-.99-.99-.99h-1.01c-.55 0-.99.44-.99.99zM12 5.5c-3.31 0-6 2.69-6 6s2.69 6 6 6s6-2.69 6-6s-2.69-6-6-6zm-.01 16.95H12c.55 0 .99-.44.99-.99v-.96c0-.55-.44-.99-.99-.99h-.01c-.55 0-.99.44-.99.99v.96c0 .55.44.99.99.99zm-7.74-3.21c.39.39 1.02.39 1.41 0l.39-.39a.993.993 0 0 0 0-1.4l-.01-.01a.996.996 0 0 0-1.41 0l-.39.39c-.38.4-.38 1.02.01 1.41z"fill="currentColor"></path></svg></el-icon><el-icon v-else><svg viewBox="0 0 24 24"><pathd="M11.01 3.05C6.51 3.54 3 7.36 3 12a9 9 0 0 0 9 9c4.63 0 8.45-3.5 8.95-8c.09-.79-.78-1.42-1.54-.95A5.403 5.403 0 0 1 11.1 7.5c0-1.06.31-2.06.84-2.89c.45-.67-.04-1.63-.93-1.56z"fill="currentColor"></path></svg></el-icon></el-button></div>
</template><script setup lang="ts">
import { ref } from 'vue'
const isDark = ref(true)
const toggleDark = () => {isDark.value = !isDark.valueconst html = document.querySelector('html')if (html) {if (isDark.value) {html.classList.remove("dark");html.classList.add("light");} else {html.classList.remove("light");html.classList.add("dark");}
}
}</script><style scoped lang="scss">
.dark-box {margin-right: 20px;
}
.switch {width: 40px;height: 20px;border: 1px solid #dcdfe6;border-radius: 10px;box-sizing: border-box;cursor: pointer;padding-bottom: 0;padding-top: 0px;background-color: #ebeef5 !important;font-size: 12px;
}.isDark-switch {.el-icon {background-color: #fff !important;padding: 2px;border-radius: 50%;color: #000;margin-left: -8px;}
}.noDark-switch {background-color: rgb(8, 8, 8) !important;.el-icon {color: #fff;margin-left: 15px;}
}
</style>
  1. 引入 组件(具体开关组件)
<template>// 省略...<Dark />
</template>
<script setup lang="ts">
import Dark from './dark.vue'
</script>

5.示例

在这里插入图片描述
在这里插入图片描述
6. 总结
使用Vue 3和TypeScript编写,实现了一个切换暗黑模式的功能。代码中使用了Element Plus UI库来展示按钮和图标。

首先,在模板部分定义了一个按钮,其中使用了isDark变量来决定显示哪个图标,通过@click事件绑定toggleDark函数来切换主题。

<script setup>块中,使用ref函数创建了一个名为isDark的响应式变量,并定义了toggleDark函数。当点击按钮时,toggleDark函数会切换isDark的值,并根据isDark的值添加或移除HTML元素的类名来切换主题。

最后,在样式部分,使用了SCSS语法来定义按钮的样式。.switch类定义了按钮的基本样式,.isDark-switch.noDark-switch类分别定义了暗黑模式和非暗黑模式下的样式。

需要注意的是,代码中使用了scoped关键字来限定样式的作用域,确保样式只应用于当前组件。

总体来说,通过按钮的点击事件,动态切换主题,并根据主题切换来添加或移除HTML元素的类名,从而实现了暗黑模式的切换效果。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python机器学习—— 数据预处理 算法初步

目录 数据预处理1.获取数据2.处理缺失值3.划分数据集4.数据预处理和PCA降维5.算法实现&#xff1a;估计器 数据预处理 1.获取数据 from sklearn.datasets import load_iris liload_iris() print("获取特征值") print(li.data) print("目标值",li.target)#…

Spring Boot 统一功能处理

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 ⽤户登录权限效验Spring Boot 拦截器自定义拦截器将自定义拦截器加入到系统配置 拦截器实现原理 统一异常处理创建一个异常处…

LLM - 搭建 ProteinGPT 结合蛋白质结构 PDB 知识的行业 ChatGPT 系统

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131403263 论文&#xff1a;ProteinChat: Towards Enabling ChatGPT-Like Capabilities on Protein 3D Structures 工程&#xff1a;ht…

数据库监控与调优【十七】—— 表结构设计优化

表结构设计优化 第一范式&#xff08;1NF&#xff09; 字段具有原子性&#xff0c;即数据库的每一个字段都是不可分割的原子数据项&#xff0c;不能是集合、数组、记录等非原子数据项 当实体中的某个属性有多个值时&#xff0c;必须拆分为不同的属性 例子&#xff1a; 如图…

【广州华锐互动】机械设备事故VR模拟体验系统

随着虚拟现实技术的不断发展&#xff0c;越来越多的行业开始尝试将VR技术应用到实际场景中&#xff0c;以提供更加真实的体验。其中&#xff0c;机械伤害事故VR警示教育系统的出现&#xff0c;为机械工程师、安全培训人员等行业提供了一种全新的培训方式。在实现上&#xff0c;…

Linux基础

Linux root用户&#xff0c;cd ~ 相当于 cd /root 普通用户&#xff0c;cd ~ 相当于cd /home/当前用户名 注&#xff1a;cd - 返回进入此目录之前所在目录 rm --> remove mv --> move cp --> copy !! 执行最近的一次命令 echo $USER 展现当前用户名字 echo $PATH 展…

Linux:安装tomcat

注意&#xff1a;1.安装tomcat时最好用非root用户安装 2.可以选择新建一个用户&#xff0c;用户安装部署tomcat&#xff0c;本文将继续用fovace账户进行tomcat安装 一、前置条件 安装tomcat需要先安装jdk&#xff0c;所以先确定系统中是否已经有jdk&#xff0c;如下&#xff1a…

Docker的run流程

底层原理 Docker怎么工作&#xff1f; Docker为什么比VM虚拟机块&#xff1f; 1.Docker有比虚拟机更少的抽象层 2.docker利用的是宿主机的内核&#xff0c;vm需要是Guest OS 所以说&#xff0c;新建一个容器的时候&#xff0c;docker不需要像虚拟机一样加载一个系统内核&am…

消息中间件中常见问题

如何保证消息不丢失 MQ的用途 异步发送&#xff08;验证码&#xff0c;短信&#xff0c;邮件&#xff09;MySQL&#xff0c;ES&#xff0c;Redis之间的数据同步分布式事务削峰填谷 消息可能丢失的环境 消息在产生端时候生产端挂掉&#xff0c;消息未到达交换机&#xff0c…

VS里拉取时候,变成变基中,变成分离分支状态,git 头指针分离于 baf67ff

分离头指针&#xff08;detached HEAD&#xff09; 通常&#xff0c;我们工作在某一个分支上&#xff0c;比如 master 分支。这个时候 master 指针和 HEAD 指针是一起前进的&#xff0c;每做一次提交&#xff0c;这两个指针就会一起向前挪一步。但是在某种情况下&#xff08;例…

Revit中怎么画阶梯式旋转楼梯及生成桩

一、Revit中如何绘制阶梯式旋转楼梯 在楼梯的绘制过程中&#xff0c;如果采用(草图)楼梯的绘制方式&#xff0c;是没有办法将绘制的楼梯设置为阶梯式楼梯的&#xff0c;那么接下来我将采用构件的方式绘制阶梯式楼梯。 我们首先来看看阶梯式旋转楼梯和普通的旋转楼梯的区别&…

【C++】一些关于visual stdio,vscode,Mingw的思考 |bug

文章目录 今天在做YOLOV8的C部署时遇到的一些问题&#xff1a; 在进行一系列的操作之后会生成解决方案文件sln: 当然按道理到这一步之后&#xff0c;应该使用make命令进行下一步操作&#xff08;但是我确实不会make命令&#xff0c;所以准备进sln来生成解决方案&#xff09;&…