经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » CSS » 查看文章
采用css3的var实现动态主题切换
来源:cnblogs  作者:中园  时间:2022/1/17 10:48:04  对本文有异议

背景

因为是一个二期项目,需要在一期的基础上做一些风格的改变,但是苦于没有产品和UI,所以这个事情就落到了前端的头上,一开始只是想的统一一下按钮和标题的颜色(这里就用到了var),顺便做些颜色改动比较方便,后面直接要求做一个动态主题切换(当然只是颜色的切换),所以就顺便研究了一下利用var来实现主题颜色切换。

准备

  • css自定义属性(也叫做css变量)
    官方称呼其为自定义属性,坊间通常叫做css变量,因为它类似于其他js语言中的变量,可用于存储颜色、字体、大小宽度等css属性值;定义方式为两个连字符也就是中划线(--)开头,引用方式为var(custom-property-name, value),其中custom-property-name为定义的变量名称(必须),value为回退值(非必须),也叫默认值(如果前面引用的变量名称未定义时就会使用该值)。具体使用如下:
  1. :root{
  2. --theme-color: blue;
  3. --theme-border: 1px solid var(--theme-color, #ccc);
  4. }
  5. .demo-txt{
  6. color: var(--theme-color);
  7. }
  8. .demo-btn{
  9. border: var(--theme-border);
  10. }
  • :root伪类
    它匹配文档的根<html>元素,但具有更高的优先级,所以在:root中定义定义的变量可用于全局访问,如需覆盖其中的变量值,只需要在引用的元素同级或父级定义变量名称相同的变量覆盖即可。

使用

  1. 在theme.css文件中定义好变量
  1. :root{
  2. --theme-color: #ff6a00;
  3. --font-color: #333;
  4. --bg-color: #fff;
  5. --panel-bg-color: #eee;
  6. --border: 1px solid #ddd;
  7. /** more attribute **/
  8. }
  9. :root[theme='blue']{
  10. --theme-color: #2563eb;
  11. }
  12. :root[theme='dark']{
  13. filter: invert(1) brightness(1);
  14. }
  1. 在页面中动态切换主题
    添加页面文件index.html,内容如下:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>Dynamic Theme Demo</title>
  8. <link rel="stylesheet" href="theme.css">
  9. <link rel="stylesheet" href="index.css">
  10. </head>
  11. <body>
  12. <section class="container">
  13. <header class="header">头部标题</header>
  14. <main class="main">
  15. <div class="con">
  16. <p>主题说明:链接文字采用主题色,按钮背景采用主题色</p>
  17. <a href="#">链接</a><br>
  18. <button>按钮</button>
  19. </div>
  20. <div class="radio-group">
  21. <input id="default" type="radio" name="theme" value="defalut" checked/><label for="default">默认</label>&nbsp;
  22. <input id="blue" type="radio" name="theme" value="blue" /><label for="blue">蓝色</label>&nbsp;
  23. <input id="dark" type="radio" name="theme" value="dark" /><label for="dark">暗黑</label>
  24. </div>
  25. </main>
  26. <footer class="footer">页面底部</footer>
  27. </section>
  28. <script>
  29. var themes = document.getElementsByName("theme");
  30. Array.from(themes).forEach(themeRadio => {
  31. themeRadio.addEventListener("click", function(){
  32. document.documentElement.setAttribute("theme", this.value);
  33. })
  34. })
  35. </script>
  36. </body>
  37. </html>

添加样式文件index.html, 内容如下:

  1. *{
  2. padding: 0;
  3. margin: 0;
  4. border: 0;
  5. font-size: var(--font-size);
  6. color: var(--font-color);
  7. }
  8. html, body{
  9. width: 100%;
  10. height: 100%;
  11. background-color: var(--body-bg-color);
  12. }
  13. a{
  14. color: var(--theme-color);
  15. }
  16. button{
  17. background-color: var(--theme-color);
  18. color: var(--body-bg-color);
  19. line-height: 20px;
  20. padding: 10px;
  21. }
  22. .container{
  23. display: flex;
  24. flex-direction: column;
  25. width: 70%;
  26. height: 100%;
  27. margin: 0 auto;
  28. background-color: var(--body-bg-color);
  29. }
  30. .container .header{
  31. --line-height: 40px;
  32. height: var(--line-height);
  33. line-height: var(--line-height);
  34. padding: var(--content-padding);
  35. font-size: var(--font-size-lg);
  36. box-shadow: var(--boxshadow);
  37. background-color: var(--bg-color);
  38. }
  39. .container .main{
  40. flex: 1;
  41. line-height: 30px;
  42. padding: var(--content-padding);
  43. }
  44. .container .footer{
  45. --line-height: 30px;
  46. height: var(--line-height);
  47. line-height: var(--line-height);
  48. padding: var(--content-padding);
  49. font-size: var(--font-size-sm);
  50. background-color: var(--bg-color-lg);
  51. }

主要就是通过切换html的属性来达到切换的效果。

总结

使用var切换主题的方式比较简单,而且对统一页面样式以及后期维护有很大帮助,适用于对兼容性要求不高的(IE15以上支持)需求。如果需要兼容性更高的主题切换,可以参考张鑫旭老师的这篇文章《link rel=alternate网站换肤功能最佳实现》

参考文章

https://zhuanlan.zhihu.com/p/60975003

转载请注明出处

https://www.cnblogs.com/jieli/p/15806735.html

原文链接:http://www.cnblogs.com/jieli/p/15806735.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号