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 @font-face属性使用指南
Dec 12 HTML / CSS
css3实现的多级渐变下拉菜单导航效果代码
Aug 31 HTML / CSS
css 元素选择器的简单实例
May 23 HTML / CSS
CSS3颜色值RGBA与渐变色使用介绍
Mar 06 HTML / CSS
HTML5中Canvas与SVG的画图原理比较
Jan 16 HTML / CSS
html5中JavaScript removeChild 删除所有节点
May 16 HTML / CSS
详解HTML5中的manifest缓存使用
Sep 09 HTML / CSS
HTML5事件方法全部汇总
May 12 HTML / CSS
使用phonegap获取设备的一些信息方法
Mar 31 HTML / CSS
html如何对span设置宽度
Oct 30 HTML / CSS
AmazeUI中各种的导航式菜单与解决方法
Aug 19 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
Sep 10 HTML / CSS
CSS3实现列表无限滚动/轮播效果
HTML5页面音频自动播放的实现方式
Jun 21 #HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
CSS中Single Div 绘图技巧的实现
CSS几步实现赛博朋克2077风格视觉效果
教你做个可爱的css滑动导航条
Html5大屏数据可视化开发的实现
You might like
9个实用的PHP代码片段分享
2015/01/22 PHP
PHP模拟登陆163邮箱发邮件及获取通讯录列表的方法
2015/03/07 PHP
WordPress中注册菜单与调用菜单的方法详解
2015/12/18 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
使用javascript控制cookie显示和隐藏背景图
2014/02/12 Javascript
jquery图片倾斜层叠切换特效代码分享
2015/08/27 Javascript
整理Javascript数组学习笔记
2015/11/29 Javascript
Extjs实现下拉菜单效果
2016/04/01 Javascript
jQuery easyUI datagrid 增加求和统计行的实现代码
2016/06/01 Javascript
JQuery对ASP.NET MVC数据进行更新删除
2016/07/13 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
学习vue.js中class与style绑定
2016/12/03 Javascript
Bootstrap Img 图片样式(推荐)
2016/12/13 Javascript
清除输入框内的空格
2016/12/21 Javascript
基于Node.js搭建hexo博客过程详解
2019/06/25 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
JavaScript享元模式原理与用法实例详解
2020/03/09 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
python生成器表达式和列表解析
2016/03/10 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
Python封装原理与实现方法详解
2018/08/28 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
深入了解python中元类的相关知识
2019/08/29 Python
wxPython多个窗口的基本结构
2019/11/19 Python
Python基于当前时间批量创建文件
2020/05/07 Python
Python利用Pillow(PIL)库实现验证码图片的全过程
2020/10/04 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
全球性的在线时尚男装零售商:boohooMAN
2016/12/17 全球购物
兰芝美国网上商城:购买LANEIGE睡眠面膜等
2017/06/30 全球购物
不服劳动仲裁起诉书
2015/05/20 职场文书
Oracle删除归档日志及添加定时任务
2022/06/28 Oracle
pytest实现多进程与多线程运行超好用的插件
2022/07/15 Python