【前端】白天/黑夜主题切换: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)
}
相关文章
|
2月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
630 2
|
1月前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
2月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
56 0
|
1月前
|
JavaScript 前端开发 Java
springboot解决js前端跨域问题,javascript跨域问题解决
本文介绍了如何在Spring Boot项目中编写Filter过滤器以处理跨域问题,并通过一个示例展示了使用JavaScript进行跨域请求的方法。首先,在Spring Boot应用中添加一个实现了`Filter`接口的类,设置响应头允许所有来源的跨域请求。接着,通过一个简单的HTML页面和jQuery发送AJAX请求到指定URL,验证跨域请求是否成功。文中还提供了请求成功的响应数据样例及请求效果截图。
springboot解决js前端跨域问题,javascript跨域问题解决
|
2月前
|
JavaScript 前端开发 API
Vue.js:现代前端开发的强大框架
【10月更文挑战第11天】Vue.js:现代前端开发的强大框架
89 41
|
1月前
|
JSON 前端开发 JavaScript
聊聊 Go 语言中的 JSON 序列化与 js 前端交互类型失真问题
在Web开发中,后端与前端的数据交换常使用JSON格式,但JavaScript的数字类型仅能安全处理-2^53到2^53间的整数,超出此范围会导致精度丢失。本文通过Go语言的`encoding/json`包,介绍如何通过将大整数以字符串形式序列化和反序列化,有效解决这一问题,确保前后端数据交换的准确性。
52 4
|
1月前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
135 1
|
1月前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
45 0
|
1月前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
56 1
|
1月前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
45 1