Vue项目切换主题颜色(mixin + scss)

Vue项目切换主题颜色(mixin + scss)

一、引入scss依赖(node-sass, sass-loader,sass-resources-loader,style-resources-loader等)
npm install node-sass sass-loader sass-resources-loader --save-dev

package.json截图
在这里插入图片描述

二、 项目样式引入

项目中的公共样式文件放到了 src/styles目录下 。 theme.scss, mixins.scss两个文件为我们稍后进行主题颜色配置的文件,在vue.config.js中引入.

  • 在main.js中引入index.scss(基本公共样式)
import '@/styles/index.scss' 
  • 在vue.config.js中引入主题样式mixins.scss,theme.scss在mixins.scss中引入,截图中base.scss是封装的scss计算函数
    • 引入theme.scss在mixins.scss
    @import './theme.scss';
    
    • 引入mixins.scss
      在这里插入图片描述
三、 主题scss文件配置
  1. theme.scss文件内容,这边我这是两个主题颜色,暗色和亮色
  $default: (
  // 默认图片地址
        baseImageURL: '~@/assets/images/',
  // label颜色
        blackGray: #d6d6d6,
  // 单位颜色
        unitColor: rgba(255, 255, 255, 0.4),
  // 部分色块背景色
        baseColor: #0b8cff,
  // 盒子背景色
        bgColor: rgba(10, 16, 28, 0.18),
  // 公共盒子分割线
        commonBlockColor: #d0deee,
  // 公共盒子分割块
        commonShapeColor: rgba(255, 201, 122, 1),
        partBorderColor: #fff,
  // 公共盒子背景
        commBoxTitleBg: linear-gradient(
                        90deg,
                        rgba(106, 112, 124, 0.4) 0%,
                        rgba(106, 112, 124, 4e-5) 70%,
                        rgba(106, 112, 124, 4e-5) 100%
        ),
  // 主题边框颜色
        themeBorderColor: rgba(255, 255, 255, 0.2),
  // 主题文字颜色
        themeTextColor: #fff,
  // 地图标题下划线边框颜色
        mapBorder: rgba(255, 255, 255, 0.1),
  // 下拉框移入颜色
        themeHoverColor: rgba(11, 140, 255, 0.1),
  // 下拉框选中字体颜色
        activeFontColor: #0b8cff,
  // 默认字体颜色
        defaultFontColor: #fff,
  // 下拉框背景色
        selectBgColor: #1d232b,
  // 框架头部样式 
        headerBg: linear-gradient(180deg, #0b1015 0%, rgba(16, 22, 28, 0.2) 100%),
        headerTabChooseColor: #fff,
        headerTabFontColor: rgba(255, 255, 255, 0.6),
  // 天气标题颜色
        nameColor: rgba(255, 255, 255, 0.5),
  // 饼状图上升颜色
        distanceColor: #76f03c,
  // 饼状图下降颜色
        distanceRedColor: #ff6a3a,
);
$light: (
  // 默认图片地址
        baseImageURL: '~@/assets/themeA/',
  // label颜色
        blackGray: #d6d6d6,
  // 单位颜色
        unitColor: rgba(255, 255, 255, 1),
  // 部分色块背景色
        baseColor: #0b8cff,
  // 盒子背景色
        bgColor: rgba(10, 16, 28, 0.18),
  // 公共盒子分割线
        commonBlockColor: #d0deee,
  // 公共盒子分割块
        commonShapeColor: rgba(255, 201, 122, 1),
        partBorderColor: #fff,
  // 公共盒子背景
        commBoxTitleBg: linear-gradient(
                        90deg,
                        rgba(106, 112, 124, 0.4) 0%,
                        rgba(106, 112, 124, 4e-5) 70%,
                        rgba(106, 112, 124, 4e-5) 100%
        ),
  // 主题边框颜色
        themeBorderColor: rgba(255, 255, 255, 0.2),
  // 主题文字颜色
        themeTextColor: #fff,
  // 地图标题下划线边框颜色
        mapBorder: rgba(255, 255, 255, 0.1),
  // 下拉框移入颜色
        themeHoverColor: rgba(11, 140, 255, 0.1),
  // 下拉框选中字体颜色
        activeFontColor: #0b8cff,
  // 默认字体颜色
        defaultFontColor: #fff,
  // 下拉框背景色
        selectBgColor: #1d232b,
  // 框架头部样式 
        headerBg: linear-gradient(180deg, #0b1015 0%, rgba(16, 22, 28, 0.2) 100%),
        headerTabChooseColor: #fff,
        headerTabFontColor: rgba(255, 255, 255, 0.6),
  // 天气标题颜色
        nameColor: rgba(255, 255, 255, 0.5),
  // 饼状图上升颜色
        distanceColor: #76f03c,
  // 饼状图下降颜色
        distanceRedColor: #ff6a3a,
);
$themes: (
        default: $default,
        light: $light
)

  1. 在mixins.scss中操作theme.scss中的变量
 @import './theme.scss';

// 遍历主题map
@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);
}
// 主题图片加载混合器 $path 图片名称地址
@mixin imageURL($path) {
  @include themeify {
    background-image: url(map-get($theme-map, 'baseImageURL')+$path);
    background-repeat: no-repeat;
  }
}

//获取背景颜色
@mixin background_color($color,$important: false) {
  @include themeify {
    background: themed($color) if($important, !important, null);
  }
}

//获取字体颜色
@mixin font_color($color) {
  @include themeify {
    color: themed($color);
  }
}

//获取边框颜色
@mixin border_color($color) {
  @include themeify {
    border-color: themed($color);
  }
}
// 设置边框样式
@mixin border_style($height,$color) {
  @include themeify {
    border: $height solid themed($color);
  }
}
//获取边框颜色
@mixin border_bottom_color($color,$height:vh(2)) {
  @include themeify {
    border-bottom: $height solid themed($color);
  }
}
//获取边框颜色
@mixin border_top_color($color,$height:vh(2)) {
  @include themeify {
    border-top: $height solid themed($color);
  }
}

  1. 在vue页面使用
//引入图片
.bgImg{
  @include imageURL('leftMask.png');
}
//引入背景颜色,传true代表添加!important
.bgColor {
@include background_color('selectBgColor',true);
}
//引入文字颜色
.font{
  @include font_color('unitColor')
}


四、 切换主题

根据以下配置后,调用handleChange就可以切换主题了

 <template>
<div id="app" :data-theme="defaultTheme">
  
</div>
</template>
<script>
export default {
  computed: {
    defaultTheme () {
      return this.$store.getters.defaultTheme
    }
  },
  methods:{
    handleChange() {
      // 默认是亮色
      if(this.defaultTheme == 'default') {
        this.$store.commit('setDefaultTheme', 'dark')
      } else {
        this.$store.commit('setDefaultTheme', 'default')
      }
     
      //  this.$store.commit('setDefaultTheme', 'dark')
    }
  }
}
</script>
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下步骤实现 Vue + Element UI + SCSS 切换颜色的功能: 1. 在 Vue 的 `data` 中定义一个变量 `color` 来存储当前的颜色值,以及定义一个数组 `colors` 用来存储可选的颜色值。 ```javascript data() { return { color: '#409EFF', colors: ['#409EFF', '#67C23A', '#E6A23C', '#F56C6C'] } } ``` 2. 在模板中使用 Element UI 的 `el-color-picker` 组件来展示当前颜色,并绑定 `color` 变量。 ```html <el-color-picker v-model="color"></el-color-picker> ``` 3. 使用 SCSS 定义不同颜色的样式,并使用 Vue 的计算属性来动态生成样式。 ```scss $primary-color: #409EFF; $success-color: #67C23A; $warning-color: #E6A23C; $error-color: #F56C6C; // 定义主题颜色 @mixin theme-color($color) { --color-primary: #{$color}; --color-success: lighten(#{$color}, 15%); --color-warning: lighten(#{$color}, 30%); --color-error: lighten(#{$color}, 45%); } // 默认主题颜色 :root { @include theme-color($primary-color); } // 其他主题颜色 .theme-color { @each $color in $colors { &[data-color="#{$color}"] { @include theme-color($color); } } } ``` 在上面的代码中,使用了 SCSS 的 `@mixin` 和 `@each` 来定义不同颜色的样式,其中 `--color-primary`、`--color-success`、`--color-warning` 和 `--color-error` 是 Element UI 中预定义的 CSS 变量,用于控制不同组件的颜色。 还定义了一个 `theme-color` 类,用来动态生成主题颜色,并使用 `&[data-color="#{$color}"]` 来指定不同颜色对应的样式。 4. 在模板中使用计算属性来动态生成样式类名,并将其绑定到根元素上。 ```html <div :class="'theme-color ' + color" data-color="color"></div> ``` 在上面的代码中,使用了 `:class` 绑定了一个计算属性,其中 `theme-color` 是样式类名前缀,用于指定主题颜色,`color` 是当前选择的颜色值。 至此,一个简单的 Vue + Element UI + SCSS 切换颜色的功能就实现了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值