element-plus-dark v3.0.0
element-plus-dark
起源
Element UI 和现在的 Element Plus 已经成为事实上的 Vue 项目首选骨架,也就是说,哪怕你只需要 Layout、Button、Input 寥寥几个组件,Element 也是首选。
同时,一些项目可能需要暗黑模式,而 Element Plus 目前还未提供官方解决方案,因此诞生了这个非官方项目:Element Plus Dark。
2022 年 2 月 7 日,Element Plus 正式版上线。
2022 年 2 月 17 日,非官方的暗黑模式解决方案 Element Plus Dark v1.0.0 上线。
DEMO
http://www.el-pp.com/dark-mode
更新日志
v3.0.0-2022.7.21:适应 Element Plus 2.2.0 以后版本,做了若干改进。
v2.0.2-2022.3.22:根据反馈,修改了 Button 组件的暗黑模式样式,变得更合理。
v2.0.1-2022.2.24:删除了一个本项目新增的变量
--dark-bg-color-dark,合并到--el-disabled-bg-color。不妨碍使用。v2.0.0-2022.2.23:将 CSS 变量声明的位置从
:root改为.element-plus-dark,以便更容易实现一键关闭暗黑模式。你的项目需要做的对应调整是必须给body标签加上这个类名。如果你的项目打算局部使用暗黑模式,且绝对不使用有弹出层的组件,那么类名也可以放在更深层的元素上。
安装
yarn add element-plus-dark使用方法
引入 SCSS
1. main.js
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css';
import App from './App.vue'; // 引入 App.vue 必须放在引入 Element Plus 之后,因为需要在 App.vue 中引入 element-plus-dark,覆盖 Element Plus 原有变量和样式2. App.vue
// SCSS
$dark-bg-color-base: rgb(你的基本背景色); // 应写,不写即使用默认暗黑背景色 rgb(29, 59, 93)
$dark-mixed-color: rgb(一个接近于白色的色值,用于跟背景色混合成文本颜色和边框颜色); // 可以不写,不写默认使用 #ffffff
@import 'element-plus-dark/index.scss';基础背景色的来源:
如果暗黑模式下用到了大背景图,这时候基础背景色应来自于大背景图,你可以使用图片取色工具(例如https://www.matools.com/image-color)来识别背景图的主背景色。没有背景图的话,就看设计师怎么设计,或者前端工程师怎么选色。
3. index.html
给body标签加上class="element-plus-dark"即可。
进阶步骤
1. 使用官方的《自定义主题》
根据 Element Plus 官方提供的《自定义主题》功能,重定义primary、success、danger……的一个或几个色值,即可生成一套定制化更高的暗黑模式主题。
2. 实现一键换肤
详见《本项目文档》。
3. 实现一键关闭黑暗模式
详见《本项目文档》。
本方案优势
1. 使用足够简单
最简单情况下,你只需要确定“基本背景色”这一个色值,即可生成一套漂亮的暗黑模式主题。
最复杂情况下,你也只需要先确定基本背景色,再根据 Element Plus 官方提供的《自定义主题》功能,重定义primary、success、danger……的一个或几个色值,即可生成一套定制化更高的暗黑模式主题。
2. 有科学的变量设计理念和变量使用理念
设计理念在下文详细介绍。
变量设计理念
1. 单变量入口
只需要给 Sass 变量$dark-bg-color-base赋予合理的色值,作为主背景色,其他所有变量全部由这个变量计算而成,包括有一些 Element Plus 原本写死的色值,我方案都改成了计算值。
2. 其他变量依赖计算
使用者只需确定 3 类变量:背景色、文本色、边框色。当然,使用者可以自行修改它们的算法。
3. 尽量迁就 Element Plus 原有 CSS 变量,重新赋值
这样的变量例如--el-bg-color等。
4. 创造一些新的 CSS 变量
主要是 6 个背景色变量,可以说它们是我方案的核心变量。
5. 抛弃官方的某些原有变量
官方某些变量在我方案中必须抛弃使用,比如--el-color-white,这是官方欠考虑的一个变量,它的值是写死的#ffffff,可能官方的考虑是将来#ffffff可以改为灰白色或者深色,但是,这个变量有时用在文本上,有时用在背景上,在暗黑模式中,白色的字是常见的,往往可以继续沿用,但白色的背景是大忌讳,必须改为暗黑背景,一个变量不可能同时负责文本的白色和背景的深色,这是冲突的,所以我方案只能抛弃这个变量。
变量使用理念
1. 页面主内容区使用基本背景色
这毫无疑问。
2. 位于主内容区中的大型组件,使用基本背景色
比如 Calendar 应使用基本背景色。
3. 弹出层,分两种情况考虑:
如果弹出层有半透明蒙版,这时候弹出层是作为当前内容区的,比如 Dialog 等,那么弹出层的背景色也使用基本背景色。
如果弹出层没有半透明蒙版,比如 Cascader、Select 等,那么弹出层的背景色要使用
--dark-bg-color-light-1,也就是比基本背景色亮一点,以示区分。如果弹出层之上继续弹出新层,那么使用--dark-bg-color-light-2。
4. 输入框的背景色,使用--dark-bg-color-light-1
在暗黑模式中,输入框背景显然需要跟主背景相区分,要更亮一点,而且它应跟它的下拉层背景色一致,以表示下拉是输入框的延伸,是一个整体,当点击下拉的内容,内容就会跳到输入框中。上文说过,它的下拉弹出层应使用--dark-bg-color-light-1,恰好它自身也是用--dark-bg-color-light-1,可谓恰到好处。
5. 基本背景色上的高亮色,使用--dark-bg-color-light-1
这毫无疑问。
6. --dark-bg-color-light-1里面又需要高亮,使用--dark-bg-color-light-2
比如日期选择器的下拉弹出层,它本身是一级高亮,鼠标悬停在日期上的时候,又需要高亮,也就是高亮的高亮,那么使用二级高亮。
7. 二级高亮之上再高亮,使用--dark-bg-color-light-3
极少场合需要用到,在此不举例。
8. disabled 色、不可点击色,一律使用--el-disabled-bg-color
通常情况下,无论什么上下文,一律使用--el-disabled-bg-color,以表示统一。但是,如果 Element Plus 的某个组件的原本设计是不用 disabled 色,那么我方案也不用。
9. Loading 组件的蒙版背景色,重置为--dark-bg-color-base-alpha
在白色背景下,蒙版的背景色值无论基于rgb(0,0,0)还是基于rgb(255,255,255)做透明效果都可以接受,但是在暗黑模式下,这个蒙版的背景色值无论基于rgb(0,0,0)还是基于rgb(255,255,255)做透明效果都是不科学的,效果会非常突兀,就放佛一块膏药压在区域上方,因为暗黑背景下,背景色的差异会很明显,很突兀。所以我方案设定了这个变量,用于蒙版的背景色。
10. 不要有白色背景的交互组件
这里尤其强调 Button 组件,在不设定type属性的前提下,它的背景色是纯白色,在白色主题下,白色表示“低调、不显眼”,但是在暗黑模式下,白色表示“夜空中最亮的星”,所以尽量不要使用不带type属性的 Button。某些组件内嵌了不带type的 Button,我方案专门做了美化处理。