js动态设置css主题(Style-setProperty)

hex颜色转RGB


javascript 复制代码
hex2rgb(str = '') {
        str = str.replace("#", "");
        const hxs: any = str.match(/../g);
        for (let index = 0; index < 3; index++) hxs[index] = parseInt(hxs[index], 16);
        return hxs;
    }

RGB转HXS


javascript 复制代码
rgb2hex(r: any, g: any, b: any) {
        const hexs = [r.toString(16), g.toString(16), b.toString(16)];
        for (let index = 0; index < 3; index++) {
            const isHave = hexs[index].length == 1;
            if (isHave) hexs[index] = "0" + hexs[index];
        }
        return "#" + hexs.join("");
    }

颜色加深


javascript 复制代码
getDark(color: any, level: any) {
        const rgb = this.hex2rgb(color);
        for (let index = 0; index < 3; index++) {
            rgb[index] = Math.floor(rgb[index] * (1 - level))
        }
        return this.rgb2hex(rgb[0], rgb[1], rgb[2]);
    }

颜色变淡


javascript 复制代码
getLight(color: any, level: any) {
        const rgb = this.hex2rgb(color);
        for (let index = 0; index < 3; index++) {
            rgb[index] = Math.floor((255 - rgb[index]) * level + rgb[index])
        }
        return this.rgb2hex(rgb[0], rgb[1], rgb[2]);
    }

定义后端返回主题色


定义的参考色,在开发的过程中希望后端人员能遵循

javascript 复制代码
const themeConf={
    primary: '#183ee4',
	success: '#0cce63',
	warn: '#ff4900',
	danger: '#f00c63'
}
javascript 复制代码
getTheme(temeConf) {
    const obj={};
    Object.keys(temeConf).forEach(key => {
	    let color = temeConf[key];
        // 用于按钮点击颜色
	    const dColor = this.getDark(color, 0.2);
	    obj[`--${key}`] = color;
	    obj[`--${key}--active`] = dColor;
	    for (let num = 1; num <= 4; num++) {
	        const val = this.getLightColor(color, num / 10);
	        obj[`--${key}-${num}`] = val;
	    }
    });
    return obj;
}

将组元录入

1、在index.html内添加style标签录入(可录入::root下不挂在到任何标签)

javascript 复制代码
setTheme(temeConf: any) {
        let eStr: string = '';
        Object.keys(temeConf).forEach(key => {
            let color = temeConf[key];
            // 用于按钮点击颜色
            const dColor = this.getDark(color, 0.2);
            eStr += `--${key}:${color};`;
            eStr += `--${key}--active:${dColor};`;
            for (let num = 1; num <= 4; num++) {
                const val = this.getLight(color, num / 10);
                eStr += `--${key}-${num}:${val};`;
            }
        });
        let styleDom = document.getElementById('#sysCssElemnet');
        if (!styleDom) {
            styleDom = document.createElement("style");
            styleDom.id = "#sysCssElemnet";
            document.head.append(styleDom);
        }
        styleDom.innerHTML = `:root{${eStr}}`;
    }

2、将组元录入到html

javascript 复制代码
let html=document.documentElement;
const themeObj=getTheme(themConf);
Object.keys(themeObj).forEach(key=>html.style.setProperty(key,colorObj[key]));

注:如果采用第二种方式录入,建议可直接在getTheme时直接在for循环中setProperty相关组元属性

相关推荐
冰暮流星14 分钟前
css之线性渐变
前端·css
徐同保19 分钟前
tailwindcss暗色主题切换
开发语言·前端·javascript
mapbar_front23 分钟前
大厂精英为何在中小公司水土不服?
前端
蓝纹绿茶1 小时前
bash:**:pip:***python: 错误的解释器: 没有那个文件或目录
开发语言·python·pip
生莫甲鲁浪戴1 小时前
Android Studio新手开发第二十七天
前端·javascript·android studio
云知谷1 小时前
【经典书籍】C++ Primer 第15章类虚函数与多态 “友元、异常和其他高级特性” 精华讲解
c语言·开发语言·c++·软件工程·团队开发
START_GAME1 小时前
深度学习Diffusers:用 DiffusionPipeline 实现图像生成
开发语言·python·深度学习
不爱编程的小九九2 小时前
小九源码-springboot088-宾馆客房管理系统
java·开发语言·spring boot
Evand J2 小时前
【MATLAB例程】到达角度定位(AOA),平面环境多锚点定位(自适应基站数量),动态轨迹使用EKF滤波优化。附代码下载链接
开发语言·matlab·平面·滤波·aoa·到达角度
细节控菜鸡3 小时前
【2025最新】ArcGIS for JS 实现随着时间变化而变化的热力图
开发语言·javascript·arcgis