JS媒体查询之matchMedia API 实现跟随系统主题色切换效果

📊写在前面

在网页设计中,跟随系统主题切换可以通过CSS和JavaScript实现。可以通过定义两套CSS变量,根据系统主题的颜色来切换变量的生效,从而实现不同主题下的页面样式变化。
例如,可以使用媒体查询API来获取系统主题的颜色,并根据匹配结果来适配页面的自定义属性。同时,可以注册媒体查询的change事件,当系统主题变化时重新调用函数,实现跟随系统的效果。

🖼️API简介

Window 的 matchMedia() 方法返回一个新的 MediaQueryList 对象,表示指定的媒体查询字符串解析后的结果。返回的 MediaQueryList 可被用于判定 Document 是否匹配媒体查询,或者监控一个 document 来判定它匹配了或者停止匹配了此媒体查询。

🚀实际效果

在这里插入图片描述

📚实例代码(HTML版)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>JS媒体查询之matchMedia API 实现跟随系统主题色切换效果</title><style>:root {--text-color: #333;--bg-color: #fff;}html[data-theme="dark"] {--text-color: #fff;--bg-color: #333;}html[data-theme="ligth"] {--text-color: #333;--bg-color: #fff;}html[data-theme="red"] {--text-color: #fff;--bg-color: #ff0064;}html[data-theme="green"] {--text-color: #fff;--bg-color: #67c23a;}html[data-theme="blue"] {--text-color: #fff;--bg-color: #0091db;}body {background-color: var(--bg-color);color: var(--text-color);}h1 {color: var(--text-color);text-align: center;}select {display: block;margin: 20px auto;font-size: 32px;}</style>
</head><body><h1>JS媒体查询之matchMedia API 实现跟随系统主题色切换效果</h1><hr><select name="theme" id="theme"><option value="ligth">亮色</option><option value="dark">暗色</option><option value="os">系统跟随</option><option value="red">红色</option><option value="green">绿色</option><option value="blue">蓝色</option></select><script>const theme = document.getElementById('theme');// 获取系统主题const metch = window.matchMedia('(prefers-color-scheme: dark)');// 设置主题const setTheme = (theme = '') => {document.documentElement.setAttribute('data-theme', theme ? theme : metch.matches ? 'dark' : 'ligth');};// 监听主题切换theme.addEventListener('change', (e) => {if ('os' === e.target.value) {setTheme();// 监听系统主题切换metch.addEventListener('change', setTheme);} else {setTheme(e.target.value);metch.removeEventListener('change', setTheme);}});</script>
</body></html>

📚实例代码(Vue3.js + TS版)

hook.ts

import { ref, watchEffect } from 'vue';// 定义主题类型
type Theme = 'light' | 'dark' | 'os';// 存储主题的key
const STORE_KEY = '__hteme__';// 获取存储主题
const theme = ref<Theme>(localStorage.getItem(STORE_KEY) as Theme || 'light');// 获取系统主题
const media = globalThis.matchMedia('(prefers-color-scheme: dark)');// 监听系统主题变化
const listener = () => {document.documentElement.dataset.theme = media.matches ? 'dark' : 'light';
}// 监听theme变量值变化
watchEffect(() => {// 更新存储localStorage.setItem(STORE_KEY, theme.value);if (theme.value === 'os') {// 设置系统主题listener();// 监听系统主题变化media.addEventListener('change', listener);} else {// 移除监听media.removeEventListener('change', listener);document.documentElement.dataset.theme = theme.value;}
});export function useTheme() {return {theme}
};

demo.vue

<script setup lang="ts">import { useTheme } from '@/hooks/useTheme';const { theme } = useTheme()
</script><template><h1>JS媒体查询之matchMedia API 实现跟随系统主题色切换效果</h1><hr><select v-model="theme"><option value="ligth">亮色</option><option value="dark">暗色</option><option value="os">系统跟随</option><option value="red">红色</option><option value="green">绿色</option><option value="blue">蓝色</option></select>
</template><style>:root {--text-color: #333;--bg-color: #fff;}html[data-theme="dark"] {--text-color: #fff;--bg-color: #333;}html[data-theme="ligth"] {--text-color: #333;--bg-color: #fff;}html[data-theme="red"] {--text-color: #fff;--bg-color: #ff0064;}html[data-theme="green"] {--text-color: #fff;--bg-color: #67c23a;}html[data-theme="blue"] {--text-color: #fff;--bg-color: #0091db;}body {background-color: var(--bg-color);color: var(--text-color);}h1 {color: var(--text-color);text-align: center;}select {display: block;margin: 20px auto;font-size: 32px;}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PageRank Web页面分级算法 HNUST【数据分析技术】(2025)

1.理论知识 算法原理PageRank 通过网络浩瀚的超链接关系来确定一个页面的等级。 Google 把从 A 页面到 B 页面的链接解释为A页面给B页面投票&#xff0c; Google 根据投票来源&#xff08;甚至来源的来源&#xff0c; 即链接到A页面的页面&#xff09;和投票目标的等级来决定新…

OTA场景使用mbed TLS 进行 MD5 校验

应用场景&#xff1a; OTA或者IAP等升级场景&#xff0c;或者数据传输过程中的文件校验. 在使用 mbed TLS 进行 MD5 校验时&#xff0c;首先需要理解 MD5 是一种哈希算法&#xff0c;用于生成一个 128 位&#xff08;16 字节&#xff09;的哈希值&#xff0c;通常用于校验数据…

6-Gin 路由详解 --[Gin 框架入门精讲与实战案例]

Gin 是一个用 Go 语言编写的 HTTP Web 框架&#xff0c;以其高性能和简洁的 API 而闻名。它提供了一套强大的路由功能&#xff0c;使得开发者可以轻松地定义 URL 路由规则&#xff0c;并将这些规则映射到具体的处理函数&#xff08;handler&#xff09;。以下是关于 Gin 路由的…

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子&#xff0c;没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子&#xff0c;我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…

[江科大STM32] 第五集STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 再添加一些文件&#xff0c;自己看路径 然后去 复习这三文件 打开KEIL add existing那个&#xff0c;添加已经存在的文件 还有5个.c.h文件也要添加进来 回到KEIL 点击旁边的settings 如果你用寄存器开发就建到这里就可…

目标检测,语义分割标注工具--labelimg labelme

1 labelimg labelimg可以用来标注目标检测的数据集&#xff0c; 提供多种格式的输出&#xff0c; 如Pascal Voc, YOLO等。 1.1 安装 pip install labelimg1.2 使用 命令行直接输入labelimg即可打开软件主界面进行操作。 使用非常简单&#xff0c; 不做过细的介绍&#xff0…

沪深300股指期货一点多少钱?

首先&#xff0c;我们得知道什么是沪深300股指期货。简单来说&#xff0c;它就是一种期货合约&#xff0c;这个合约的“价格”是根据沪深300指数的点数来定的。沪深300指数是由上海和深圳两个交易所里300只最大的股票组成的一个指数&#xff0c;代表了整个股市的大体走势。 沪…

kettle经验篇:Pentaho Repository 类型资源库卡顿问题

2024年马上就结束了&#xff0c;终于在结束前解决了困扰许久的一个问题&#xff1a;kettle的Pentaho Repository 资源库异常卡顿。所以在此也梳理、记录下2024年的最后一个大问题。 项目场景 工作中一个重要内容是数据中心项目&#xff0c;也就必不可少的要用到ETL技术&#x…

工具变量笔记

补充知识 简单介绍工具变量 假设 Y i α β D i ϵ i Y_i\alpha\beta D_i\epsilon_i Yi​αβDi​ϵi​, where E ( ϵ i ∣ D i ) 0 E(\epsilon_i\mid D_i)0 E(ϵi​∣Di​)0. 但是通常这个条件不满足。于是假如有这样一个工具变量 Z i Z_i Zi​存在的话&#xff0c;满…

简易CPU设计入门:本系统中的通用寄存器(五)

项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了&#xff0c;那就不用重复下载了。如果还没有下载&#xff0c;那么&#xff0c;请大家点击下方链接&#xff0c;来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&#xff0c;我…

04.HTTPS的实现原理-HTTPS的混合加密流程

04.HTTPS的实现原理-HTTPS的混合加密流程 简介1. 非对称加密与对称加密2. 非对称加密的工作流程3. 对称加密的工作流程4. HTTPS的加密流程总结 简介 主要讲述了HTTPS的加密流程&#xff0c;包括非对称加密和对称加密两个阶段。首先&#xff0c;客户端向服务器发送请求&#xf…

【WebAR-图像跟踪】在Unity中基于Imagine WebAR实现AR图像识别

写在前面的话 感慨一下&#xff0c; WebXR的发展是真的快&#xff0c;20年的时候&#xff0c;大多都在用AR.js做WebAR。随着WebXR标准发展&#xff0c;现在诸如Threejs、AFrame、Unity等多个平台都支持里WebXR。 本文将介绍在Unity中使用 Image Tracker实现Web端的AR图像识别功…

视频会议是如何实现屏幕标注功能的?

现在主流的视频会议软件都有屏幕标注功能&#xff0c;屏幕标注功能给屏幕分享者讲解分享内容时提供了极大的方便。那我们以傲瑞视频会议&#xff08;OrayMeeting&#xff09;为例&#xff0c;来讲解屏幕标注是如何实现的。 傲瑞会议的PC端&#xff08;Windows、信创Linux、银河…

物料描述的特殊字符

MM03查看某料号&#xff0c;有特殊字符&#xff0c;看上去是# SE16N中并没有显示出来这个特殊字符 DeBug时可以看到#&#xff0c;复制出来也是#&#xff0c;但其实不是 ALV中也看不到这个特殊字符 需要写代码&#xff0c;获取这个编码Unicode 参考&#xff1a;【ABAP系列】SAP…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时&#xff0c;默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点&#xff0c;但在某些设备或软件上可能存在兼容性问题。因此&#xff0c;将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

多模态论文笔记——LLaVA

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍多模态模型&#xff1a;LLaVA。处理包含图像和文本的多模态数据&#xff0c;并生成合理准确的回答。 文章目录 论文模型架构视觉编码器语言模型多模态融…

【源码 导入教程 文档 讲解】基于springboot校园新闻管理系统源码和论文

可做计算机毕业设计JAVA、PHP、爬虫、APP、小程序、C#、C、python、数据可视化、大数据、文案 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xf…

时序论文34|AdaWaveNet:用于时间序列分析的自适应小波网络

论文标题&#xff1a;AdaWaveNet: Adaptive Wavelet Network for Time Series Analysis 论文链接&#xff1a;https://arxiv.org/abs/2405.11124 论文代码&#xff1a;https://github.com/comp-well-org/AdaWaveNet/ 前言 这篇文章面向非平稳时间序列进行分析与建模&#x…

运行Springboot + Vue 项目

想要源码&#xff0c;请点击的系统获取源码&#xff1a;https://bichuanyuan.online **前言&#xff1a;**很多小白拿到java SpringBoot Vue前后端分离的项目却不知道怎么运行起来&#xff0c;这里博主就带领小白们一起将项目运行起来吧&#xff01; 一、环境准备 java后端…

16、【ubuntu】【gitlab】【补充】服务器断电后,重启服务器,gitlab无法访问

背景 接wiki 【服务器断电后&#xff0c;重启服务器&#xff0c;gitlab无法访问】https://blog.csdn.net/nobigdeal00/article/details/144280761 最近把不小心把服务器重启&#xff0c;每次重启后&#xff0c;都会出现gitlab无法访问 分析 查看系统正在运行的任务 adminpc…