代码编织梦想

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>
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_46328739/article/details/132281770

Vue项目实现切换主题色思路-爱代码爱编程

需求:用户通过取色器选择自己喜欢的颜色,替换项目中的主题色 实现效果: 实现思路: 在项目中使用的是less,使用@themeColor定义了主题色,便想着尝试用js修改less的变量即可,但查询了一下只知道有less.modifyVars方法可以修改,但没有详细的说明,顺便查到了可以修改js可以修改原生css的变量,而且简单易懂,便尝试使用cs

scss混合(mixins)使用-爱代码爱编程

例一、使用混合mixins中的变量来定义一个n行文本溢出隐藏的公用样式。 1、创建mixins.scss文件 //文本n行溢出隐藏 @mixin ellipsisBasic($clamp:2) { overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webk

scss中的@mixin、@extend、数据类型、运算符号、内置函数-爱代码爱编程

1.@mixin 混合器:定义混合指令:@mixin 函数名字(参数1,参数2,。。。){} 没有返回值@return,参数可选可不选 形参一个key或者一组key与value或者是一个list项目列表 参数写自己定义的$常量,或者直接定义新的$常量($key:value,$key2) 相当于是定义一组样式 方便调用使用 用 @include

vue页面如何切换主题颜色-爱代码爱编程

要实现Vue中切换主题颜色的功能,您可以采用以下步骤: 定义不同颜色的样式变量。例如,你可以在你的样式文件中定义多个变量: css :root { --primary-color: #1890ff; //

scss切换主题风格_scss主题切换-爱代码爱编程

第一步:创建_main.scss文件,定义一个map类型的变量$themes,相当于JS中的对象,不过是用圆括号包裹。$themes中定义不同的主题名称,这里是light,dark。再定义主题对应的颜色。注意不同主题色的键值对的键名要相同。 // _main.scss // 当HTML的data-theme为dark时,样式引用dark // data-

scss常用混入(mixin)、@inclue-爱代码爱编程

@mixin和@inclue的基本使用 @mixin混入可以用于定义重复使用的样式,比如下面CSS代码 .header { display: flex; justify-content: center; ali

【scss入门】7、混合宏(mixins)_scss mixin-爱代码爱编程

【SCSS入门】混合宏(Mixins) 系列文章目录 【SCSS入门】1、什么是SCSS? 【SCSS入门】2、安装和配置SCSS环境 【SCSS入门】3、SCSS的基本语法 【SCSS入门】4、变量的使用 【SCS