当前位置:首页 » 《随便一记》 » 正文

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

13 人参与  2024年02月29日 08:01  分类 : 《随便一记》  评论

点击全文阅读


目录

背景

(强烈推荐)实现方法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://zhangshiyu.com/post/71275.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1