• 作者:老汪软件技巧
  • 发表时间:2024-10-03 21:01
  • 浏览量:

业务背景

随着用户对网页的要求越来越高,换肤也成为了企业关注的内容,本文会提供一个解决方案,具体实现细节请参考本文推荐的文档和源码参考

什是换肤

一般可以认为有暗黑模式,更换主题色,更换布局三个方面的内容。

暗黑主题:切换屏幕背景为黑色,其它样式跟着适配。

主题色:用户可以自定背景和各种配色。

更换布局:用户根据自己的喜好配置。

方案选择

SCSS + CSS 变量

为什么选择这两个呢,首先Eelment+plus 内部的开发是基于scss进行开发的,scss 开发对Eelement-plus样式的修改让代码更加的清洁。其二scss可以很好的实现对代码的复用。

为什么不都用scss呢,因为我们不能通过js来操作scss的变量,而我们能通过js来操作css的变量,这样方便用户随意更改自定义的属性,比如背景色,字体色,字体大小 等。

参考内容来自网页应该怎么编写__参考文本什么意思

方案落地

scss更换暗黑主题

我们可以通过给浏览器根目录添加一个属性(例如data-skin="dark"),scss通过获取data-skin的值来确定用哪个主题。具体代码

// 获取dom对象
 const body = document.documentElement as HTMLElement
 //设置属性值
 body.setAttribute('data-skin','skin1')

// 设置主题色
$themes: (
  default-theme: (
    theme-color: red,
    button-primary: blue
  ),
  skin1: (
    theme-color: #7bff00,
    button-primary: #bebe3c
  )
) !default;
// 定义一个scss方法,根据skin-data设置的值获取不同背景色
@mixin get-backcolor($color){
  @each $themename, $theme in $themes{
    [data-skin='#{$themename}'] &{
      background-color: map-get($theme,$color);
    }
  }
}
// 在scss中调用get-backcolor方法达到换肤目的
.background-theme{
  @include get-backcolor('theme-color')
}
.button-primary{
  @include get-backcolor('button-primary')
}

css变量的使用

我们把上面代码中的具体的变量的值用css变量代替

// 设置主题色
$themes: (
  default-theme: (
      // 第二个参数为默认值
    theme-color: var(--background-color-primary,red),
    button-primary: var(--background-color-primary,blue)
  )
) !default;

//通过js中的setProperty方法获取值并赋值。
 document.querySelect(":root").style.setProperty('--el-bg-color', customColor.value)

在element-plus中的使用

官方文档给出了自定义主题的方案,并且可以通过设置的方法进行背景的切换,这个方法的原理和上面提到的更换页面主题的原理一样,具体实现细节可以参考官方文档。开源项目参考这个比较好的开源项目代码 (/lyt-top/vue…)