CSS变量实现主题切换的方法


Posted in HTML / CSS onJune 23, 2021

CSS 变量

基本用法

声明一个变量,属性名需要以两个减号(--)开始,属性值则可以是任何有效的CSS值。

element {
  --main-bg-color: brown;
}

选择器是指定变量的可见作用域,该变量仅用于匹配当前选择器及其子孙,通常的最佳实践是定义在根伪类 :root 下,这样就可以在HTML文档的任何地方访问到它了。

:root {
  --main-bg-color: brown;
}

使用一个局部变量时用 var() 函数包裹以表示一个合法的属性值:

element {
  background-color: var(--main-bg-color);
}

备用值

用 var() 函数可以定义多个备用值(fallback value),当给定值未定义时将会用备用值替换

备用值并不是用于实现浏览器兼容性的。如果浏览器不支持CSS自定义属性,备用值也没什么用

color: var(--my-var, red);
background-color: var(--my-var, var(--my-background, pink));

有效性

传统的CSS概念里,有效性和属性是绑定的,这对变量来说并不适用。当变量被解析,浏览器不知道它们什么时候会被使用,所以必须认为这些值都是有效的。
即便这些值是有效的,但当通过 var() 函数调用时,它在特定上下文环境下也可能不会奏效。属性和自定义变量会导致无效的CSS语句,这引入了一个新的概念:计算时有效性。

<p>This paragraph is initial black.</p>
:root { --text-color: 16px; }
p { color: blue; }
p { color: var(--text-color); }

浏览器将 --text-color 的值替换给了 var(--text-color),但是 16px 并不是 color 的合法属性值。代换之后,该属性不会产生任何作用。浏览器会执行如下两个步骤:

  • 检查属性 color 是否为继承属性。是,但是 <p> 没有任何父元素定义了 color 属性。转到下一步。
  • 将该值设置为它的默认初始值,black。

当CSS属性-值对中存在语法错误,该行则会被忽略。然而如果自定义属性(变量)的值无效,它并不会被忽略,从而会导致该值被覆盖为默认值。

JavaScript 中的值

// 获取一个 Dom 节点上的 CSS 变量
element.style.getPropertyValue("--my-var"); //  MDN上给的,但获取一直是空的,其他两个倒是没问题

// 获取任意 Dom 节点上的 CSS 变量
getComputedStyle(element).getPropertyValue("--my-var");

// 修改一个 Dom 节点上的 CSS 变量
element.style.setProperty("--my-var", jsVar + 4);

主题切换

<!DOCTYPE html>
<html lang="en">
  <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>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      :root {
        --bg: #000;
        --fontSize: 25px;
      }
      .pink-theme {
        --bg: hotpink;
      }
      body {
        transition: background 1s;
        background: var(--bg);
      }
      button {
        position: fixed;
        top: 50%;
        left: 50%;
        transition: color 1s;
        transform: translate(-50%, -50%);
        padding: 20px;
        border: none;
        background: #fff;
        font-size: var(--fontSize);
        color: var(--bg);
      }
    </style>
  </head>
  <body>
    <button>点击切换</button>
    <script>
      document.querySelector("button").addEventListener("click", () => {
        if (document.body.classList.contains("pink-theme")) {
          document.body.classList.remove("pink-theme");
        } else {
          document.body.classList.add("pink-theme");
        }
      });
    </script>
  </body>
</html>

到此这篇关于CSS变量实现主题切换的方法的文章就介绍到这了,更多相关CSS主题切换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章,希望大家以后多多支持三水点靠木!

 
HTML / CSS 相关文章推荐
html5 css3 动态气泡按钮实例演示
Dec 02 HTML / CSS
CSS3动画效果回调处理详解
Dec 10 HTML / CSS
利用CSS3实现开门效果实例源码
Aug 22 HTML / CSS
HTML5地理定位与第三方工具百度地图的应用
Nov 17 HTML / CSS
HTML5中视频音频的使用详解
Jul 07 HTML / CSS
html Table 表头固定的实现
Jan 22 HTML / CSS
HTML5 常用语法一览(列举不支持的属性)
Jan 26 HTML / CSS
5 个强大的HTML5 API 函数推荐
Nov 19 HTML / CSS
基于HTML5代码实现折叠菜单附源码下载
Nov 27 HTML / CSS
uniapp+Html5端实现PC端适配
Jul 15 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
Dec 14 HTML / CSS
CSS实现隐藏搜索框功能(动画正反向序列)
Jul 21 HTML / CSS
CSS3实现列表无限滚动/轮播效果
HTML5页面音频自动播放的实现方式
Jun 21 #HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
CSS中Single Div 绘图技巧的实现
CSS几步实现赛博朋克2077风格视觉效果
教你做个可爱的css滑动导航条
Html5大屏数据可视化开发的实现
You might like
一步一步学习PHP(5) 类和对象
2010/02/16 PHP
PHP容易忘记的知识点分享
2013/04/30 PHP
PHP 简易输出CSV表格文件的方法详解
2013/06/20 PHP
php基于ob_start(ob_gzhandler)实现网页压缩功能的方法
2017/02/18 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
2018/03/30 PHP
PHP获取真实IP及IP模拟方法解析
2020/11/24 PHP
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
页面按钮禁用与解除禁用的方法
2014/02/19 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
BootStrap实现手机端轮播图左右滑动事件
2016/10/13 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
JS高仿抛物线加入购物车特效实现代码
2017/02/20 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
解决vue跨域axios异步通信问题
2019/04/17 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
jQuery实现日历效果
2020/09/11 jQuery
在Python中使用列表生成式的教程
2015/04/27 Python
matplotlib作图添加表格实例代码
2018/01/23 Python
pycharm中import呈现灰色原因的解决方法
2020/03/04 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
解决Jupyter NoteBook输出的图表太小看不清问题
2020/04/16 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
2020/07/23 Python
python tkinter实现连连看游戏
2020/11/16 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
Html5 new XMLHttpRequest()监听附件上传进度
2021/01/14 HTML / CSS
美国最大的存储市场:SpareFoot
2018/07/23 全球购物
巴西补充剂和维生素购物网站:Natue
2019/06/17 全球购物
行政办公员自我评价分享
2013/12/14 职场文书
铁路个人事迹材料
2014/01/30 职场文书
优秀员工获奖感言
2014/03/01 职场文书
法人授权委托书样本
2014/09/19 职场文书
预备党员自我批评思想汇报
2014/10/10 职场文书
年终工作总结范文2014
2014/11/27 职场文书
我们的节日重阳节活动总结
2015/03/24 职场文书