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 相关文章推荐
详解纯CSS3制作的20种loading动效
Jul 05 HTML / CSS
手把手教你用纯css3实现轮播图效果实例
May 04 HTML / CSS
css3动画事件—webkitAnimationEnd与计时器time事件
Jan 31 HTML / CSS
初探CSS3中的calc()功能
Jul 14 HTML / CSS
css3实现可拖动的魔方3d效果
May 07 HTML / CSS
js实现移动端H5页面手指滑动刻度尺功能
Nov 16 HTML / CSS
突袭HTML5之Javascript API扩展4—拖拽(Drag/Drop)概述
Jan 31 HTML / CSS
html5 div布局与table布局详解
Nov 16 HTML / CSS
HTML5的postMessage的使用手册
Dec 19 HTML / CSS
video实现有声音自动播放的实现方法
May 20 HTML / CSS
HTML5实现应用程序缓存(Application Cache)
Jun 16 HTML / CSS
AmazeUI 图标的示例代码
Aug 13 HTML / CSS
CSS3实现列表无限滚动/轮播效果
HTML5页面音频自动播放的实现方式
Jun 21 #HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
CSS中Single Div 绘图技巧的实现
CSS几步实现赛博朋克2077风格视觉效果
教你做个可爱的css滑动导航条
Html5大屏数据可视化开发的实现
You might like
PHP计算数组中值的和与乘积的方法(array_sum与array_product函数)
2016/04/01 PHP
javascript显示隐藏层比较不错的方法分析
2008/09/30 Javascript
javascript 字符串连接的性能问题(多浏览器)
2008/11/18 Javascript
jquery实现图片滚动效果的简单实例
2013/11/23 Javascript
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
详解JS正则replace的使用方法
2016/03/06 Javascript
利用AJAX实现WordPress中的文章列表及评论的分页功能
2016/05/17 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
2016/06/08 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
浅析Vue自定义组件的v-model
2017/11/26 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
2019/08/02 jQuery
node.js中事件触发器events的使用方法实例分析
2019/11/23 Javascript
js实现Element中input组件的部分功能并封装成组件(实例代码)
2021/03/02 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
Python实现Const详解
2015/01/27 Python
Python实现的购物车功能示例
2018/02/11 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
简单了解python关系(比较)运算符
2019/07/08 Python
超简单的Python HTTP服务
2019/07/22 Python
tensorflow 变长序列存储实例
2020/01/20 Python
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
教育技术职业规划范文
2014/03/04 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
省级青年文明号申报材料
2014/05/23 职场文书
农民工讨薪标语
2014/06/26 职场文书
日语专业求职信
2014/07/04 职场文书
教师党员学习十八届四中全会思想汇报
2014/11/03 职场文书
国富论读书笔记
2015/06/26 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
《揠苗助长》教学反思
2016/02/20 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
带你学习MySQL执行计划
2021/05/31 MySQL
MySQL索引失效的典型案例
2021/06/05 MySQL
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL