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

先看一下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) }

【前端】白天/黑夜主题切换:JS读取XML预设主题实现黑白主题切换的更多相关文章

  1. Js读取XML文件为List结构

    习惯了C#的List集合,对于Javascript没有list 极为不舒服,在一个利用Js读取XML文件的Demo中,决定自己构建List对象,将数据存入List. 第一步,Js读取XML文件知识 X ...

  2. JS读取XML文件数据并以table显示数据(兼容IE火狐)

    先看xml文件: <?xml version="1.0" standalone="yes"?> <student> <stuinf ...

  3. IE下JS读取xml文件示例代码

    JS读取xml文件具体步骤为:创建DOM对象.加载xml文件(仅适用于IE)附示例代码,感兴趣的朋友可以参考下,希望对大家有所帮助使用javascript脚本读取xml文件,这里暂只考虑IE浏览器st ...

  4. jQuery、JS读取xml文件里的内容(JS先通过document.implementation.createDocument方法将xml转换成document对象,jQuery将读取到的xml转成table)

    xml文件:test.xml <?xml version="1.0"?> <note> <to>George</to> <fr ...

  5. js 读取xml文件

    读取xml文件 [原创 2007-6-20 17:35:37]     字号:大 中 小 js中读取xml文件,简单的例子: <html><head><script> ...

  6. JS读取xml

    xml文件 <?xml version="1.0" encoding="utf-8"?> <root> <data id=&quo ...

  7. ajax 之js读取xml的多浏览器兼容

    主要是分为两大类:IE.其它浏览器 IE8以下只支持这种 InputVoltage.innerText = xmlDoc.getElementsByTagName(id)[0].text, 其它浏览器 ...

  8. js读取xml文件

    假设我们现在要读取下面的 info.xml 文件 <?xml version="1.0" encoding="gb2312"?> <root& ...

  9. [HTML]js读取XML文件并解析

    xml文件:test.xml <?xml version="1.0"?> <note> <to>George</to> <fr ...

  10. 【JavaScript】JS读取XML文件并进行搜索

    需求效果 点击链接.当前页面载入xml文件并展示相应内容 通过搜索框.搜索xml文件内节点数据.展示包括内容的节点数据 功能实现 Demo终于实现效果 http://loadxmldemo.coder ...

随机推荐

  1. USB-DFP UFP DRP模式

    USB Type-C 接口支持三种模式:DFP(Downstream Facing Port).UFP(Upstream Facing Port)和 DRP(Dual Role Port).虽然这些术 ...

  2. 深度学习 - Torch-TensorRT 推理加速

    深度学习 - Torch-TensorRT 推理加速 Torch-TensorRT 作为 TorchScript 的扩展. 它优化并执行兼容的子图,让 PyTorch 执行剩余的图. PyTorch ...

  3. vue 的常用指令以及作用 ·

    1. v-model 多用于表单元素实现双向数据绑定(同 angular 中的 ng-model) 2. v-for 格式: v-for="字段名 in(of) 数组 json" ...

  4. kotlin更多语言结构——>反射

    类引用 最基本的反射功能是获取 Kotlin 类的运行时引用.要获取对静态已知的 Kotlin 类的引用,可以使用 类字面值 语法 val c = MyClass::class 请注意,Kotlin ...

  5. spring上 -基于注解配置bean,动态代理,AOP笔记

    用的是jdk8,spring框架里jar包的下载可以自己搜到 注解用到的jar包. 60,注解配置Bean快速入门 基本介绍 代码结构: UserDao.java package com.hspedu ...

  6. KubeSphere 社区双周报|2024.09.13-09.26

    KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...

  7. vue中绘制echarts折线图

    1.安装echartscnpm install echarts --save 2.vue代码 <template> <div> //下面的div给表一个容器 <div i ...

  8. PHP、JS、css、python、mysql 基本常用函数特殊方法记录

    html <a draggable="false">禁止拖拽</a> css .nowrap{word-break:keep-all;white-space ...

  9. ESP32+L298N+MQTT+4G无线远程监控+四驱动小破车

    ESP32+L298N+MQTT+4G无线远程监控+四驱动小破车 小车源代码 注意修改WIFI 信息 #include <analogWrite.h> #include <WiFi. ...

  10. spool参数详解

    SQL*PLUS维护系统变量,也称SET变量,利用它可为SQL*PLUS交互建立一个特殊的环境,如:设置NUMBER数据的显示宽度;设置每页的行数;设置列的宽度等.可用SET命令改变这些系统变量,也可 ...