pig-ui/vue-admin-wonderful-next-docs/docs/theme
2020-12-22 23:18:02 +08:00
..
README.md 'admin-20.12.22:新增自定义全局主题文档编写' 2020-12-22 23:18:02 +08:00

sidebar
auto

主题设置

目录结构

src/theme 下,后期继续补充,样式都会写在这个文件夹下:

├── theme
	├── common
		├── transition.scss (页面过渡动画)
		└── var.scss (全局主题样式,用于全局改变样式)
	
	├── mixins
		├── element-mixins.scss (定义重置的element plus混入复用样式)
		├── function.scs (全局主题颜色调用混入函数)
		└── mixins.scss (定义一些常用的全局混入样式)
	
	├── app.scss (页面主样式,用于重置浏览器默认样式)
	├── base.scss (基础样式、过渡动画等)
	├── element.scss (重置的element plus样式,用于改变主题)
	├── index.scss (页面样式出口)
	└── media.scss (手机适配样式)

scss 部分函数说明

1、scss @mixin

scss官方中文文档,具体请查阅官方文档。使用方法:

  • 1.1 定义
/* Button 按钮
------------------------------- */
@mixin Button($main, $c1, $c2) {
  color: set-color($main);
  background: set-color($c1);
  border-color: set-color($c2);
}
  • 1.2 页面中使用,先引入,然后在 css 类中通过 @include 使用
@import 'mixins/element-mixins.scss';

// default
.el-button--default:hover,
.el-button--default:focus {
  @include Button(primary, primary-light-8, primary-light-6);
}

2、scss @function

  • 2.1 定义函数
/* 颜色调用函数
------------------------------- */
@function set-color($key) {
  @return var(--color-#{$key});
}
/* 定义一个名为 "--main-bg-color" 的属性,然后使用 var() 函数调用该属性: */
:root {
  --main-bg-color: red;
}
 
#div1 {
  background-color: var(--main-bg-color);
}
 
#div2 {
  background-color: var(--main-bg-color);
}

3、为什么不使用这种写法放进 :root 中?

$colors: (
	primary: #409eff,
	success: #67c23a,
	info: #909399,
	warning: #e6a23c,
	danger: #f56c6c
)

:root {
	@each $key, $value in $colors {
		--color-#{$key}: #{$value};
	}
}
  • 因为 scss 不支持这种嵌套 mix(var(--color-primary), var(--color-success), 10%)lighten / darken / saturate / desaturate 等,从而无法用
  • 从而无法用 document.documentElement.style.setProperty('--color-primary', 'blue'); 改变样式

具体实现自定义全局主题

实现方法,以下方法不晓得会不会影响页面渲染性能:

  • 1、定义全局 :root 初始变量,路径:src/theme/common/var.scss
  • 2、编写覆盖 element plus 的样式:路径:src/theme/element.scss
  • 3、页面通过 document.documentElement.style.setProperty 方法改变 :root 中的值

::: tip 提示 第一第二步就不介绍了,直接去路径去看就懂了。接下来我们讲讲第三步: :::

1、通过 document.documentElement.style.setProperty 改变颜色值 setProperty 文档

// setup 中
import { reactive, toRefs } from "vue"

export defalut {
	setup() {
		const state = reactive({
			color: ''
		})
		function colorChange() {
			// 设置颜色
			document.documentElement.style.setProperty(
				"--color-primary",
				state.color
			)
			// 设置颜色变浅
			document.documentElement.style.setProperty(
				"--color-primary-light-1",
				getLightColor(state.color1, 0.1)
			)
		}
		return {
			colorChange,
			...toRefs(state)
		}
	}
}

2、getLightColor 颜色变浅方法

路径在:src/utils/theme.ts

// 变浅颜色值level为加深的程度限0-1之间
export function getLightColor(color: any, level: number) {
    let reg = /^\#?[0-9A-F]{6}$/;
    if (!reg.test(color)) return ElMessage({type:'warning',message:"输入错误的hex颜色值"});
    let rgb = hexToRgb(color);
    for (let i = 0; i < 3; i++) rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]);
    return rgbToHex(rgb[0], rgb[1], rgb[2]);
}

3、到此就完成了主题的全局变色了

::: tip 还有疑问? 总的来说,就是通过重新定义 css 样式,用来覆盖 element-plus 默认的样式,从而实现全局主题变色。 :::

其它方法实现全局主题