前端开发中如何进行多主题配置

在前端开发中实现多主题配置可以让用户根据个人喜好或者场景需求选择不同的界面风格!

下面来为大家一一介绍实现切换主题配置的方法!

1、CSS 变量

使用CSS变量来定义主题相关的颜色、字体、间距等属性,然后在不同主题下修改这些变量的值。这样,只需要修改少数变量,就可以改变整个主题的外观;

html结构

    <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="styles.css"><title>CSS Variable Demo</title></head><body><div class="container"><h1>Dynamic Theme Switching</h1><button id="dark-theme">Dark Theme</button><button id="light-theme">Light Theme</button></div></body><script src="script.js"></script></html>

样式表

:root {--bg-color: white;--text-color: black;
}body {background-color: var(--bg-color);color: var(--text-color);
}.container {padding: 20px;border: 2px solid var(--text-color);
}

JavaScript 代码(script.js)

const darkThemeButton = document.getElementById('dark-theme');
const lightThemeButton = document.getElementById('light-theme');darkThemeButton.addEventListener('click', () => {document.documentElement.style.setProperty('--bg-color', 'black');document.documentElement.style.setProperty('--text-color', 'white');
});lightThemeButton.addEventListener('click', () => {document.documentElement.style.setProperty('--bg-color', 'white');document.documentElement.style.setProperty('--text-color', 'black');
});

在这个示例中,我们使用了CSS变量来定义背景色(–bg-color)和文字颜色(–text-color),并将这些变量用于样式表中的各个地方。在按钮点击事件中,动态地改变了这些变量的值,从而实现了主题的切换。

2、样式表切换

(1)准备不同的样式表: 首先,准备好你想要切换的不同样式表。每个样式表都包含了对应主题的样式规则。

(2)在HTML中引入默认样式表: 在你的HTML文件中,通过标签引入一个默认的样式表,这将是初始加载的主题

<link rel="stylesheet" id="theme-stylesheet" href="default.css">

(3)切换主题的JavaScript代码

// 获取样式表元素
const themeStylesheet = document.getElementById('theme-stylesheet');// 切换主题的函数
function switchTheme(themeName) {// 根据主题名拼接对应的样式表路径const newThemeUrl = themeName + '.css';// 修改样式表的 href 属性themeStylesheet.setAttribute('href', newThemeUrl);
}// 通过事件等方式调用 switchTheme 函数,传入不同的主题名称

(4) 触发切换主题

// 切换主题按钮
const themeSwitchButton = document.getElementById('theme-switch-button');themeSwitchButton.addEventListener('click', () => {// 传入不同的主题名称,如 'dark', 'light', 'colorful' 等switchTheme('dark'); // 切换到暗黑主题
});

3、CSS 预处理器

(1)使用预处理器的功能来定义不同主题的变量,在运行时动态切换主题、切换类名、添加样式或其他JavaScript方法来实现;

这个和切换样式表有点类似;

// 默认主题
$bg-color: white;
$text-color: black;// 暗黑主题
$dark-bg-color: black;
$dark-text-color: white;// 根据变量生成样式
body {background-color: $bg-color;color: $text-color;
}// 暗黑主题样式
.dark-theme {body {background-color: $dark-bg-color;color: $dark-text-color;}
}

按钮点击时给根元素添加对应的类名从而改变样式

document.documentElement.classList.toggle('dark-theme');

可以根据预处理器的特性和功能选择适合项目的方法、比如less和sass中可以使用Mixin来定义不同主题的样式在不同的地方引用它们、选择器嵌套等方法;

4、使用CSS-in-JS库

(1)如使用styled-components库

创建主题文件(themes.js)

// themes.jsexport const lightTheme = {backgroundColor: 'white',textColor: 'black',
};export const darkTheme = {backgroundColor: 'black',textColor: 'white',
};

创建组件(ThemeSwitcher.js)

// ThemeSwitcher.jsimport React, { useState } from 'react';
import styled, { ThemeProvider } from 'styled-components';
import { lightTheme, darkTheme } from './themes';const Container = styled.div`text-align: center;
`;const Button = styled.button`background-color: ${(props) => props.theme.backgroundColor};color: ${(props) => props.theme.textColor};padding: 10px 20px;border: none;cursor: pointer;
`;const ThemeSwitcher = () => {const [currentTheme, setCurrentTheme] = useState(lightTheme);const toggleTheme = () => {setCurrentTheme(currentTheme === lightTheme ? darkTheme : lightTheme);};return (<ThemeProvider theme={currentTheme}><Container><h1>Theme Switcher Demo</h1><Button onClick={toggleTheme}>Toggle Theme</Button></Container></ThemeProvider>);
};export default ThemeSwitcher;

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

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

相关文章

【操作系统】进程和线程对照解释

进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;都是操作系统中用于执行任务的基本单位&#xff0c;但它们有着不同的特点和使用方式。 进程&#xff08;Process&#xff09;&#xff1a; 进程是正在运行的程序的实例。一个程序在运行时会被操作系统…

LLM as Co-pilot:AutoDev 1.0 发布,开源全流程 AI 辅助编程

四月&#xff0c;在那篇《AutoDev&#xff1a;AI 突破研发效能&#xff0c;探索平台工程新机遇》&#xff0c;我们初步拟定了 AI 对于研发的影响。我们有了几个基本的假设&#xff1a; 中大型企业将至少拥有一个私有化的大语言模型。只有构建端到端工具才能借助 AI 实现增质提效…

STM32入门——定时器

内容为江科大STM32标准库学习记录 TIM简介 TIM&#xff08;Timer&#xff09;定时器定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时&…

React、Vue和Angular的优缺点

React React 是一个用于构建用户界面的 JAVASCRIPT 库。React 主要用于构建 UI&#xff0c;很多人认为 React 是 MVC 中的 V&#xff08;视图&#xff09;。React 起源于 Facebook 的内部项目&#xff0c;用来架设 Instagram 的网站&#xff0c;并于 2013 年 5 月开源。React …

Unity3D GPU Selector/Picker

Unity3D GPU Selector/Picker 一、概述 1.动机 Unity3D中通常情况下使用物理系统进行物体点击选择的基础&#xff0c;对于含大量对象的场景&#xff0c;添加Collider组件会增加内容占用&#xff0c;因此使用基于GPU的点击选择方案 2.实现思路 对于场景的每个物体&#xff0c;…

批量导出pdf为zip文件(可以修改zip中pdf名称)

核心代码 public static void compressZip1(HashMap<String,File> map, String rootPath, String zipFileName) throws FileNotFoundException {FileOutputStream fileOutputStream new FileOutputStream(zipFileName);ZipOutputStream zipOutputStream new ZipOutputS…

Java超级玛丽小游戏制作过程讲解 第四天 创建并完成常量类03

今天继续来完成常量类。 package com.sxt;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List;public class StaticValue {//背景public static Buff…

【Docker】性能测试监控平台搭建:InfluxDB+Grafana+Jmeter+cAdvisor

前言 在做性能测试时&#xff0c;如果有一个性能测试结果实时展示的页面&#xff0c;可以极大的提高我们对系统性能表现的掌握程度&#xff0c;进而提高我们的测试效率。但是我们每次打开Jmeter都会有几个硕大的字提示别用GUI模式进行负载测试&#xff0c;而且它自带的监视器效…

系统架构设计师-软件架构设计(7)

目录 大型网站系统架构演化 一、第一阶段&#xff1a;单体架构 到 第二阶段&#xff1a;垂直架构 二、第三阶段&#xff1a;使用缓存改善网站性能 1、缓存与数据库的数据一致性问题 2、缓存技术对比【MemCache与Redis】 3、Redis分布式存储方案 4、Redis集群切片的常见方式 …

FFmpeg中相关结构体介绍

AVFormatContext&#xff1a;此结构体存储音视频封装格式中包含的信息&#xff0c;并且这个结构体是贯穿整个播放流程的。在这个结构体中主要包含AVInputFormat&#xff0c;AVOutputFormat、AVStream等。 struct AVInputFormat *iformat; // 输入数据的封装格式 AVIOContext *…

PostGIS v3.4.0Orc1版本特性

PostGIS 3.4.0rc1 2023/08/05自 3.4.0beta2 发布以来的变化- &#xff03;5442&#xff0c;[postgis_tiger_geocoder&#xff0c;postgis_topology]数据库search_path不做它打算做什么&#xff08;Jelte Fennema&#xff09;PostGIS 3.4.0beta2 2023/07/29自 3.4.0beta1 发布以…

解决log4j.xml的url没有注册问题

在对log4j.xml配置文件配置时出现http//jakarta.apache.org/log4j/爆红&#xff0c;IDEA提示uri is not registered。源代码如下 <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j"http://jakarta.apache.org/lo…

c++ boost circular_buffer

boost库中的 circular_buffer顾名思义是一个循环缓冲器&#xff0c;其 capcity是固定的当容量满了以后&#xff0c;插入一个元素时&#xff0c;会在容器的开头或结尾处删除一个元素。 circular_buffer为了效率考虑&#xff0c;使用了连续内存块保存元素 使用固定内存&#x…

Spring DBCP配置

Spring DBCP配置 BasicDataSource对应的依赖&#xff1a; <dependency><groupId>org.apache.commons</groupId><artifactId>commons-dbcp2</artifactId><version>2.5.0</version></dependency><dependency><groupId…

为什么要选择文件传输软件?有哪些最佳高速文件传输软件?

是否经历过这样的场景&#xff0c;正在努力地完成工作任务&#xff0c;但是由于制作的数据无法及时传送给合作伙伴&#xff0c;工作流程被打断了&#xff1f;这听起来很令人沮丧&#xff0c;对吧&#xff1f;可是&#xff0c;这种情况在现实中并不罕见。 因此&#xff0c;需要…

OpenCv.js(图像处理)学习历程

opencv.js官网 4.5.0文档 以下内容整理于opencv.js官网。 简介 OpenCV由Gary Bradski于1999年在英特尔创建。第一次发行是在2000年。OpenCV支持c、Python、Java等多种编程语言&#xff0c;支持Windows、Linux、Os X、Android、iOS等平台。基于CUDA和OpenCL的高速GPU操作接口也…

java泛型和通配符的使用

泛型机制 本质是参数化类型(与方法的形式参数比较&#xff0c;方法是参数化对象)。 优势:将类型检查由运行期提前到编译期。减少了很多错误。 泛型是jdk5.0的新特性。 集合中使用泛型 总结&#xff1a; ① 集合接口或集合类在jdk5.0时都修改为带泛型的结构② 在实例化集合类时…

Unity数字可视化学校_昼夜(三)

1、删除不需要的 UI using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class EnvControl : MonoBehaviour {//UIprivate Button btnTime;private Text txtTime; //材质public List<Material> matListnew Li…

docker中的jenkins去配置sonarQube

docker中的jenkins去配置sonarQube 1、拉取sonarQube macdeMacBook-Pro:~ mac$ docker pull sonarqube:8.9.6-community 8.9.6-community: Pulling from library/sonarqube 8572bc8fb8a3: Pull complete 702f1610d53e: Pull complete 8c951e69c28d: Pull complete f95e4f8…

C++解决TCP粘包

目录 TCP粘包问题TCP客户端TCP服务端源码测试 TCP粘包问题 TCP是面向连接的&#xff0c;面向流的可靠性传输。TCP会将多个间隔较小且数据量小的数据&#xff0c;合并成一个大的数据块&#xff0c;然后进行封包发送&#xff0c;这样一个数据包里就可能含有多个消息的数据&#…