本文的目的主要是展示CSS变量是如何工作的。随着Web应用程序变得越来越大,CSS变得越来越大,越来越多,而且很多时候都很乱,在良好的上下文中使用CSS变量,为您提供重用和轻松更改重复出现的CSS属性的机制。

在“纯粹的”CSS支持变量之前,我们有像LessSass这样的预处理器。但是它们需要在使用前进行编译,因此(有时)会增加额外的复杂性。

如何定义和使用CSS变量

从我们最熟悉的语言JavaScript开始:在JavaScript中定义变量使用vars。

要声明一个简单的JavaScript var,如下内容:

var mainColor = 'red';

要声明一个CSS变量,您必须在该var的名称前添加一个双短划线。例如:

body{
--color:red;
}

现在,为了使用CSS变量的值,我们可以使用var(...)函数。如下:

.demo{
background:var(--color);
}

管理CSS变量的最简单方法是将它们声明为:root伪类。鉴于CSS变量遵循规则,就像任何其他CSS定义一样,将它们放在:root中将确保所有选择器都可以访问这些变量。

:root{
--color:red;
} .demo{
background:var(--color);
} p{
color:var(--color);
}

浏览器支持CSS变量?

浏览器对CSS变量的支持还算不错的。只是IE浏览器不支持。想查看浏览器兼容性的可以点击这里,那么您将看到所有主流浏览器都支持开箱即用的CSS变量。无论是手机还是台式机。

CSS变量的实质应用

示例1 - 管理颜色

到目前为止,使用CSS变量的最佳候选者之一是管理网页的颜色。我们可以将它们放在变量中,而不是一遍又一遍地复制和粘贴相同的颜色。如果有人要求我们更新特定的绿色阴影或使所有按钮变为红色而不是蓝色,那么只需更改该CSS变量的值,就是这样。您不必搜索和替换该颜色的所有实例。

列如:

CSS代码

/*css_vars.css*/
:root {
--primary-color: #ed6564;
--accent-color: #388287;
} html {
background-color: var(--primary-color);
} h3 {
border-bottom: 2px solid var(--primary-color);
} button {
color: var(--accent-color);
border: 1px solid var(--accent-color);
} p {
color: var(--accent-color);
} /*base.css*/
* {
margin:;
padding:;
box-sizing: border-box;
} html {
padding: 30px;
font: normal 13px/1.5 sans-serif;
color: #546567;
background-color: var(--primary-color);
} .container {
background: #fff;
padding: 20px;
} h3 {
padding-bottom: 10px;
margin-bottom: 15px;
} p {
background-color: #fff;
margin: 15px 0;
} button {
margin:0 5px;
font-size: 13px;
padding: 8px 12px;
background-color: #fff;
border-radius: 3px;
box-shadow: none;
text-transform: uppercase;
font-weight: bold;
cursor: pointer;
opacity: 0.8;
outline:;
} button:hover {
opacity:;
} .center {
text-align: center;
}

HTML代码

<div class="container">
<h3>就业协议书</h3>
<p>就业协议书,全称是《全国普通高等学校毕业生就业协议书》,是由教育部高校学生司统一制订的。根据国家规定,在达成就业意向后,毕业生、用人单位、学校三方必须签订《全国普通高等学校毕业生就业协议书》。就业协议书是具有一定的广泛性和权威性,是学校制订就业方案派遣毕业生、用人单位申请用人指标的主要依据,对签约的三方都有约束力。</p>
<div class="center">
<button>查看详情</button><button>取消</button>
</div>
</div>

点击查看运行结果。

示例2 - 删除重复的代码

通常,您需要构建一些不同的组件变体。相同的基本样式,略有不同。让我们使用一些颜色不同的按钮。典型的解决方案是创建一个基类,比如.btn并添加变体类。

.btn {
border: 2px solid black;} .btn:hover {
background: black;} .btn.red {
border-color: red
}
.btn.red:hover {
background: red
}

现在使用它们像这样:

<button class="btn">Hello</button>
<button class="btn red">Hello</button>

但是,这会添加一些代码重复。在.red变体上,我们必须将border-color和background设置为红色。

这中情况可以使用CSS变量轻松修复。如下:

CSS代码:

.btn{
border-radius:4px;
text-align:center;
padding:.5em;
margin-bottom:0.5em;
background:#fff;
border:1px solid var(--color, black);
} .btn:hover{
color:#fff;
cursor:pointer;
background:var(--color, black);
} .btn.red{
--color:red;
} .btn.green{
--color:green;
} .btn.blue{
--color:blue;
}

HTML代码:

<div class="btn">HMOE</div>
<div class="btn red">HMOE</div>
<div class="btn green">HMOE</div>
<div class="btn blue">HMOE</div>

示例3 - 使一些属性可读

如果我们想要创建更复杂的属性值的快捷方式,CSS vars非常适合使用,因此我们不必记住它。CSS属性,如box-shadow,transform和font或其他带有多个参数的CSS规则就是完美的例子。我们可以将属性放在变量中,以便我们可以通过更易读的格式重用它。

例如:

:root {
--tiny-shadow: 4px 4px 2px 0 rgba(0, 0, 0, 0.8);
--animate-right: translateX(20px);
} li {
box-shadow: var(--tiny-shadow);
} li:hover {
transform: var(--animate-right);
}

例4 - 级联变量

标准级联规则也适用于CSS变量。因此,如果多次声明自定义属性,则css文件中最低的定义将覆盖其上方的定义。下面的示例演示了动态操作用户操作的属性是多么容易,同时仍然保持代码清晰简洁。

CSS_var.css文件:

.orange-container {
--main-text: 18px;
} .orange-container:hover {
--main-text: 22px;
} .red-container:hover {
--main-text: 26px;
} .title {
font-size: var(--title-text);
} .content {
font-size: var(--main-text);
} .container:hover {
--main-text: 18px;
}

base.css文件:

* {
margin:;
padding:;
box-sizing: border-box;
} html {
background: #eee;
padding: 30px;
font: 500 14px sans-serif;
color: #333;
line-height: 1.5;
} .orange-container {
background: orange;
} .red-container {
background: red;
} .red-container,
.orange-container {
padding-top: 10px;
padding-left: 50px;
} .container {
background: blue;
padding: 20px;
color: white;
} p {
transition: 0.4s;
} .title {
font-weight: bold;
}

index.html文件:

<html>

<head>
<link rel="stylesheet" type="text/css" href="base.css">
<link rel="stylesheet" type="text/css" href="css_vars.css">
</head> <body>
<div class="orange-container">
Hover orange to make blue bigger.
<div class="red-container">
Hover red to make blue even bigger.
<div class="container">
<p class="content">Hover on the different color areas to change the size of this text and the title.</p>
</div>
</div>
</div>
</body> </html>

点击查看运行结果。

示例5 - 具有CSS变量的主题切换器

CSS变量的一个好处是它的反应性。一旦我们更新它,任何具有CSS变量值的属性也会更新。因此,只需几行Javascript和CSS变量的智能使用,我们就可以制作一个主题切换器机制。

例如:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>具有CSS变量的主题切换器</title>
<style> body {
background-color: var(--bg, #b3e5fc);
color: var(--bg-text, #37474f);
font-family: sans-serif;
line-height: 1.3;
} .toolbar {
text-align: center;
} </style>
</head>
<body> <div class="toolbar">
<button value="dark">dark</button>
<button value="calm">calm</button>
<button value="light">light</button>
</div> <h2>Stackoverflow Question</h2>
<p>I would like to use an external javascript file in another javascript file. For example, I could store all my global variables
in a globals.js file and then call then from the website logic logic.js. Then in the index.html, i would insert the tag.
How do I use the globals.js inside the logic.js?
</p>
<script>
var root = document.documentElement;
var themeBtns = document.querySelectorAll(".toolbar > button"); themeBtns.forEach(function (btn){
btn.addEventListener("click", handleThemeUpdate);
}); function handleThemeUpdate(e) {
switch (e.target.value) {
case "dark":
root.style.setProperty("--bg", "black");
root.style.setProperty("--bg-text", "white");
break;
case "calm":
root.style.setProperty("--bg", "#B3E5FC");
root.style.setProperty("--bg-text", "#37474F");
break;
case "light":
root.style.setProperty("--bg", "white");
root.style.setProperty("--bg-text", "black");
break;
}
}
</script> </body>
</html>

点击查看运行结果

CSS变量的使用提示

像CSS中几乎所有的东西一样,变量也非常简单易用。以下是一些未包含在示例中的提示,但在某些情况下仍然非常有用:

1)css变量区分大小写。下面的示例是两个不同的变量:

:root {
--color: blue;
--COLOR: red;
}

2)当您使用var()函数时,您可以使用第二个参数。如果找不到自定义属性,将使用第二个参数为默认值:

width: var(--custom-width, 50%);

3)可以直接将CSS变量用于HTML:

<!--HTML-->
<html style="--size: 600px"> <!--CSS-->
body {
max-width: var(--size)
}

4) 可以在其他CSS var中使用CSS变量:

--base-red-color: #f00;
--background-gradient: linear-gradient(to top, var(--base-red-color), #222);

5) 可以使用媒体查询使CSS变量成为条件。例如,以下代码根据屏幕大小更改填充的值:

:root {
--padding: 15px
} @media screen and (min-width: 750px) {
--padding: 30px
}

6) 不要害怕在 clac()函数中使用CSS变量。

--text-input-width: 5000px;
max-width: calc(var(--text-input-width) / 2);

当然,CSS变量不是灵丹妙药。不会解决你在CSS领域遇到的每一个问题。但是,使用它使您的代码更具可读性和可维护性。此外,它极大地改善了大型文档的易变性。只需将所有常量设置在一个单独的文件中,当您只想对变量进行更改时,就不必跳过数千行代码。

初次接触CSS变量的更多相关文章

  1. Vue项目使用CSS变量实现主题化

    主题化管理经常能在网站上看到,一般的思路都是将主题相关的CSS样式独立出来,在用户选择主题的时候加载相应的CSS样式文件.现在大部分浏览器都能很好的兼容CSS变量,主题化样式更容易管理了.最近,使用C ...

  2. 初次接触GWT,知识点总括

    初次接触GWT,知识点概括 前言 本人最近开始研究 GWT(Google Web Toolkit) ,现将个人的一点心得贴出来,希望对刚开始接触 GWT的程序员们有所帮助,也欢迎讨论,共同进步. 先说 ...

  3. 初次接触Java

    今天初次接触Eclipse,学着用他来建立java工程,话不多说,来看看今天的成果! 熟悉自己手中的开发工具,热热身 刚上手别慌,有问题找度娘 刚刚拿到这个软件的安装包我是一脸懵逼的,因为是从官网下载 ...

  4. -1.记libgdx初次接触

    学习一门技术最难的是开发环境变量配置和工具配置,以下为我初次接触libgdx时遇到的问题 几个难点记录下 gradle 直接用下到本地,然后放到d盘,链接到就行(gradle-wrapper.prop ...

  5. 孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境

    孤荷凌寒自学python第八十三天初次接触ocr配置tesseract环境 (完整学习过程屏幕记录视频地址在文末) 学习Python我肯定不会错过图片文字的识别,当然更重要的是简单的验证码识别了,今天 ...

  6. 引人瞩目的 CSS 变量(CSS Variable)

    这是一个令人激动的革新. CSS 变量,顾名思义,也就是由网页的作者或用户定义的实体,用来指定文档中的特定变量. 更准确的说法,应该称之为 CSS 自定义属性 ,不过下文为了好理解都称之为 CSS 变 ...

  7. 初次接触json...

    这两天发现很多网站显示图片版块都用了瀑布流模式布局的:随着页面滚动条向下滚动,这种布局还会不断加载数据并附加至当前尾部.身为一个菜鸟级的程序员,而且以后可能会经常与网站打交道,我觉得我还是很有必要去尝 ...

  8. 第一个CSS变量:currentColor

    一.基本介绍 CSS变量正慢慢地从最初的草案到浏览器实现.但规范中有个已经存在多年的变量:currentColor.这个CSS特性具有良好的浏览器支持和一些实际的应用,本篇文章,我们来学习和了解它. ...

  9. [Docker]初次接触

    Docker 初次接触 近期看了不少docker介绍性文章,也听了不少公开课,于是今天去官网逛了逛,发现了一个交互式的小教程于是决定跟着学习下. 仅仅是把认为重点的知识记录下来,不是非常系统的学习和笔 ...

随机推荐

  1. Oracle EBS FA 本年折旧

    FUNCTION get_ytd_deprn(p_asset_id IN NUMBER, p_book_type_code IN VARCHAR2, p_rate_source_rule IN VAR ...

  2. ASP.NET MVC从视图传参到控制器的几种形式

    1. 传递数组 $(function () { var value = ["C#", "JAVA", "PHP"]; $("inp ...

  3. Linux唤醒抢占----Linux进程的管理与调度(二十三)

    1. 唤醒抢占 当在try_to_wake_up/wake_up_process和wake_up_new_task中唤醒进程时, 内核使用全局check_preempt_curr看看是否进程可以抢占当 ...

  4. python爬虫之12306网站--车站信息查询

    python爬虫查询车站信息 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息进行处理 python爬虫查询全拼相同的车站 目录: 1.找到要查询的url 2.对信息进行分析 3.对信息 ...

  5. stored information about method csdn

    Eclipse编译时保留方法的形参 Window -> Preferences -> Java -> Compiler. 选中Store information about meth ...

  6. PCL学习笔记1

    先贴一段代码,从别处抄来的 #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_type ...

  7. java基础学习总结——equals方法

    一.equals方法介绍 1.1.通过下面的例子掌握equals的用法 package cn.galc.test; public class TestEquals { public static vo ...

  8. HTML 页面自动刷新

    学习就是一个不断积累的过程,每一天能够学到一点新东西说明自己就在进步!! HTML head 里面设置页面自动刷新功能 <meta http-equiv="Refresh" ...

  9. puppet 和 apache passenger的配置

    目录 1. 概要 2. apache passenger 安装测试 2.1. 什么是 apache passenger 2.2. 安装 apache passenger 2.3. 配置 apache ...

  10. 【Teradata】配置PE和AMP(congfig和reconfig工具、vprocmanager)

    The Reconfiguration and Configuration utilities are used to define the AMPs and PEs that operate tog ...