使用css变量实现前端无刷新切换主题

项目使用的是Vue3+viewUI前端框架,该框架使用的主要less颜色变量有

less 复制代码
// Color #2d8cf0
@primary-color: #036db7; //用于导航、重要按钮
@info-color: #55aeee;
@success-color: #19be6b;
@processing-color: @primary-color;
@warning-color: #ff9a09; //用于重要提示按钮
@error-color: #f85850; //用于重要警示按钮
@normal-color: #e6ebf1;
@link-hover-color: tint(@primary-color, 20%);
@link-active-color: shade(@primary-color, 5%);
@selected-color: fade(@primary-color, 90%);
@tooltip-color: #fff;
@subsidiary-color: #dddddd;
@rate-star-color: #f5a623;
@white: #fff;
@black: #000;

//font-color
@main-font-color: #000; //页面中文字主色 用于重要文字  如标题、短文本等
@assist-font-color: #606266; //用于辅助文字如导航未选文字等
@des-font-color: #909296; //用于描述性文字如选课时间、创建时间等

从中可以抽离出一种基础颜色,6中根据基础色计算的配色,从css文件中预先定义好css变量,方便后面用js直接覆盖变量的值

css 复制代码
:root{
    --theme: #036db7;
    --fade90: rgba(3,109,183,0.9);
    --fade20: rgba(3,109,183,0.2);
    --shade5: #368a e;
    --tint20: #368bc6;
    --tint80: #cde2f1;
    --tint90: #e6f1f8;
}

定义切换主题的js方法,设置主题与还原主题app.config.globalProperties.$initThemeColor为vue3定义全局变量的方式

javascript 复制代码
// 设置主题公共函数 defaultColor 为rgba模式值
    app.config.globalProperties.$initThemeColor=function(defaultColor){
        const value = defaultColor.replace('rgba(', '').replace(')', '').split(',');
        var themeObj = {
            theme: value.map(Number), //主题原色
            fade90: value.map(Number), //90%透明
            fade20: value.map(Number), //20%透明
            shade5: value.map(Number), //与黑色混合5%
            tint20: value.map(Number), //与白色混合20%
            tint80: value.map(Number), //与白色混合80%
            tint90: value.map(Number), //与白色混合90%
        };

        // 仿fade函数
        themeObj.fade90[3] = .9;
        themeObj.fade20[3] = .2;

        // 仿shade函数和tint函数
        for(let i=0;i<3;i++){
            themeObj.shade5[i] = Math.ceil(themeObj.shade5[i]-themeObj.shade5[i]*0.05);
            themeObj.tint20[i] = Math.ceil(themeObj.tint20[i]+(255*0.2)-(themeObj.tint20[i]*0.2));
            themeObj.tint80[i] = Math.ceil(themeObj.tint80[i]+(255*0.8)-(themeObj.tint80[i]*0.8));
            themeObj.tint90[i] = Math.ceil(themeObj.tint90[i]+(255*0.9)-(themeObj.tint90[i]*0.9));
        }

        // 修改css原生变量
        for(let key  in themeObj){
            document.documentElement.style.setProperty('--'+key,'rgba('+themeObj[key]+')');
        }
    }

    // 还原主题
    app.config.globalProperties.$resetThemeColor=function(){
        const defaultCssVar={
            theme: '#036db7',
            fade90: 'rgba(3,109,183,0.9)',
            fade20: 'rgba(3,109,183,0.2)',
            shade5: '#0368ae',
            tint20: '#368bc6',
            tint80: '#cde2f1',
            tint90: '#e6f1f8',
        }
        for(let key  in defaultCssVar){
            document.documentElement.style.setProperty('--'+key,defaultCssVar[key]);
        }
    }

缓存中预埋一个颜色值,main.js初始化主题

scss 复制代码
//初始化主题色
if(localStorage.themeColor){
	app.config.globalProperties.$initThemeColor(localStorage.themeColor);
}else{
	app.config.globalProperties.$resetThemeColor();
}

首页新增一个选择颜色的功能

ini 复制代码
changeTheme(color){
            if(color.length > 0){
                this.$initThemeColor(color);
            }else{
                this.$resetThemeColor();
            }
            color = color.length > 0 ? color : 'rgba(3,109,183,1)';
            localStorage.themeColor=color;
            this.themeColor=color;
        }

最后将框架css源码里面的对应颜色手动替换为上面的css变量,改完之后在项目根目录的index.html中引入该样式文件就可以了

实现的效果

相关推荐
264玫瑰资源库5 分钟前
问道数码兽 怀旧剧情回合手游源码搭建教程(反查重优化版)
java·开发语言·前端·游戏
喝拿铁写前端16 分钟前
从圣经Babel到现代编译器:没开玩笑,普通程序员也能写出自己的编译器!
前端·架构·前端框架
HED22 分钟前
VUE项目发版后用户访问的仍然是旧页面?原因和解决方案都在这啦!
前端·vue.js
拉不动的猪43 分钟前
前端自做埋点,我们应该要注意的几个问题
前端·javascript·面试
王景程1 小时前
如何测试短信接口
java·服务器·前端
安冬的码畜日常1 小时前
【AI 加持下的 Python 编程实战 2_10】DIY 拓展:从扫雷小游戏开发再探问题分解与 AI 代码调试能力(中)
开发语言·前端·人工智能·ai·扫雷游戏·ai辅助编程·辅助编程
小杨升级打怪中1 小时前
前端面经-JS篇(三)--事件、性能优化、防抖与节流
前端·javascript·xss
清风细雨_林木木1 小时前
Vue开发网站会有“#”原因是前端路由使用了 Hash 模式
前端·vue.js·哈希算法
鸿蒙布道师2 小时前
OpenAI为何觊觎Chrome?AI时代浏览器争夺战背后的深层逻辑
前端·人工智能·chrome·深度学习·opencv·自然语言处理·chatgpt
袈裟和尚2 小时前
如何在安卓平板上下载安装Google Chrome【轻松安装】
前端·chrome·电脑