【前端】白天/黑夜主题切换:JS读取XML预设主题实现黑白主题切换

简介: 【前端】白天/黑夜主题切换:JS读取XML预设主题实现黑白主题切换

q1.png


上扩展实现多主题选择,切换主题)

先看一下XML文档

id值不能重复,一套主题的name要相同,亮色type1,暗色type0

<?xml version="1.0" encoding="UTF-8" ?>
<themes>
<theme id="0" type="1" name="default">
    <name>默认主题(白)</name>
    <scheme>
<!--        主色-字体颜色-->
        <color-font-main>black</color-font-main>
<!--        主色-背景颜色-->
        <color-background-main>snow</color-background-main>
<!--        变色-字体-鼠标悬浮-->
        <color-font-hover>red</color-font-hover>
<!--        组件-按钮-字体颜色-->
        <color-btn-font>snow</color-btn-font>
<!--        组件-按钮-背景颜色-->
        <color-btn-background>red</color-btn-background>
<!--        修饰-阴影-普通-->
        <color-shadow>rgba(0,0,0,0.1)</color-shadow>
    </scheme>
</theme>
<theme id="1" type="0" name="default">
    <name>默认主题(黑)</name>
    <scheme>
        <!--        主色-字体颜色-->
        <color-font-main>snow</color-font-main>
        <!--        主色-背景颜色-->
        <color-background-main>black</color-background-main>
        <!--        变色-字体-鼠标悬浮-->
        <color-font-hover>red</color-font-hover>
        <!--        组件-按钮-字体颜色-->
        <color-btn-font>black</color-btn-font>
        <!--        组件-按钮-背景颜色-->
        <color-btn-background>red</color-btn-background>
        <!--        修饰-阴影-普通-->
        <color-shadow>rgba(0,0,0,0.1)</color-shadow>
    </scheme>
</theme>
</themes>

再看一下CSS中的:root

:root{
    font-family: 'longmen', ui-monospace;
--font-main-color:black;
--font-hover-color:red;
--font-btn-color:snow;
--background-btn-color:red;
--background-color:snow;
--shadow-color:rgba(0,0,0,0.1);
}

接下来是JS代码:

function Log(message,type="INFO"){
    type = type.toUpperCase()
    if(type==="INFO"){
        console.log("%c "+type + " %c"+message,"color:snow;background:blue;margin:0 5px;padding:5px;box-sizing:border-box;border-radius:5px;font-size:1em;","color:blue;font-size:1.2em;")
    }else if(type==="WARN"){
        console.log("%c "+type + " %c"+message,"color:snow;background:yellow;margin:0 5px;padding:5px;box-sizing:border-box;border-radius:5px;font-size:1em;","color:yellow;font-size:1.2em;")
    }else if(type==="DANGER"){
        console.log("%c "+type + " %c"+message,"color:snow;background:red;margin:0 5px;padding:5px;box-sizing:border-box;border-radius:5px;font-size:1em;","color:red;font-size:1.2em;")
    }else{
        console.log(message)
    }
}
// 非IE浏览器读取XML的参考资料:https://blog.csdn.net/qq_42455262/article/details/105656320
function itemChange(){
    Log("加载XML解析器...")
    let xmlDoc = '';
    if (window.ActiveXObject){ // IE
        const activeXNameList = ["MSXML2.DOMDocument.6.0", "MSXML2.DOMDocument.5.0", "MSXML2.DOMDocument.4.0", "MSXML2.DOMDocument.3.0", "MSXML2.DOMDocument", "Microsoft.XMLDOM", "MSXML.DOMDocument"];
        for(let h=0; h<activeXNameList.length; h++)
        {
            try{
                xmlDoc=new ActiveXObject(activeXNameList[h]);
            }catch(e){
                continue;
            }
            if(xmlDoc) break;
        }
    }else if(document.implementation && document.implementation.createDocument){ //非 IE
        Log("当前浏览器非IE浏览器","warn")
        // xmlDoc=document.implementation.createDocument("","",null);
        xmlDoc = new XMLHttpRequest();
    }else{
        Log("当前浏览器无支持XML的解析器...","danger")
        return false
    }
    //读取主题文件(XML)
    let isIE = false
    Log("加载主题配置文件...")
    try{
        xmlDoc.load("./config/theme/default.xml");
        isIE = true
    }catch (e){
        try {
            //非IE浏览器处理方式
            xmlDoc.open("GET", "config/theme/default.xml", false);
            xmlDoc.send();
            xmlDoc = xmlDoc.responseXML
            isIE=false
        }catch (e){
            console.log(e)
            return false
        }
    }
    let str = isIE?"是":"不是"
    Log("主题配置文件加载完成,当前"+str+"IE浏览器")
    Log(xmlDoc,"text")
    let theme_new;//一种主题,相对应用中模式的另外一种模式(B)
    let theme_img = document.getElementById("img-theme")
    if (theme_img.classList.contains("icon-taiyang-copy")) {
        Log("当前主题为白天主题。开始切换到夜主题")
        //设置图标
        theme_img.classList.remove("icon-taiyang-copy")
        theme_img.className+=" icon-yueliang"//注意要有空格
        theme_new = xmlDoc.getElementById("1")
    } else {
        //设置图标
        theme_img.classList.remove("icon-yueliang")
        theme_img.className+=" icon-taiyang-copy"// 注意要有空格
        theme_new = xmlDoc.getElementById("0")
    }
    //应用新主题
    //<!--        主色-字体颜色-->
    document.documentElement.style.setProperty("--font-main-color",theme_new.getElementsByTagName("color-font-main")[0].innerHTML)
    //<!--        主色-背景颜色-->
    document.documentElement.style.setProperty("--background-color",theme_new.getElementsByTagName("color-background-main")[0].innerHTML)
    //<!--        变色-字体-鼠标悬浮-->
    document.documentElement.style.setProperty("--font-hover-color",theme_new.getElementsByTagName("color-font-hover")[0].innerHTML)
    //<!--        组件-按钮-字体颜色-->
    document.documentElement.style.setProperty("--font-btn-color",theme_new.getElementsByTagName("color-btn-font")[0].innerHTML)
    //<!--        组件-按钮-背景颜色-->
    document.documentElement.style.setProperty("--background-btn-color",theme_new.getElementsByTagName("color-btn-background")[0].innerHTML)
    //<!--        修饰-阴影-普通-->
    document.documentElement.style.setProperty("--shadow-color",theme_new.getElementsByTagName("color-shadow")[0].innerHTML)
}
相关文章
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
685 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
569 1
|
12月前
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
463 8
|
JavaScript 前端开发 容器
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
13060 23
|
JavaScript 前端开发
|
存储 JavaScript 前端开发
|
移动开发 JavaScript 前端开发
|
存储 JavaScript 前端开发
|
JavaScript 前端开发
下一篇
开通oss服务