首页 > 其他分享 >Vue项目如何配置、切换主题颜色(mixin + scss方式,简单高效)

Vue项目如何配置、切换主题颜色(mixin + scss方式,简单高效)

时间:2023-04-28 17:13:02浏览次数:36  
标签:scss Vue mixin color theme background fff logo border

Action
一. 首先,引入scss依赖(node-sass, sass-loader)
npm install node-sass sass-loader --save-dev
1
二.项目样式文件目录介绍
1.此处我将项目中的公共样式文件放到了 src/style目录下,其中 index.scss是以供全局使用的一些基本样式,在main.js文件中引入即可全局使用(图2)。 _theme.scss, _handle.scss两个文件为我们稍后进行主题颜色配置的文件.

 

三.主题目录scss文件配置

1.src/style目录下的_themes.scss,里面可以配置不同的主题配色方案,这里我配置了三个主题颜色,分别为basic、red、blue。
_themes.scss文件内容:

$themes: (

    basic: (
        basic_color: #3064E7,// 主题色
        logo_color: #3064E7,   // 主题色字体
        title_color: #494D50, //新增、注册、行业标头字体颜色
        foot_tolor: #5E6165, // 页脚字体颜色
        font_color1: #909399,
        font_color2: #909399,
        // 小logo图片
        logo_image: url('@/assets/image/logo.png'), 
        // 大logo图片
        big_logo_image: url('@/assets/image/logo_big.png'), 
        // banner图片
        banner_image: url('@/assets/image/basic_banner.png'),
        // 首页搜索按钮
        search_btn: linear-gradient(187deg, #5E9DF5 0%, #3064E7 47%),
        // 注册动态下边框
        border_bottom_1: 1px solid #3064E7,
        // 注册动态边框
        card_border_1: 1px solid rgba(208,211,219,1),
        // 注册动态卡片背景
        zhuce_card: #fff,
        // 新闻标题聚焦颜色
        font_hover: #3064E7,

        //背景
        navbar_background: #fff,
        background_color2: #f0f2f5,
        // 新闻时事背景
        // news_background:  #fff,
        // 注册动态背景
        zhuce_background:  #fff,
        // 行业资讯背景
        hangye_background: #fff,
        background_color3: red,
        background_color4: #2674e7,
        
        //边框
        border_bottom: 5px solid #4554DE,
    
    ),
    
    red: (
        basic_color: #D0021B,
        logo_color: #fff,
        title_color: #494D50, //新增、注册、行业标头字体颜色
        foot_tolor: #5E6165, // 页脚字体颜色
        font_color1: #909399,
        font_color2: #fff,
        // 新闻标题聚焦颜色
        font_hover: #D0021B,
        
         // 小logo图片
        logo_image: url('@/assets/image/logo_white.png'),  
        // 大logo图片
        big_logo_image: url('@/assets/theme/redTheme/logo-b.png'), 
        // banner图片
        banner_image: url('@/assets/theme/redTheme/banner-bg.png'),
         // 首页搜索按钮
        search_btn: linear-gradient(187deg, #d20000  0%, #da0707de  47%),
        // 注册动态下边框
        border_bottom_1: 2px solid #D0021B ,
        // 注册动态边框
        card_border_1:  1px solid rgba(208,211,219,1),
        // 注册动态卡片背景
        zhuce_card: #fff,

        //背景
        navbar_background: url('@/assets/theme/basicTheme/top-bg.png'),
        background_color2: #283142,
        // 新闻时事背景
        // news_background:  #fff,
        // 注册动态背景
        zhuce_background:  #fff,
        // 行业资讯背景
        hangye_background: #fff,
        background_color3: #1e6ceb,
        background_color4: #323e4e,
    
        //边框
        border_bottom: 5px solid #fff,
    ),

    blue: (
        basic_color: #0DECFF ,
        logo_color: #fff,
        title_color: #fff, //新增、注册、行业标头字体颜色
        foot_tolor: #B2D4F5 , // 页脚字体颜色
        font_color1: #909399,
        font_color2: #fff,
        // 新闻标题聚焦颜色
        font_hover: #0E458C,
       
         // 小logo图片
        logo_image: url('@/assets/image/logo_white.png'),  
        // 大logo图片
        big_logo_image: url('@/assets/theme/redTheme/logo-b.png'), 
        // banner图片
        banner_image: url('@/assets/theme/blueTheme/y.png'),
         // 首页搜索按钮
        search_btn: linear-gradient(187deg, #0076FF  0%, #0076FF  47%),
        // 注册动态下边框
        border_bottom_1: 2px solid #0DECFF ,
        // 注册动态卡片背景
        zhuce_card: #034488,
        // 注册动态边框
        card_border_1: 2px solid rgba(8,93,185,1),

        //背景
        navbar_background: #0E458C,
        foot_background: linear-gradient(131deg, #005FBC 0%, #08215F 100%),
        // 新闻时事背景
        news_background:  url('@/assets/theme/blueTheme/科技蓝.png') no-repeat,
        // 注册动态背景
        zhuce_background: #033367,
         // 行业资讯背景
        hangye_background: #033367,
        background_color2: #283142,
        background_color3: #1e6ceb,
        background_color4: #323e4e,
    
        //边框
        border_bottom: 5px solid #fff,
    ),


);

2.src/style/下的 _handle.scss来操作上述1中的$theme变量(当然两个文件可以合并,分开写是想把配置和操作解耦),上代码:
_handle.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);
}

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

//获取图片
@mixin content($color) {
    @include themeify {
        content: themed($color)!important;
    }
}

//获取背景图片
@mixin border_bottom($color) {
    @include themeify {
        border-bottom: themed($color)!important;
    }
}

//获取背景图片
@mixin border($color) {
    @include themeify {
        border: themed($color)!important;
    }
}

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

//获取边框颜色
@mixin border_color($color) {
    @include themeify {
        border-color: themed($color)!important;
    }
}

3.主题样式文件都配置好了,接下来就是怎么全局引入这两个文件及 怎么在vue页面中使用了,此处我们先看 vue页面中怎么使用 我们在_theme.scss中配置好的样式:
这里以其中一个页面为例,其他页面同理:

 4.样式文件基本都配置完成了,最后说最重要的一点:怎么知道当前我们需要用的样式呢?

 

此处根据具体情况具体分析,在合适的页面或位置写入即可,此处我是放到了 App.vue项目入口文件中,在进入文件后 通过window.document.documentElement.setAttribute()方法传入你当前想要使用的主题,此处我传入的’blue‘(蓝色主题),则vue页面中使用的即为_theme.scss中的 blue对象下配置好的颜色或者其他属性,
为其他主题色(如’red’,‘basic’同理,前提是_theme.scss文件中有已经配置好的这两个主题色)

 

原文:https://blog.csdn.net/h395910638/article/details/129261076

标签:scss,Vue,mixin,color,theme,background,fff,logo,border
From: https://www.cnblogs.com/mmzuo-798/p/17362674.html

相关文章

  • vue3 + ts + vite 封装 request
    npmiaxios目录 request.ts (直接复制可用)importaxiosfrom"axios";import{showMessage}from"./status";//引入状态码文件import{ElMessage}from"element-plus";//引入el提示框,这个项目里用什么组件库这里引什么//设置接口超时时间axios.defa......
  • vue3自定义指令实现el-select下拉加载更多
    1.新建js文件exportdefault(app)=>{app.directive('loadmore',{beforeMount(el,binding){constelement=el.querySelector('.t-select__dropdown');element.addEventListener('scroll',()=>{co......
  • Vue2.0和3.0区别
    一、项目初始化2.0初始化,vueinit<模板名称(webpack比较常用)>[项目名称]vueinitwebpackcli2-test3.0初始化,vuecreate[项目名称]vuecreatecli3-test二、目录结构对比2.0目录结构 3.0目录结构 3.0版本中项目环境变量配置文件没有了(dev.env.js/prod.env.js......
  • Vue2.0版本升级到vue3.0
    vue版本的升级主要步骤:一、首先需要卸载你之前的vue2.0版本输入cmd–>回车–>进入dos界面输入命令查询vue的版本:vue-Vorvue-Version输入命令卸载目前vue版本:npmuninstall-gvue-cli再输入vue版本查询命令,提示“不是可执行的命令”则表示卸载成功了。二、安装新......
  • Vue插件图片预览hevue-img-preview
    安装#安装npminstallhevue-img-preview--save#main.js引入importhevueImgPreviewfrom'hevue-img-preview'Vue.use(hevueImgPreview)#使用#//给任意对象添加任意事件,例如<img:src="imgurl"@click="previewImg(imgurl)">#//在事件里调用方法进行预......
  • 动力节点老杜Vue框架教程【五】Vuex
    Vue.js是一个渐进式MVVM框架,目前被广泛使用,也成为前端中最火爆的框架Vue可以按照实际需要逐步进阶使用更多特性,也是前端的必备技能动力节点老杜的Vue2+3全家桶教程已经上线咯!学习地址:https://www.bilibili.com/video/BV17h41137i4/视频将从Vue2开始讲解,一步一个案例,知识点......
  • 在vue中使用websocket
    封装根据项目的目录结构,在相应的文件夹下创建一个js文件,用来封装一个websocket类,假如项目中用到js的地方很多,最好把文件放在全局公共文件夹中;exportclassWS{ constructor(config){  this.ws=null;  this.url=null;  this.config=config;  ......
  • vue 使用腾讯云 cos存储 上传
    参考文档:https://blog.csdn.net/qq_34170840/article/details/1245203881、页面部分点击查看代码<inputref="fileRef"title=""type='file'name="file"multipleclass="file-input"@change="uploadStart......
  • 老杜2023最新Vue实战精讲(五)Vuex
    动力节点老杜全新版Vue教程笔记分享给大家学习の地止:https://www.bilibili.com/video/BV17h41137i4视频教程从Vue2开始讲解,一步一个案例,知识点由浅入深,然后很自然的过度到Vue3版本。Vue3是目前企业中使用最多的一个版本。视频中会把每一个Vue的知识点讲解的非常通透,不但举例......
  • vuex持久化
    1、使用场景vuex刷新之后数据会消失2、使用方法(1)结构1点击查看代码import{createStore}from"vuex"importstatefrom'./state'importmutationsfrom'./mutations'importactionsfrom'./actions'import*asgettersfrom'./getter......