文的目的主要是展示CSS变量是如何工作的。随着Web应用程序变得越来越大,CSS变得越来越大,越来越多,而且很多时候都很乱,在良好的上下文中使用CSS变量,为您提供重用和轻松更改重复出现的CSS属性的机制。
在“纯粹的”CSS支持变量之前,我们有像Less和Sass这样的预处理器。但是它们需要在使用前进行编译,因此(有时)会增加额外的复杂性。
从我们最熟悉的语言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变量的支持还算不错的。只是IE浏览器不支持。那么您将看到所有主流浏览器都支持开箱即用的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: 0;
padding: 0;
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: 0;
}
button:hover {
opacity: 1;
}
.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: 0;
padding: 0;
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中几乎所有的东西一样,变量也非常简单易用。以下是一些未包含在示例中的提示,但在某些情况下仍然非常有用:
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领域遇到的每一个问题。但是,使用它使您的代码更具可读性和可维护性。此外,它极大地改善了大型文档的易变性。只需将所有常量设置在一个单独的文件中,当您只想对变量进行更改时,就不必跳过数千行代码。
正文开始前,小编想说一句:今天合肥由于大风,雾霾都吹走了,天特别蓝,早上骑车上班,飓风拂面,酸爽!
好了,废话完了,我们今天来说一说CSS3变量。
貌似在任何编程语言中,都离不开变量,变量的好处,如提高性能、易维护等我就不多说了。CSS预编译工具Sass/Less/Stylus等,也早就推出了变量。CSS3不负众望,也推出了自己的变量,虽然写法和平时我们写其他语言不太一样,但是,也很好理解。
css3 var兼容性
Firefox:49+ Chrome:49+ Safari:9.1+ Opera:41+ IOS Safari:9.3+
怎么没有IE呢,非常抱歉,IE11还不支持,不知道后面的版本怎么样,您可以自己回去测。但是已经很不错了,至少开发手机站和混合APP没多大问题了!
专业表达:var( [, ]? )
换做人话是这么说的:var( <自定义属性名> [, <默认值 ]? )
简单描述下:var你就把它看成js的函数,括号里是传参,第一个参数必传,传的是你自定义的变量名,第二个参数是选填,即这个变量名的默认值,函数的返回值就是参数变量的值。
如默认值的用法:
div{ background-color: var(--bg,red); }
由于并没有定义--bg这个变量,这个div最终背景色为red。
--*,语法是:var(--*),其中 * 表示我们的变量名。
注: 1、变量必须以--开头,如 --bg、--color等。 2、变量的命名规则:不能包含如"$","[","^","(","%"等特殊字符,仅限于“数字[0-9]”,“字母[a-zA-Z]”,“下划线_”,“短横线-”组合,此外,也可以是中文、韩文、日文等(易语言?你们还想到什么语言用中文来写,在下面评论,让小编也涨涨见识)。
例1:英文和中文命名
div{ --color: #f00; --蓝色: #00f; background-color: var(--蓝色); color: var(--color); }
例2:数字命名
:root { --1: #369; } body { background-color: var(--1); }
变量名以数字开头,很奇怪对吧,css的class和id不能,js的变量也不能,但是css变量却能!
此外,这里给root定义变量,却在body使用,是因为root包含body,这点很重要。
例3:变量名必须包含在花括号内
--深蓝: #369; body { background-color: var(--深蓝); }
这里的变量“--深蓝”在花括号之外,所以无效。
例4、权重、继承性、范围性(摘自网上的一个例子):
css:
<style type="text/css"> :root { --color: purple; } div { --color: green; } #alert { --color: red; border:1px solid #000;} * { color: var(--color); } </style>
html:
<p>p标签文字颜色:紫色</p> <div>div标签文字颜色:绿色</div> <div id='alert'> ID选择器权重更高,因此文字颜色是红色! <p>我也是红色,占了继承的光</p> </div>
最终效果图:
css3 var 案例
说明:
变量也是跟着CSS选择器走的,如果变量所在的选择器和使用变量的元素没有交集,是没有效果的。例如#alert定义的变量,只有id为alert的元素才能享有。如果你想变量全局使用,则你可以设置在:root选择器上;
当存在多个同样名称的变量时候,变量的覆盖规则由CSS选择器的权重决定的,但并无!important这种用法,因为没有必要,!important设计初衷是干掉JS的style设置,但对于变量的定义则没有这样的需求。
例5:值的合法性及缺省值
div{ --color: 20px; background-color: var(--color, #cd0000); }
上面这个div最终颜色为透明,因为虽然设置了变量名的默认值为#cd0000,但是前面定义了变量--color,而--color的值是不合法的颜色值,最终用缺省值代替,div的缺省值,就是透明。
例6:既然CSS属性值可以用变量,属性名可以用么?
body { --bc: background-color; var(--bc): #369; }
结果无效,属性名不能用变量替代。
例7,CSS3变量的传递性:
div{ --green: #4CAF50; --bg: var(--green); background-color: var(--bg); }
这里将变量--green的值赋给了--bg,最后再把变量--bg的值赋给css属性名background-color
例8,除上面的例子,在 前端干货:利用css3编写一个炫酷的波浪效果loading动画这篇文章也用到了CSS3变量,这是真实的实战,可以去看看。
html:
<div id="cssVar"></div>
css:
#cssVar{ --my-width: 200px; width:var(--my-width); }
js:
var el = document.querySelector('#cssVar'); //GET获取 var curWidth = getComputedStyle(el).getPropertyValue("--my-width"); console.log(curWidth); //200px //SET设置 el.style.setProperty("--my-width", '300px');
html:
<h1>CSS3变量编写的响应式效果</h1> <div class="container"> <div class="item item1">1</div> <div class="item item2">2</div> <div class="item item3">3</div> <div class="item item4">4</div> </div>
css:
*{padding:0;margin:0;} :root { --font-size: 30px; --width:20%; --margin:15px 2.5%; } .container{display: flex; flex-wrap: wrap;} h1{text-align: center;} h1,.item{font-size: var(--font-size);} .item{ text-align: center; font-size:20px; color:#fff; height:40px; line-height: 40px; margin:var(--margin); width:var(--width); flex-shrink: 0 } .item1{background:#acf4b6;} .item2{background:#ffe975;} .item3{background:#5efffa;} .item4{background:#e6b4fd;} @media screen and (max-width: 700px) { :root { --font-size: 20px; --width:45%; --margin:10px 2.5%; } } @media screen and (max-width: 500px) { :root { --font-size: 14px; --width:100%; --margin:0 0%; } }
浏览器宽度700以上的效果:
浏览器宽度500-700以上的效果:
浏览器宽度500以下的效果:
以往,我们可能要单独在每个适配宽度下,调整标题大小,item的相关尺寸等,现在,定义成变量,在适配宽度的时候,只要调整变量就可以了,大大节省了代码量,且便于维护。
好了,今天的干货就到这里了,欢迎在下方留言评论本文的不足之处!关注IT学堂,获取更多干货哦!
oading动画在页面过度等经常会用到,我在工作中就写过很多有趣的loading加载动画,在这里,我就分享一个波浪效果的loading动画写法(在写动画前,可以先画个草稿或动画流程图,充分思考动画执行的过程,再编写代码事半功倍哦)。
css3编写的loading动画
<div class="loading"> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span> <span></span> </div>
1、让loading居中显示,同时让它变成flex容器,这样span就能设置宽高。
.loading{display: flex; width: 100px; height: 50px; position: absolute; top:50%; left: 50%; transform: translate(-50px,-25px);}
2、分析下这10个span的动画过程:我们把动画从开始到结束分成100份,0%的时候高度几乎没有,位置靠左,高度由小变大,大概15%的时候,突然变很高,颜色很深,并且右移很多,然后依次变矮,变浅,左移,以此类推。通过这个分析,我们写起来就有方向了。
2、根据动画效果和刚才的分析,10个span平分loading的宽度,高度我们就写和loading一样的高度,然后利用scaleY将它缩小,初始深点的背景色,在动画结束时,我们将颜色设置的很浅(颜色过渡建议同色系深浅变化或者相邻色系变化,比较自然好看,不建议颜色过渡特别大)。同时设置translateX也向左平移10像素(数值可以自己调整)。设置animation的动画时间为1.5秒,动画播放次数为无限次,动画效果为先慢后快再慢。重点:10个span的动画是以此执行,这里我们利用css3的var变量(文章末尾我们再来简单了解下这个css3 var以及css3计算calc)来动态编写动画延时:
.loading span { width: 10px; height: 50px; background-color: #308dec; transform: scaleY(0.01) translateX(-10px); animation: load-ani 1.5s infinite ease-in-out; animation-delay: calc(var(--n) * 0.05s); }
3、分别设置十个span的延时时间(后面分析var的时候再来讨论为什么这么写)
.loading span:nth-child(1) { --n: 1; } .loading span:nth-child(2) { --n: 2; } .loading span:nth-child(3) { --n: 3; } .loading span:nth-child(4) { --n: 4; } .loading span:nth-child(5) { --n: 5; } .loading span:nth-child(6) { --n: 6; } .loading span:nth-child(7) { --n: 7; } .loading span:nth-child(8) { --n: 8; } .loading span:nth-child(9) { --n: 9; } .loading span:nth-child(10) { --n: 10; }
4、最后来写animate动画,有了前面详细的分析,这里就没什么好解释的了,高度从0.01倍过渡到1.2倍再过渡到初始的0.01倍,1.2倍是从15%开始的,所以才有了上面的“突然”的效果。至此loading动画就写完了。
@keyframes load-ani { 0%, 100% { transform: scaleY(0.01) translateX(-10px); } 15% { transform: scaleY(1.2) translateX(20px); } 90%, 100% { background-color: #aed4fb; } }
我们重点来分析下span动画依次执行的原理,先来说下css3 的 var 变量,先看下面的代码:
div{ --green: #4CAF50; background-color: var(--green); }
设置div的背景色为#4CAF50。这里的--green就是一个变量,变量名是green,值是“#4CAF50”,“--”是css3规定的变量的前缀,而var()里面放的是变量名,表示使用这个变量的值,当然,还有一些用法,如默认值等,这个关注IT学堂,我们将会在后面的文章中专门介绍css3 var的用法。
calc比var要出名,用过的人一定很多,它能进行css的一些计算,如加减乘除,需要注意的是,操作符左右要有空格,否则不起作用,如:
calc(10px + 10px) //20px calc(10px+10px) //错误
理解了var和calc,就很简单了:calc(var(--n) * 0.05s) 其实就是拿变量n*0.05s,而n则在第三步对每个span都进行了设置,随着n的不断变大,延时时间也就依次变长。
好了,今天的教程就到这里了,不知道您有收获没。有疑问和建议的,可以在下方留言。关注IT学堂,每天都有干货哦!
*请认真填写需求信息,我们会在24小时内与您取得联系。