当前位置: 首页 > news >正文

(简单有案例)前端实现主题切换、动态换肤的两种简单方式

目录

背景

(强烈推荐)实现方法1:CSS中原生变量“--”和var()

步骤1:定义css变量

 步骤2:使用CSS变量

步骤3:切换主题

实现完整案例

实现方法2:link 动态引入


背景

我们需要做一个功能,类似动态换肤这种功能。实现方式无非两种,一种是css变量、另一种是link动态引入

(强烈推荐)实现方法1:CSS中原生变量“--”和var()

步骤1:定义css变量

属性名:

  • 属性名必须使用 --开头
  • 在:root中定义(root后面的参数用来区分是哪个主题样式 :root[theme='主题名称']
  • 可以是数字、字母、下划线、中划线

属性值:

  • css普通属性可以用的,比如:数字、文本、带单位的长度、角度等等都可以作为属性值

注意点

  • 大小写敏感:大写 和 小写 不同 的2个属性名,将会是2个属性
  • 计算时有效性:自定义属性值可以是任何内容,甚至可能不是css的有效数值,但这并不影响定义,只要保证在使用css自定义属性的地方,最终的计算结果是有效的就可以了。

案例

 /* 默认主题 */:root {--color: yellow}/* 蓝色主题 */:root[theme='blue'] {--color: blue}/* 红色主题 */:root[theme='red'] {--color: red}

 步骤2:使用CSS变量

  • css提供了一个var()方法,进行自定义属性值的获取。可以在多个地方获取到自定义的属性值。
  • css也提供了calc()方法,进行数值的计算。它里面就可以通过var()使用自定属性的值进行计算。
:root {--size: 100px;
}div1 {width: var(--size);
}div2 {width: calc(var(--size) - 2px);
}

步骤3:切换主题

思路

切换html标签上的theme属性的值,来实现切换对应的主题。

theme属性的值为root后的参数 主题名称(:root[theme="主题名称"]),如果无theme,或者未匹配上对应的就使用,默认的root。

document.documentElement.setAttribute('theme', "要切换的主题名称")

实现完整案例

<!DOCTYPE html>
<html lang="en" theme="blue"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title>
</head>
<style>/* 默认主题 */:root {--color: yellow}/* 蓝色主题 */:root[theme='blue'] {--color: blue}/* 红色主题 */:root[theme='red'] {--color: red}h1 {color: var(--color)}
</style><body><h1>点击我切换主题</h1>
</body>
<script>const data = document.getElementsByTagName('h1')data[0].onclick = () => {document.documentElement.setAttribute('theme', "red")}
</script></html>

实现方法2:link 动态引入

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

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

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

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

相关文章:

  • JSDoc 真能取代 TypeScript?
  • SQL Parser
  • Docker学习历程
  • 2024/2最新升级ChatGPT Plus的方法
  • Mybatis中的sql-xml延迟加载机制
  • RocketMQ(二):领域模型(生产者、消费者)
  • 【C#】.net core 6.0 设置根目录下某个文件夹可访问,访问创建的图片等资源
  • 【每日一题】LeetCode——链表的中间结点
  • CTFshow web(php命令执行 45-49)
  • 《Python 网络爬虫简易速速上手小册》第7章:如何绕过反爬虫技术?(2024 最新版)
  • C语言的循环结构
  • Unity笔记:相机移动
  • VSCode 文件夹增加右键打开
  • Git详细讲解
  • 逆向工程:揭开科技神秘面纱的艺术
  • 【面试系列】之二:关于js原型
  • 2017届校招提前批面试回顾
  • CSS实用技巧干货
  • HTML5新特性总结
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java小白进阶笔记(3)-初级面向对象
  • JWT究竟是什么呢?
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MYSQL 的 IF 函数
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • php的插入排序,通过双层for循环
  • Quartz实现数据同步 | 从0开始构建SpringCloud微服务(3)
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Transformer-XL: Unleashing the Potential of Attention Models
  • Vue.js源码(2):初探List Rendering
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 初识 webpack
  • 简单易用的leetcode开发测试工具(npm)
  • 判断客户端类型,Android,iOS,PC
  • 前端攻城师
  • 容器服务kubernetes弹性伸缩高级用法
  • 设计模式走一遍---观察者模式
  • 深入浏览器事件循环的本质
  • 实战|智能家居行业移动应用性能分析
  • 听说你叫Java(二)–Servlet请求
  • 通过git安装npm私有模块
  • 学习使用ExpressJS 4.0中的新Router
  • ​iOS安全加固方法及实现
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (23)Linux的软硬连接
  • (31)对象的克隆
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (分布式缓存)Redis哨兵
  • (附源码)springboot金融新闻信息服务系统 毕业设计651450
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (十六)Flask之蓝图