好了,废话完了,我们今天来说一说CSS3变量。
貌似在任何编程语言中,都离不开变量,变量的好处,如提高性能、易维护等我就不多说了。CSS预编译工具Sass/Less/Stylus等,也早就推出了变量。CSS3不负众望,也推出了自己的变量,虽然写法和平时我们写其他语言不太一样,但是,也很好理解。
首先,我们看下兼容性吧,如果兼容性很差,那都是扯淡:
Firefox:49+ Chrome:49+ Safari:9.1+ Opera:41+ IOS Safari:9.3+怎么没有IE呢,非常抱歉,IE11还不支持,不知道后面的版本怎么样,您可以自己回去测。但是已经很不错了,至少开发手机站和混合APP没多大问题了!
第二,CSS3变量语法:
专业表达:var( [, ]? )
换做人话是这么说的:var( <自定义属性名> [, <默认值 ]? ) 简单描述下:var你就把它看成js的函数,括号里是传参,第一个参数必传,传的是你自定义的变量名,第二个参数是选填,即这个变量名的默认值,函数的返回值就是参数变量的值。
如默认值的用法:
div{ background-color: var(--bg,red); }由于并没有定义“--bg”这个变量,这个div最终背景色为red。
第三,变量的写法:
--*,语法是:var(--*),其中 * 表示我们的变量名。
注:1、变量必须以--开头,如 --bg、--color等。
2、变量的命名规则:不能包含如"$","[","^","(","%"等特殊字符,仅限于“数字[0-9]”,“字母[a-zA-Z]”,“下划线_”,“短横线-”组合,此外,也可以是中文、韩文、日文等(易语言?你们还想到什么语言用中文来写,在下面评论,让小编也涨涨见识)。
第四:我们通过例子来了解css3变量的一些用法
例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>最终效果图:
说明:
变量也是跟着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变量,这是真实的实战,可以去看看。
第六:js获取和设置CSS变量,与获取普通css属性一致:
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');最后,来看个利用CSS3变量编写的响应式效果:
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学堂,获取更多干货哦!