当前位置: 首页 > 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详细讲解
  • 逆向工程:揭开科技神秘面纱的艺术
  • 时间复杂度分析经典问题——最大子序列和
  • $translatePartialLoader加载失败及解决方式
  • Electron入门介绍
  • JavaScript函数式编程(一)
  • JS基础之数据类型、对象、原型、原型链、继承
  • js数组之filter
  • Python 反序列化安全问题(二)
  • Redash本地开发环境搭建
  • uni-app项目数字滚动
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 入门到放弃node系列之Hello Word篇
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 小程序开发中的那些坑
  • 硬币翻转问题,区间操作
  • ionic入门之数据绑定显示-1
  • scrapy中间件源码分析及常用中间件大全
  • 说说我为什么看好Spring Cloud Alibaba
  • ​你们这样子,耽误我的工作进度怎么办?
  • #大学#套接字
  • (附源码)计算机毕业设计高校学生选课系统
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (四)模仿学习-完成后台管理页面查询
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)LINQ之路
  • .mysql secret在哪_MYSQL基本操作(上)
  • .NET Core 中插件式开发实现
  • .net 按比例显示图片的缩略图
  • .NET 的静态构造函数是否线程安全?答案是肯定的!
  • .net(C#)中String.Format如何使用
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .Net语言中的StringBuilder:入门到精通
  • @ModelAttribute注解使用
  • [145] 二叉树的后序遍历 js
  • [2021ICPC济南 L] Strange Series (Bell 数 多项式exp)
  • [ajaxupload] - 上传文件同时附件参数值
  • [Angularjs]ng-select和ng-options
  • [C/C++随笔] char与unsigned char区别
  • [C++]18:set和map的使用
  • [codeforces]Recover the String