当前位置: 首页 > 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 属性实现动态修改样式(暂不推荐这种方案)

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

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

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

http://www.lryc.cn/news/297130.html

相关文章:

  • wyh的迷宫
  • AWS云用户创建
  • 微信小程序(三十七)选项点击高亮效果
  • 通过Demo学WPF—数据绑定(二)
  • 数据湖的整体思路
  • 51单片机 跑马灯
  • 迎新年年终总结
  • 一台服务器可以支持多少TCP连接
  • svg基础(六)滤镜-图像,光照效果(漫反射,镜面反射),组合
  • 电脑数据误删如何恢复?9 个Windows 数据恢复方案
  • 【doghead】uv_loop_t的创建及线程执行
  • 云计算运营模式介绍
  • 物资捐赠管理系统
  • YOLOv8改进 | 检测头篇 | 独创RFAHead检测头超分辨率重构检测头(适用Pose、分割、目标检测)
  • 私有化部署一个吃豆人小游戏
  • 社区店经营管理新思路:提升业绩的秘诀
  • 统一数据格式返回,统一异常处理
  • arm 平台安装snort3
  • 【Ubuntu 20.04/22.04 LTS】最新 esp-matter SDK 软件编译环境搭建步骤
  • 【C语言】案例:输出n位水仙花数
  • 代码随想录算法训练营第四十六天(动态规划篇)|01背包(滚动数组方法)
  • 【QT+QGIS跨平台编译】之三十:【NetCDF+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 从0开始图形学(光栅化)
  • B站弹幕分析系统
  • 戴上HUAWEI WATCH GT 4,解锁龙年新玩法
  • 鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之StepperItem组件
  • 2024-02-08 Unity 编辑器开发之编辑器拓展1 —— 自定义菜单栏与窗口
  • Intellij IDEA各种调试+开发中常见bug
  • 文件上传-Webshell
  • 掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧