Electron案例解析——切换主题颜色的案例

效果图

切换主题颜色

核心

Electron的 nativeTheme.themeSource属性,值是string。有三个参数:system, light 和 dark,用来覆盖、重写Chromium内部的相应的值

Election的api描述
nativeTheme.themeSource被用来覆盖、重写Chromium内部的相应的值system, light 和 dark

文档

相关文档地址:https://www.electronjs.org/zh/docs/latest/api/native-theme#nativethemethemesource

目录结构

目录结构

index.html

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8" /><!-- 内容安全策略--><metahttp-equiv="Content-Security-Policy"content="default-src 'self'; script-src 'self'"/><metahttp-equiv="X-Content-Security-Policy"content="default-src 'self'; script-src 'self'"/><!-- 样式表 --><link rel="stylesheet" type="text/css" href="./styles.css"><!--窗口标题--><title>切换应用主题颜色的案例</title>
</head>
<body><h1>切换应用主题颜色</h1><p>当前主题颜色: <strong id="theme-source">system</strong></p><button id="toggle-dark-mode">切换颜色模式</button>
<button id="reset-to-system">重置为系统色</button>
</body>
<!-- 加载渲染进程的 renderer.js 文件 -->
<script src="./renderer.js"></script>
</html>

main.js

//引入electron模块 app, BrowserWindow
const {app, BrowserWindow,ipcMain, nativeTheme} = require('electron/main') //引入electron模块, app
const path = require('node:path') //引入path模块
//创建窗口
const createWindow = () => {const win = new BrowserWindow({//设置窗口大小 宽度800 高度600width: 800,height: 600,webPreferences: {  //网页设置preload: path.join(__dirname, 'preload.js') //设置预加载脚本}})
//加载index.htmlwin.loadFile('index.html')
}
/*** 处理切换暗模式的请求* 根据当前主题颜色切换到相反的主题* 返回当前是否使用暗色主题*/
ipcMain.handle('dark-mode:toggle', () => {if (nativeTheme.shouldUseDarkColors) {  //当前使用暗色主题nativeTheme.themeSource = 'light'     //切换到浅色主题} else {nativeTheme.themeSource = 'dark'     //切换到暗色主题}return nativeTheme.shouldUseDarkColors  //返回当前是否使用暗色主题
})//处理切换到系统主题
ipcMain.handle('dark-mode:system', () => {nativeTheme.themeSource = 'system'  //切换到系统主题
})//当Electron完成初始化并且准备创建窗口时调用createWindow()
app.whenReady().then(() => {//在应用准备就绪时调用函数createWindow()//如果没有窗口打开则打开一个窗口 (macOS) 这个是必须处理的兼容性问题app.on('activate', () => {if (BrowserWindow.getAllWindows().length === 0) {createWindow()}})
})/*** 关闭所有窗口时退出应用 (Windows & Linux) 这个是必须处理的兼容性问题。* 这段代码是用于Electron框架中的事件监听,具体是监听window-all-closed事件。这个事件会在所有窗口都被关闭时触发。* 代码中的逻辑是,如果当前操作系统平台不是macOS('darwin'),则在所有窗口关闭后退出应用程序。* */
app.on('window-all-closed', () => {if (process.platform !== 'darwin') app.quit()
})

preload.js

/*** 预加载脚本在加载“index.html”之前运行在渲染器中。* 它可以访问Web API以及Electronic的渲染器处理模块和一些多边填充Node.Js功能。* https://www.electronjs.org/docs/latest/tutorial/sandbox*/
// 引入electron模块,
const { contextBridge, ipcRenderer } = require('electron/renderer')
//contextBridge用于暴露接口到主进程
contextBridge.exposeInMainWorld('darkMode', {toggle: () => ipcRenderer.invoke('dark-mode:toggle'),  // 切换暗黑模式system: () => ipcRenderer.invoke('dark-mode:system')  // 切换系统默认模式
})

renderer.js

/*** 当点击切换按钮“toggle-dark-mode”时,切换系统主题并更新主题状态*/
document.getElementById('toggle-dark-mode').addEventListener('click', async () => {const isDarkMode = await window.darkMode.toggle()  // 切换系统主题document.getElementById('theme-source').innerHTML = isDarkMode ? 'Dark' : 'Light' // 同时,更新主题状态
})
/*** 当点击切换按钮“reset-to-system”时,恢复系统默认主题并更新主题状态*/
document.getElementById('reset-to-system').addEventListener('click', async () => {await window.darkMode.system()  // 设置为系统默认主题document.getElementById('theme-source').innerHTML = 'System' // 同时,更新主题状态
})

style.css

:root {color-scheme: light dark;
}/*这里是替换的样式代码 start*/
@media (prefers-color-scheme: dark) {body { background: #333; color: white; }
}@media (prefers-color-scheme: light) {body { background: #ddd; color: black; }
}
/*这里是替换的样式代码 end*/

看效果,命令行,运行

npm start

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1486340.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

谷粒商城实战笔记-45-商品服务-API-三级分类-查询-递归树形结构数据获取

文章目录 一&#xff0c;准备工作1&#xff0c;启动虚拟机2&#xff0c;启动mysql3&#xff0c;执行MySQL脚本插入分类数据4&#xff0c;关于三级分类 二&#xff0c;Controller层新增接口三&#xff0c;Service层新增接口1&#xff0c;代码实现2&#xff0c;测试 从这一节开始…

实验二 FPGA使用Verilog HDL设计分频器

实验目的 掌握使用Vivado软件进行设计、综合、仿真、布线的方法。掌握FPGA程序的下载方法。掌握使用Verilog HDL设计分频器的方法。 实验要求 采用Verilog HDL语言设计分频器&#xff0c;实现以下功能&#xff1a; 输出时钟周期为1s的分频时钟信号&#xff1b;通过LED灯或数码…

15个在线地图瓦片URL分享

数据是GIS的血液&#xff0c;我们在《10个在线地图瓦片URL分享》一文中为你分享了10个地图瓦片URL链接&#xff0c;现在再为你分享5个在线的瓦片地图URL图源&#xff01; 该在线地图瓦片URL支持在GIS软件或开发平台进行调用&#xff0c;比如ArcGIS、QGIS、Global Mapper、Open…

PowerBI宝藏级资料分享推荐

有同学留言想学习PowerBI&#xff0c;求推荐可以免费学习的网站&#xff0c;最好是比较系统的&#xff0c;不要那种广告或诱导付费才能学习的网站。 这样的学习网站确实有&#xff0c;主打大家要求的免费。 推荐大家几个我一直私藏的宝藏级&#xff0c;学习和使用资料网站. …

《经典图论算法》贝尔曼-福特算法(Bellman-Ford)

摘要&#xff1a; 1&#xff0c;Bellman-Ford 算法的介绍 2&#xff0c;Bellman-Ford 算法为什么可以解决有负权边的图 3&#xff0c;Bellman-Ford 算法为什么不能解决有负权回路的图 4&#xff0c;Bellman-Ford 算法的代码实现和负权回路的判断 5&#xff0c;Bellman-Ford 算法…

测试——Selenium

内容大纲: 什么是自动化测试 什么是Selenium Selenium工作原理 Selenium环境搭建 Selenium API 目录 1. 什么是自动化测试 2. 什么是Selenium 3. Selenium工作原理 4. Selenium环境搭建(java) 5. Selenium API 5.1 定位元素 5.1.1 CSS选择器定位元素 5.1.2 XPath定位元…

# Redis 入门到精通(十一)-- 集群

Redis 入门到精通&#xff08;十一&#xff09;-- 集群 一、redis 集群 – 集群简介 1、现状问题&#xff1a;业务发展过程中遇到的峰值瓶颈 redis提供的服务OPS可以达到10万/秒&#xff0c;当前业务OPS已经达到10万/秒。内存单机容量达到256G&#xff0c;当前业务需求内存容…

【机器学习】模型验证曲线(Validation Curves)解析

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 模型验证曲线(Validation Curves)解析什么是模型验证曲线?模型验证曲线的解读模…

微信答题小程序产品研发-确定产品的定位

盛夏蝉鸣起&#xff0c;荷风香十里。我前面说过&#xff0c;我决意仿一款答题小程序&#xff0c;所以我做了大量的调研。 答题小程序软件产品开发不仅仅是写代码这一环&#xff0c;它包含从需求调研、分析与构思、设计到开发、测试再到部署上线一系列复杂过程。 在软件开发中…

增材制造与智能制造关系

在撰写的增材制造技术与装备书籍中有着明确的描述&#xff0c;增材制造是智能制造的典型范例&#xff0c;是智能制造“类”的实例化过程。这种借助于计算机编程面向对象思想的解释可以更全面的理解增材制造和智能制造的关系。增材制造实例具备了智能制造类的属性&#xff0c;智…

数据库中字符串连接符的使用

在数据库操作中&#xff0c;字符串处理是日常工作中不可或缺的一部分。无论是构建动态查询&#xff0c;还是处理数据输出&#xff0c;字符串连接符的使用都是至关重要的。那么&#xff0c;如何正确地使用字符串连接符&#xff0c;才能高效地进行字符串操作呢&#xff1f; 在数据…

网站安全-CDN篇

为了保证 CDN 不被恶意刷流量导致高额账单&#xff0c;可以对 CDN 做防护措施&#xff0c;或使用高防 CDN。 ‍ ‍ ‍ 普通 CDN 普通 CDN 受到恶意攻击&#xff0c;也是会计费的。目前国内大部分 CDN 厂商都是这样的套路&#xff1a;即使你的 CDN 流量用完了&#xff0c;还…

Pyside6绘制折线图并计算面积

Pyside6绘制折线图并计算面积 import sys import random from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QMainWindow from PySide6.QtCore import Qt, QRectF, QPointF, Signal from PySide6.QtGui import QPainter, QPen, QColor, QMouseEventclass P…

微服务分布式事务

1、分布式事务是什么&#xff1f; 微服务架构中的分布式事务是指在多个服务实例之间保持数据一致性的机制。由于微服务通常涉及将业务逻辑拆分成独立的服务&#xff0c;每个服务可能有自己的数据库&#xff0c;因此当一个业务操作需要跨多个服务进行时&#xff0c;确保所有服务…

【知识】PyTorch种两种CUDA时间测量的方法对比

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 在PyTorch中使用CUDA进行时间测量时&#xff0c;以下两者各有优缺点&#xff1a; torch.cuda.current_stream(self._device).synchronize() torch.cud…

泰迪智能科技携广州华商学院共讨产教融合,校企合作

7月19日&#xff0c;广州华商学院人工智能学院的领导及骨干教师一行莅临泰迪智能科技参观交流&#xff0c;广州华商学院人工智能学院院长助理杨本胜、院长助理洪绍勇、大数据系主任颜远海、金融数学系主任石金诚、人工智能系主任霍永良&#xff0c;以及骨干教师许丽娟、李志青、…

恐怖数字暗影:猜中才能逃离

大家可以看看这个&#xff0c;也很有意思&#xff01; 猜数字游戏&#xff08;老六版&#xff09;-CSDN博客 1、 剧情介绍 在一个阴暗潮湿的古堡中&#xff0c;你独自一人走进了一间散发着诡异气息的房间。房间的正中央有一张古老的桌子&#xff0c;上面放着一本泛黄的羊皮卷…

2024-07-22 Unity AI行为树1 —— 框架介绍

文章目录 1 行为树2 行为树驱动方式3 行为树结点分类3.1 控制节点3.2 执行节点 4 行为树与状态机比较 本文章参考 B 站唐老狮 2023年直播内容。 点击前往唐老狮 B 站主页。 1 行为树 ​ 行为树&#xff08;Behavior Tree&#xff0c;BT&#xff09;在游戏 AI 中是一种用于控制…

【git】git 提交修改报错 ERROR: do not set execute permissions for source files

目录 问题报错信息解决方法 问题 修改文件后&#xff0c;使用git 提交修改到gerrit时报错&#xff1a;ERROR: do not set execute permissions for source files 文件修改前 $ll deinterlace_mtn.c -rw-r--r-- 1 xxx users 31599 Jul 22 08:10 deinterlace_mtn.c文件修改后…

前端JS特效第49波:简洁时尚的jQuery和CSS3侧边栏菜单插件

简洁时尚的jQuery和CSS3侧边栏菜单插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" c…