element-ui动态切换主题

公司需要切换主题的功能,用的ui框架是element-ui。百度了一堆之后用了有2个实现方法:

一、通过给样式表添加前置classname名称实现。主要流程是:

先放默认加载的样式表,在main.js里引入即可

1、theme-chalk-preview

用官网自带的下载主题包功能先把样式表下载下来。除了里面的index.css,其他删掉,index.css里面字体部分也删掉。搞定之后如下:

2、然后安装gulp,有这四个

装完之后在根目录下建一个gulpfile.js文件,在里面写gulp任务。

搞完之后gulp setTheme运行即可。完成后打开刚才的主题样式文件,里面已经加好前置的classname了。

3、接下来就简单了,写个方法运行以下代码,给body上个classname就搞定了。

let bodys = document.getElementsByTagName('body')
bodys[0].className = 'theme-' + color

tips:顺便也说一下这么做的问题。就是这么做的话不管是不是主题色都会加前置样式

比如:.el-button--small会变成 .theme-B14D29 .el-button--small,但.el-button--small这个样式我要自定义padding时就发现它已经有前置classname了,我也必须把优先级提高,高于.theme-B14D29才行。那如果有很多自定义样式那改起来就酸爽了。

二、用:root重定义变量来改

1、第一步和第一种方法一样,先去element官网搞个样式表下来,但需要改成scss文件格式,后面引用变量用。

2、根据element-ui的sass变量来定义我们自己的变量,我比较懒,去掉了$符号就拿来用了。

比如下面这样,弄个var.scss,命名都套用,简单粗暴。

@import '~element-ui/packages/theme-chalk/src/common/var.scss';
:root{
  --color-primary: #{$--color-primary};
  --color-white: #{$--color-white};
  --color-black: #{$--color-black};

  --color-primary-light-1: #{$--color-primary-light-1};
  --color-primary-light-2: #{$--color-primary-light-2};
  --color-primary-light-3: #{$--color-primary-light-3};
  --color-primary-light-4: #{$--color-primary-light-4};
  --color-primary-light-5: #{$--color-primary-light-5};
  --color-primary-light-6: #{$--color-primary-light-6};
  --color-primary-light-7: #{$--color-primary-light-7};
  --color-primary-light-8: #{$--color-primary-light-8};
  --color-primary-light-9: #{$--color-primary-light-9};
}

然后element-ui自己的var.scss里面有色值和规则,左边的是色值,右边的颜色合并的规则,后面就根据这些规则修改对应变量的颜色。

现在色值和规则都有了,打开你下载的样式文件,根据色值去替换变量就行了。

比如:将所有 #409EFF 替换成 var(--color-primary)。变成下面这样就行了。

记得在头部引入你自己的var.scss,不然没变量用不了。

3、接下来就是js部分了,找个方法自己用

运行完就会发现html标签上一堆样式生成了。

颜色也改了,我这里就改了个主题色,要其他的根据规则自己定义就行了。

用按钮组件举个例子

规则是黑色+背景色+透明度,这些变量都是能找到的,比如$background-color在button.scss里面,就是$--button-primary-background-color这个变量,从var.scss找了下,发现就是主题色,直接用主题色就行了。$--button-active-shade-percent也是变量,查了下是10%,所以直接用就行了。

let backColor = mixColors('#000000', '#' + color, 0.1)
rootStyle.setProperty('--button-active-background-color', backColor)

tips:这个方法可以无视固定的颜色色值,任意颜色都能用,也不影响自定义样式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值