前端实现主题(深色模式)切换的几种方案

方案一:link 动态引入

通过改变link 标签的 href 属性实现动态修改样式(暂不推荐这种方案)

优点:实现了按需加载,提高了性能;

缺点:动态加载样式文件,可能会因为网络问题导致样式加载过慢;

           可维护性较差,后续新增或修改主题较为麻烦。

方案二:提前引入样式,类名切换

在这个方案中,我们只有一个css文件,然后通过js来改变他的类名(也暂不推荐这种方案)

优点:相比方案一,不会因为网络问题导致样式切换延迟;

缺点:样式文件过大时可能会出现首屏加载过慢问题;

           可维护性依旧较差,后续新增或修改主题较为麻烦;

方案三:CSS 滤镜

利用CSS3新增的filter属性(需求简单可以使用)

优点:一行代码实现黑色主题功能,简单易于维护;

缺点:不能满足需求的要求,不能实现对区域的主题颜色自定义;

方案四:CSS变量+类名切换(目前的主流方案)

VUE3官方文档使用的解决方案(比较推荐),这一个方案也是我目前使用的方案

实现思路:首先定义几个我们需要的全局样式变量,之后定义几个集合属性<html lang="en" data-theme="dark">(不同的主题样式),然后将其放在html根元素标签里,再动过js动态的切换这个集合属性就可以实现主题的切换,具体看以下代码;

优点:不会因为网络问题导致样式切换延迟;

           在需要切换主题的地方利用 var0绑定变量即可,不存在优先级问题;

           新增或修改主题方便灵活,仅需新增或修改 CSS 变量即可,在 var()绑定样式变量的地             方就会自动更换;

缺点:首屏加载时会牺牲一些时间加载样式资源;

预览效果

具体实现

<!DOCTYPE html>
<!-- <html lang="en" data-theme="light"> --><html lang="en" data-theme="dark">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>王国梁</title><link rel="shortcut icon" href="./img/w.png" type="image/x-icon"><!-- 引入谷歌字体 --><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><linkhref="https://fonts.googleapis.com/css2?family=Dhurjati&family=Noto+Sans+SC:wght@400;500;600;700;800;900&display=swap"rel="stylesheet"><!-- 自定义样式 --><link rel="stylesheet" href="./index.css"><style>.container {}</style>
</head><body><!-- 标题部分 --><header><a href="#" class="logo"><span>W</span>GL</a><ul class="nav-bar"><li><a href="#">首页</a></li><li><a href="#">教育背景</a></li><li><a href="#">技术栈</a></li><li><a href="#">经历</a></li><li><a href="#">博客</a></li><li><a href="#">联系我</a></li></ul><div><span>更多</span><div></div></div><button onclick="toggle()" class="toggle">切换主题</button><!-- <theme-button value="dark" id="btn" size="3"></theme-button> --></header><!-- 自定义js文件链接 --><script src="./index.js"></script>
</body></html>
*{padding: 0;margin: 0;box-sizing: border-box;font-family: "rubik",sans-serif;list-style: none;text-decoration: none;
}@media screen and (max-width: 768px) {}/* 全局样式变量 */
:root{/* 背景色/边框颜色/主色/辅色/其他色 */--color-border:#deddee;--color-main:#ffae00;--color-auxiliary:#00ff11;--color-other:#00ffdd;--color-bg:#1f1f21;--font-color-main:#ffffff;--font-color-secondary:#ffffffb3;--font-color-auxiliary:#ffffff3b;/* 字号和字体颜色 */--font-root:1rem;--font-32px:2rem;--font-20px:1.25rem;--font-18px:1.125rem;--font-16px:1rem;--font-14px:.875rem;--font-12px:.75rem;--font-10px:.625rem;/* 层级 */--z-index10:10;--z-index100:100;--z-index1000:1000;/* 间距 */--spacing-2:.125rem;--spacing-4:.25rem;--spacing-6:.375rem;--spacing-8:.5rem;--spacing-10:.625rem;--spacing-12:.75rem;--spacing-14:.875rem;--spacing-16:1rem;--spacing-20:1.25rem;--spacing-24:1.5rem;--spacing-30:1.875rem;--spacing-40:2.5rem;--spacing-50:3.125rem;--spacing-60:3.75rem;
}
/* 集合属性(主题样式) */
[data-theme="dark"] {--color-bg:#1f1f21;--color-btn:#ffffff;--color-btn-font:#333333;--color-border:#deddee;--color-main:#ffae00;--color-auxiliary:#00ff11;--color-other:#00ffdd;--font-color-main:#ffffff;--font-color-secondary:#ffffffb3;--font-color-auxiliary:#ffffff3b;
}
[data-theme="light"] {--color-bg:#ffffff;--color-btn:#000000;--color-btn-font:#ffffff;--color-border:#deddee;--color-main:#ffae00;--color-auxiliary:#00ff11;--color-other:#00ffdd;--font-color-main:#333333;--font-color-secondary:#777777;--font-color-auxiliary:#aaaaaa;
}/* 切换按钮 */
.toggle{border: none;padding: var(--spacing-6);font-size: var(--font-14px);background-color: var(--color-btn);color: var(--color-btn-font);border-radius: .25rem;transition: all ease .45s;
}body{background: var(--color-bg);color: var(--font-color-main);overflow-x: hidden;transition: all 0.5s ease-in-out;
}/* 标题部分 */
header{position: fixed;top: 0;right: 0;width: 100%;background: transparent;z-index: var(--z-index10);font-size: var(--font-14px);display: flex;align-items: center;justify-content: space-between;padding: var(--spacing-30) 15%;transition: all ease .45s;
}
.logo{color: var(--font-color-main);font-weight: 600;font-size: var(--font-32px);
}
.logo span{color: var(--color-main);    
}
.nav-bar{display: flex;
}
.nav-bar a{font-size: var(--font-14px);color: var(--font-color-secondary);margin:0 var(--spacing-24);transition: all ease.5s;
}
.nav-bar a:hover{color: var(--color-main);font-weight: 600;
}
// 切换主题
function toggle() {let html = document.querySelector('html')let currentTheme = html.getAttribute('data-theme');if (currentTheme === "light") {html.setAttribute('data-theme', 'dark');} else {html.setAttribute('data-theme', 'light');}
}

方案五:v-bind (Vue3)

在vue3中基于响应式对css变量进行动态改变

优点:不用考虑网络问题;

           在需要切换主题的地方利用 v-bind 绑定变量即可,不存在优先级问题;

           新增或修改主题方便灵活,仅需新增或修改JS 变量即可,在v-bind0绑定样式变量的地方就             会自动更换;

缺点:也是首屏加载时会牺牲一些时间加载样式资源;

           这种方式只要是在组件上绑定了动态样式的地方都会有对应的编译成哈希化的 CSS 变量,             而不像 CSS变量一样统一地在:root 上设置;

还有剩下的一些方案就不一一介绍了,感觉有用就点个赞再走吧

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

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

相关文章

使用Scanner扫描器和if语句来判断QQ等级的活跃程度

一、主要特点 总体使用try包围起来&#xff0c;用到了Scanner扫描器&#xff0c;还用到了若干if语句。 二、运行代码 import java.util.Scanner; public class QQtest {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) {System.out.pr…

吉利护航,宣称比友商“更懂车”,魅族造车的底气与底色

继小米、华为后&#xff0c;又一家手机厂商宣布跨界造车。 在近日举办的2023魅族秋季无界生态发布会上&#xff0c;星纪魅族集团&#xff08;下称“魅族”&#xff09;董事长兼CEO沈子瑜宣布&#xff0c;魅族正式进入汽车市场&#xff0c;将在2024年第一季度启动“DreamCar共创…

【STM32】STM32学习笔记-课程简介(01)

00. 目录 文章目录 00. 目录01. 课程简介02. 硬件设备03. 软件工具04. 硬件套件4.1 面包板和跳线/飞线4.2 杜邦线和STM32最小系统板4.3 STLINK和OLED显示屏4.4 LED和按键4.5 电位器和蜂鸣器4.6 传感器和旋转编码器4.7 USB转串口和MPU60504.8 Flash闪存和电机模块4.9 SG90舵机 0…

win10与 vm虚拟机win7共享文件夹创建

1:在win10&#xff08;主机&#xff09;电脑先随意共享一个文件夹 2&#xff1a;在win10&#xff08;主机&#xff09;上创建一个网络映射 右键此电脑选择映射网络驱动器 成功后会多出这个网络位置 3&#xff1a;win7虚拟机设置 在虚拟机中点击计算机右键添加一个网络位置

C# Onnx CenterNet目标检测

目录 效果 模型信息 项目 代码 下载 效果 模型信息 Inputs ------------------------- name&#xff1a;input.1 tensor&#xff1a;Float[1, 3, 384, 384] --------------------------------------------------------------- Outputs ------------------------- name&a…

安卓开发引入网络图片

<ImageViewandroid:id"id/img01"android:layout_width"match_parent"android:layout_height"200dp"android:layout_weight"1"/>ImageView加载网路图片 第一步&#xff1a;添加网络权限 <uses-permission android:name"…

vue使用实现录音功能js-audio-recorder

前言 最近项目中需要实现一个录音上传功能&#xff0c;用于语音评论可以上录音。 下载插件&#xff1a; npm i js-audio-recorder完整代码 <template><div style"padding: 20px;"><h3>录音上传</h3><div style"font-size:14px"…

“轻松管理视频文件:高效归类与统一重命名“

随着电子设备的普及&#xff0c;我们的视频文件可能来自各种不同的源头&#xff0c;如何高效地管理和查找这些文件成为了一个问题。今天&#xff0c;我们将为您提供一个完美的解决方案——自动归类并统一重命名视频文件。 首先&#xff0c;第一步&#xff0c;我们要进入文件批…

我一人全干!之vue3后台管理中的大屏展示。

使用大屏展示的时候有很多种场景&#xff0c;众多场景都是为了实现大屏自适应。 大屏&#xff0c;顾名思义&#xff0c;就是放在一个固定的屏幕上看的&#xff0c;即使你不做自适应&#xff0c;放在一个固定的屏幕上看也没啥问题&#xff0c;但是很多做大屏的是为了在PC端看&am…

【JAVA】Maven构建java-grpc-protobuf代码生成测试

本次是通过Maven工具构建Java测试工程&#xff0c;需要将原本通过gradle构建的项目需要通过maven构建加入公司代码库&#xff0c;通过Maven构建涉及到接下来要介绍的插件&#xff0c;总是发现pom.xml编译不通过&#xff0c;看到网上都是千篇一律的插件配置&#xff0c;自己就是…

软件产品研发过程 - 二、概要设计

软件产品研发过程 - 概要设计 相关系列文章 软件产品研发管理经验总结-管理细分 软件研发管理经验总结 - 事务管理 软件研发管理经验总结 - 技术管理 软件产品研发过程 - 二、概要设计 目录 软件产品研发过程 - 概要设计一、概要设计概述二、概要设计过程1、模块概述2、应用场景…

68从零开始学Java之Set集合都有哪些特性

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在上一篇文章中&#xff0c;壹哥带大家学习了List集合的用法和特性&#xff0c;尤其是对ArrayList和L…

无人奶柜:零售业的自助革命

无人奶柜&#xff1a;零售业的自助革命 无人奶柜作为零售业的一项创新技术&#xff0c;正在改变人们购买奶制品的方式&#xff0c;并对零售业产生深远的影响。它的出现提供了更便捷、高效、便利的购物体验&#xff0c;节省了人力成本&#xff0c;同时也为零售商带来了创新机会和…

大师学SwiftUI第18章Part3 - 自定义视频播放器

视频 录制和播放视频对用户来说和拍照、显示图片一样重要。和图片一样&#xff0c;Apple框架中内置了播放视频和创建自定义播放器的工具。 视频播放器 SwiftUI定义了​​VideoPlayer​​视图用于播放视频。该视图提供了所有用于播放、停止、前进和后退的控件。视图包含如下初…

Notes数据结合报表工具Tableau

大家好&#xff0c;才是真的好。 我希望你看过前面两篇内容《Domino REST API安装和运行》和《Domino REST API安装和运行》&#xff0c;更希望你能看过《Notes数据直接在Excel中统计&#xff01;》&#xff0c;有了这些内容作为基础&#xff0c;今天的内容就显得特别简单。 …

Freertos任务管理

一.任务状态理论讲解 正在执行的任务状态是running&#xff0c;其他执行的等待执行的任务状态是ready 1.修改间隔时间 2.任务状态 处于各个状态的任务是怎样被管理起来的&#xff1a;链表 3.代码 TaskHandle_t xHandleTask1; TaskHandle_t xHandleTask3;static int task1f…

6个实用又好用的交互原型工具!

在 UI/UX 设计中&#xff0c;原型设计是至关重要的一步。正如用户体验中的其它环节一样&#xff0c;有无数的交互原型工具可以帮助你完成原型设计。市场上有太多的交互原型工具&#xff0c;如果你不知道选择哪一种&#xff0c;那么我们将为你介绍 6 个实用又好用的交互原型工具…

Multidimensional Scaling(MDS多维缩放)算法及其应用

在这篇博客中&#xff0c;我将与大家分享在流形分析领域的一个非常重要的方法&#xff0c;即多维缩放MDS。整体来说&#xff0c;该方法提供了一种将内蕴距离映射到显性欧氏空间的计算&#xff0c;为非刚性形状分析提供了一种解决方案。当初就是因为读了Bronstein的相关工作【1】…

智能优化算法应用:基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鼠群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鼠群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

6页手写笔记总结信号与系统常考知识大题知识点

题型一 判断系统特性题型二 求系统卷积题型三 求三大变换正反变换题型四 求全响应题型五 已知微分方程求系统传递函数题型六 已知系统的传递函数求微分方程题型七 画出系统的零极点图&#xff0c;并判断系统的因果性和稳定性 &#xff08;笔记适合快速复习&#xff0c;可能会有…