Skip to content

Vue + Scss 动态切换主题颜色实现换肤 #8

@webVueBlog

Description

@webVueBlog

data-theme="light"

根据预设的配色方案,在前端实现动态切换系统主题颜色。

大概的思路就是给html根标签设置一个data-theme属性,然后通过js切换data-theme的属性值,Scss根据此属性来判断使用对应主题变量。这里可以选择持久化Vux或接口来保存用户选择的主题。

一、首先需要给项目下载配置Scss

1.安装依赖

2.找到build中webpack.base.conf.js,在rules中添加scss规则

3.在vue文件中使用

二、在vue项目全局中引入scss

1.安装 sass-resources-loader

2.然后修改build中的utils.js

三、准备工作已经做完准备开干

1.新建一个Scss文件_themes.scss,里面可以配置不同的主题配色方案

1661514074479

这里定义了一个map--$themes,分别存放对应主题的颜色变量集合。

注意,scss文件名建议用下划线开头,如_themes.scss,防止执行时被编译成单独的css文件。

2.定义另外一个sass文件_handle.scss来操作1中的$theme变量(当然两个文件可以合并,分开写是想把配置和操作解耦),上代码:

@import "./_themes.scss";

// 遍历主题map
// themeify方法用于获取HTML的data-theme值
// themed方法用于根据HTML的data-theme值

@mixin themeify {
  @each $theme-name, $theme-map in $themes {
    //!global 把局部变量强升为全局变量
    $theme-map: $theme-map !global;
    //判断html的data-theme的属性值  #{}是sass的插值表达式
    //& sass嵌套里的父容器标识   @content是混合器插槽,像vue的slot
    [data-theme="#{$theme-name}"] & {
      @content;
    }
  }
}

//声明一个根据Key获取颜色的function
@function themed($key) {
  @return map-get($theme-map, $key);
}

//获取背景颜色
@mixin background_color($color) {
  @include themeify {
    background-color: themed($color);
  }

themeify方法用于获取HTML的 data-theme值。

themed方法用于根据HTML的 data-theme值及调用者传过来的key去 _themes.scss里获取相应的颜色。

上面可以根据自己的使用场景自定义混入器,上面只定义了三个常用的背景&边框&字体的颜色。

3.具体在vue中使用,直接引入对应混入器就好,取哪个颜色,传哪个key,就这么简单

1661514659958

3.使用js动态切换HTML的属性data-theme的值

1661514786231

切换后会发现你的css选择器前面多了一些东西 [data-theme="dark"]

1661514856614

至此,大功告成!

https://blog.csdn.net/lhjuejiang/article/details/118214226

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions