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截图_动力节点Java学院整理
Jul 11 HTML / CSS
CSS3 Flexbox中flex-shrink属性的用法示例介绍
Dec 30 HTML / CSS
CSS3属性background-size使用指南
Dec 09 HTML / CSS
CSS3与动画有关的属性transition、animation、transform对比(史上最全版)
Aug 18 HTML / CSS
Bootstrap 学习分享
Nov 12 HTML / CSS
html5 canvas-1.canvas介绍(hello canvas)
Jan 07 HTML / CSS
HTML5 本地存储之如果没有数据库究竟会怎样
Apr 25 HTML / CSS
HTML5所有标签汇总及标签意义解释
Mar 12 HTML / CSS
html5本地存储 localStorage操作使用详解
Sep 20 HTML / CSS
浅谈Html5页面打开app的一些思考
Mar 30 HTML / CSS
canvas小画板之平滑曲线的实现
Aug 12 HTML / CSS
AmazeUI 按钮交互的实现示例
Aug 24 HTML / CSS
CSS3实现列表无限滚动/轮播效果
HTML5页面音频自动播放的实现方式
Jun 21 #HTML / CSS
html中显示特殊符号(附带特殊字符对应表)
CSS中Single Div 绘图技巧的实现
CSS几步实现赛博朋克2077风格视觉效果
教你做个可爱的css滑动导航条
Html5大屏数据可视化开发的实现
You might like
用定制的PHP应用程序来获取Web服务器的状态信息
2006/10/09 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP5.3以上版本安装ZendOptimizer扩展
2015/03/27 PHP
PHP、Java des加密解密实例
2015/04/27 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
php解压缩zip和rar压缩包文件的方法
2019/07/10 PHP
jquery默认校验规则整理
2014/03/24 Javascript
node.js中的url.parse方法使用说明
2014/12/10 Javascript
JavaScript获取网页中第一个图片id的方法
2015/04/03 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
微信小程序教程系列之视图层的条件渲染(10)
2017/04/19 Javascript
nodejs操作mysql实现增删改查的实例
2017/05/28 NodeJs
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
[01:03:00]DOTA2上海特级锦标赛A组败者赛 EHOME VS CDEC第一局
2016/02/25 DOTA
[00:39]DOTA2上海特级锦标赛 Liquid战队宣传片
2016/03/04 DOTA
Django对数据库进行添加与更新的例子
2019/07/12 Python
Python:slice与indices的用法
2019/11/25 Python
pytorch实现线性拟合方式
2020/01/15 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
利用纯CSS3实现动态的自行车特效源码
2017/01/20 HTML / CSS
three.js模拟实现太阳系行星体系功能
2019/09/03 HTML / CSS
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
毕业生自荐信的主要内容
2013/10/29 职场文书
2014年“四风”问题个人整改措施
2014/09/17 职场文书
幼儿园教师个人总结
2015/02/05 职场文书
开票员岗位职责
2015/02/12 职场文书
2015新学期校长寄语(3篇)
2015/03/25 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
经营场所使用证明
2015/06/19 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
企业版Windows 11有哪些新功能? Win11适用于企业的功能介绍
2021/11/21 数码科技
Nginx 常用配置
2022/05/15 Servers