【前端】白天/黑夜主题切换: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)
}
相关文章
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
861 1
|
JSON 自然语言处理 前端开发
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
858 72
【01】对APP进行语言包功能开发-APP自动识别地区ip后分配对应的语言功能复杂吗?-成熟app项目语言包功能定制开发-前端以uniapp-基于vue.js后端以laravel基于php为例项目实战-优雅草卓伊凡
|
资源调度 JavaScript 前端开发
前端开发必备!Node.js 18.x LTS保姆级安装教程(附国内镜像源配置)
本文详细介绍了Node.js的安装与配置流程,涵盖环境准备、版本选择(推荐LTS版v18.x)、安装步骤(路径设置、组件选择)、环境验证(命令测试、镜像加速)及常见问题解决方法。同时推荐开发工具链,如VS Code、Yarn等,并提供常用全局包安装指南,帮助开发者快速搭建高效稳定的JavaScript开发环境。内容基于官方正版软件,确保合规性与安全性。
16725 23
|
前端开发 JavaScript 数据可视化
58K star!这个让网页动起来的JS库,前端工程师直呼真香!
Anime.js 是一款轻量级但功能强大的JavaScript动画引擎,它能够以最简单的方式为网页元素添加令人惊艳的动效。这个项目在GitHub上已经获得58,000+星标,被广泛应用于电商页面、数据可视化、游戏开发等场景。
902 8
|
JavaScript 前端开发 容器
|
JavaScript 前端开发
|
存储 JavaScript 前端开发
|
移动开发 JavaScript 前端开发
|
存储 JavaScript 前端开发
|
JavaScript 前端开发

热门文章

最新文章

  • 1
    前端如何存储数据:Cookie、LocalStorage 与 SessionStorage 全面解析
    1446
  • 2
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(九):强势分析Animation动画各类参数;从播放时间、播放方式、播放次数、播放方向、播放状态等多个方面,完全了解CSS3 Animation
    717
  • 3
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(八):学习transition过渡属性;本文学习property模拟、duration过渡时间指定、delay时间延迟 等多个参数
    577
  • 4
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(七):学习ransform属性;本文学习 rotate旋转、scale缩放、skew扭曲、tanslate移动、matrix矩阵 多个参数
    582
  • 5
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
    669
  • 6
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
    850
  • 7
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
    1672
  • 8
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
    400
  • 9
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
    1383
  • 10
    【CSS】前端三大件之一,如何学好?从基本用法开始吧!(一):CSS发展史;CSS样式表的引入;CSS选择器使用,附带案例介绍
    688