vue + element-UI 实现深色模式和主题色动态切换

文章目录

  • vue + element-UI 实现深色模式和主题色动态切换
    • 前言
    • 深色模式和主题色动态切换
      • 本地样式切换
      • 主题色切换
      • element样式切换
    • 总结

首先说明一下,我对前端了解的不多,最近因为报的项目问题才临时学的vue(之前也用过一次),然后就套用了ruoyi-vue的板子,这是ruoyi项目源码的地址和实现效果预览的地址,这篇文章主要只是给大家提供了一个思路,多半不会是最优解

前言

我看了ruoyi项目之后,感觉被它的可以切换主题色惊艳到了(当然其他也是,如代码生成,动态路由等等),但是它虽然做了深色模式,但是深色模式只涉及了菜单这一块,而主页内容却没有改变,且深色模式侵入到了各种vue代码中。我就产生了一些想法。

深色模式和主题色动态切换

这里的切换主要分成了三块:

  1. 本地样式的切换
  2. 主题色的切换
  3. element样式的切换

我在store中记录了theme和theme_color这两个值,我将深色模式视为一个主题,对应的也有标准和浅色模式,用theme来记录,theme_color记录的则是主题色

也就是ruoyi项目中对应的主题风格和主题颜色

本地样式切换

本地样式切换我用了一个比较阴间的实现方式,会导致所有与主题风格相关的样式(颜色)代码不得不写入到外部scss文件中,而不能直接写在vue文件内,会导致vue的scope特性无法发挥,使vue组件重用性的优点很大程度受到影响。

我的实现方式:

// 将#app的div的类型与theme绑定,在不同的域下面导入不同的主题颜色变量,
// 再导入需要这些变量的总体的样式文件
// app.scss
#app.theme-standard{@import "./theme/theme-standard";@import "app-base";
}#app.theme-light{@import "./theme/theme-light";@import "app-base";
}#app.theme-dark{@import "./theme/theme-dark";@import "app-base";
}
// theme-standard.scss
$menu-text:#bfcbd9;
$menu-active-text: #ffffff;
$sub-menu-active-text:#f4f4f5;//https://github.com/-eleme-f-e/element/issues/12951
$menu-bg:#404040;
$menu-hover:#263445;
$menu-focus:#152334;// app-main.scss
.app-container{background: $app-bg;
}

这种玩法后患无穷,绝对不要试。 而且也无法导出变量给js使用。我写在这边完全是因为我真的为了想到这个花了好长时间,就算有问题还是难免想记录一下。

推荐的办法:

  1. 一种像ruoyi一样,导出其他样式的scss中的变量,vue文件中引用这些变量来进行设置,而且如果用了computed的话,代码上也不会特别难看

    <el-menu
    :background-color="settings.sideTheme === 'theme-dark' ? variables.menuBg : variables.menuLightBg">
    </el-menu>
    <
    
  2. 看链接

主题色切换

主题色的实现方式

  1. 申请新的element样式,替换掉该主题色的值,写入到style中
  2. 从App.vue中设置color为主题色,这样后续就可以使用currentColor来设置颜色

首先可以看一下 element返回的样式,里面默认的主题色是#409EFF,只要换成我们要的主题色就行了。

但是还有一个问题,element-ui有很多hover,active时会有基于主题色变淡的颜色还有阴影色等。

这就得看element是如何生成这些颜色的,总的来说:

  1. 10级向浅色渐变
  2. 0.9倍阴影色
// 浅色渐变方法
tintColor = (color, tint) => {red += Math.round(tint * (255 - red))green += Math.round(tint * (255 - green))blue += Math.round(tint * (255 - blue))return `#${red}${green}${blue}`
}
// 阴影色方法
shadeColor = (color, shade) => {red = Math.round((1 - shade) * red)green = Math.round((1 - shade) * green)blue = Math.round((1 - shade) * blue)return `#${red}${green}${blue}`
// 生成颜色集群
for (let i = 0; i <= 9; i++) {clusters.push(tintColor(theme, Number((i / 10).toFixed(2))))}clusters.push(shadeColor(theme, 0.1))
}
// 替换掉所有 #409EFF 生成的cluster 成 我们要的主题色生成的cluster
let newStyle = style
oldCluster.forEach((color, index) => {newStyle = newStyle.replace(new RegExp(color, 'ig'), newCluster[index])
})
// 写入到样式中
let styleTag = document.getElementById(id)
if (!styleTag) {styleTag = document.createElement('style')styleTag.setAttribute('id', id)document.head.appendChild(styleTag)
}
styleTag.innerText = newStyle

element样式切换

这是ruoyi没有做的,因为没有修改element背景色之类的需求,如果我们要做深色模式就得修改element的颜色。

然后我们就得定制样式文件,但是我的办法貌似并不是element推荐的。。。

办法就是修改刚才的element样式,定制出各个主题版本,主要修改背景色、边框颜色和字体颜色
效果大概是

但是可能会出现这种突然特别亮的阴间配色,这些颜色会出现在10级浅色渐变,默认的10种颜色就是

["409EFF","64,158,255","#53a8ff","#66b1ff","#79bbff","#8cc5ff","#a0cfff","#b3d8ff","#c6e2ff","#d9ecff","#ecf5ff",      // 这个注意一下噢"#3a8ee6"
]

只要在这10种颜色中找出,切换成灰色就可以比较ok了,其实还是有点阴间。。。看大家配色的功夫了。。。

总结

我主要想讲的就是如何动态切换主题的,实现方式是请求样式文件,多半是会一定程度上导致白屏。。。反正就是这样,我就提供一个思路啊

vue + element-UI 实现深色模式和主题色动态切换相关推荐

  1. 【前端】Vue+Element UI案例:通用后台管理系统-代码总结(已开源)

    文章目录 前言 项目文件目录 api mockServe home.js permission.js index.js mock.js user.js assert components Common ...

  2. vue + element ui 的后台管理系统框架_从零开始搭建 VUE + Element UI后台管理系统框架...

    点击右上方红色按钮关注"web秀",让你真正秀起来 前言 后台管理系统前端框架,现在很流行的形式都是,上方和左侧都是导航菜单,中间是具体的内容.比如阿里云.七牛云.头条号.百家号等 ...

  3. Vue + Element UI 实现 登陆注册基本demo实例

    Vue + Element UI 实现权限管理系统 前端篇(二):Vue + Element 案例 导入项目 打开 Visual Studio Code,File --> add Folder ...

  4. 【Vue 快速入门】从零开始搭建 VUE + Element UI后台管理系统框架

    [Vue 快速入门]从零开始搭建 VUE + Element UI后台管理系统框架 前言 后台管理系统前端框架,现在很流行的形式都是,上方和左侧都是导航菜单,中间是具体的内容.比如阿里云.七牛云.头条 ...

  5. 基于vue(element ui) + ssm + shiro 的权限框架

    zhcc 基于vue(element ui) + ssm + shiro 的权限框架 引言 心声 现在的Java世界,各种资源很丰富,不得不说,从分布式,服务化,orm,再到前端控制,权限等等玲琅满目 ...

  6. 【vue开发问题-解决方法】(五)vue Element UI 日期选择器获取日期格式问题 t.getTime is not a function

    [vue开发问题-解决方法](五)vue Element UI 日期选择器获取日期格式问题 t.getTime is not a function 参考文章: (1)[vue开发问题-解决方法](五) ...

  7. 【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Table表格增删查改、Pagination分页、搜索框

    文章目录 目标 代码 0.结构 1.按钮-删除 2.按钮-编辑 3.debug 4.样式 5.分页Pagination:功能 6.分页Pagination:样式 7.搜索框:功能 8.搜索框:样式 总 ...

  8. 【前端】Vue+Element UI案例:通用后台管理系统-用户管理:Form表单填写、Dialog对话框弹出

    文章目录 目标 代码 0.页面结构 1.新增按钮和弹出表单:结构 2.新增按钮和弹出表单:点击新增弹出表单 3.表单样式 4.表单验证 5.表单的提交和取消功能:接口.mock相关准备 6.表单的提交 ...

  9. VUE element ui 动态合并单元格问题

    ** VUE element ui 动态合并单元格问题** 1.基础方法 //最开始从网上找到了一个基本的可以同时兼顾行和列的方法,时间太久忘记出自哪里了.如下: //效果 //绑定 :span-me ...

最新文章

  1. R语言dplyr处理dataframe:使用mutate函数生成新的列、recode函数进行数据编码、rename函数重命名字段、arrange排序数据列、select筛选数据、filter过滤数据
  2. oracle11g自带优化吗,windows下Oracle11g的优化教程
  3. Django搭建个人博客:给文章加个漂亮的标题图
  4. nginx---ngix虚拟主机配置实例
  5. 2020-11-24(dll注入的N种搞法)
  6. 详细讲解Python中继承内容之 单继承;(一)
  7. bzoj3299 [USACO2011 Open]Corn Maze玉米迷宫
  8. import openfire4.0.2 source code in eclipse
  9. HTML day02
  10. 15.2. 网络监控
  11. 遇到不适当的参数_高清兽用B超机参数调整——“增益”
  12. java rxtx 串口_Java使用RXTX进行串口SerialPort通讯
  13. WebRTC 非常适用于智能家庭安防摄像头
  14. unity屏幕渐变黑白效果
  15. 虚拟局域网软件开源_用于云和虚拟化的事实上的标准开源软件包括Linux
  16. github官网无法进入的问题
  17. Tirp(状压DP)
  18. PHP 如何获取客户端的IP地址
  19. golang中的gin框架学习
  20. 李小龙私人的超级训练计划

热门文章

  1. 银行信贷管理学试题库【1】
  2. 教你看懂花艺色彩搭配的12色轮
  3. DllMain函数详解
  4. JSD-2204-续 配置中心-Nginx-Linux部署java项目-Day19
  5. Excel:如何按自己的要求来自定义排序。
  6. nas918+支持的cpu_迈进PCIe 4.0 十一代酷睿IO技术大升级:不止是速度翻倍-Intel ,PCIe 4.0,酷睿,CPU ——快科技(驱动之家旗下媒体)-...
  7. NIPS'22 | USB: 统一、任务多样化、对学术界更友好的半监督学习算法库
  8. LeetCode435—无重叠区间(java版)
  9. 基于深度学习的口罩检测系统(Python+清新界面+数据集)
  10. 一个图书编辑在南美逛书展(下)