虽然sass、less或者刚出的Stylus这些预编译的css的出现,让我们前端开发变得更方便和简洁。但在一定层度上有增加了工程的复杂度,前端现在百花齐放,各种技术和工具的出现让人眼花缭乱。我个人看法是技术在需要的时候用,不要只为技术而技术。尽量保持工程的单一。所以看到这个css原生的变量出现,有点小激动。
原文
介绍
变量的定义 可以让我们在错杂庞大的css中抽象出一个便于维护和使用的对象。
使用
1 2 3 4
| 变量定义: --* 使用变量: var(--*) 命名规范: 不能出现 { } [ ] ; ! % $等特殊字符。命名还是比较宽松的,可以为数字、字母、横线、下滑线或者中文等组成。 ps:css里面是不区分大小写的,但是定义变量的时候可以使用大写,建议还是根据css的规范全都使用小写。
|
所以css变量定义 也分全局和局部
- 全局变量: 定义在 body {} 或者 :root{} 里面
- 局部变量: 定义在你需要定义的父节点选择器上 例如:div.class1{}里面。
不用太纠结上面的概念性,直接看下面的例子就好
用例
本例子因为使用markdown编译 会把–符号做特除处理,所以为方便大家直观的理解,样式直接写在行内。 原生变量的使用,已使用在微信小程序上测试使用,虽然很方便,但是只在IOS上能完美兼容,在大部分android手机上还是有问题,使用在生产上还需谨慎。
例子一
在根节点上定义全局变量,变量全局可用
1 2 3 4 5 6 7 8
| :root { --main-color: #06c; --accent-color: #006; } /* The rest of the CSS file */ #foo h1 { color: var(--main-color); }
|
例子二
变量定义 区分 大小写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <style> div { color: #000; --foo: red; --FOO: #ff5073; } .theLineColor { color: var(--foo); } .secondColor { color: var(--FOO); } </style> <body> <div class="theLineColor"> aaaaaaa </div> <div dir="" class="secondColor"> bbbbb </div> </body>
|
运行结果:
例子三
1
| --foo: if(x > 5) this.width = 10;
|
While this value is obviously useless as a variable, as it would be invalid in any normal property, it might be read and acted on by JavaScript.
反正我是没闹明白官文里面是几个意思,知道怎么使用的可以留个言告诉我下
例子四
继承父类选择器的样式的定义
1 2 3 4 5 6 7
| :root { --header-color: #06c; } h1 { background-color: var(--header-color); }
|
例子五
优先级顺序,和css的选择器的优先级一样
1 2 3 4 5 6 7 8 9 10 11
| :root { --color: purple; } div { --color: green; } #alert { --color: red; } * { color: var(--color); } <p>我的紫色继承于根元素</p> <div>我的绿色来自直接设置</div> <div id='alert'> ID选择器权重更高,因此阿拉是红色! <p>我也是红色,占了继承的光</p> </div>
|
我的紫色继承于根元素
我的绿色来自直接设置
ID选择器权重更高,因此这行是红色!
我也是红色,占了继承的光
例子六
变量可以根据不同语言单独保存,对需要国际化的网站很方便
1 2 3 4 5 6 7
| :root, :root:lang(en) {--external-link: "external link";} :root:lang(de) {--external-link: "externer Link";} a[href^="http"]::after {content: " (" var(--external-link) ")"} <div class="root2"><a href="http://www.meiyou.com">美柚</a></div>
|
默认会出现 美柚(external link)
例子七
循环依赖
1 2 3 4
| :root { --main-color: #c06; --accent-background: linear-gradient(to top, var(--main-color), white); }
|
例子八
没有 任何作用 的互相引用,而且他们计算的都是个初始数值
1 2 3 4
| :root { --one: calc(var(--two) + 20px); --two: calc(var(--one) - 20px); }
|
例子九
变量的计算和引用
1 2 3 4
| <one><two><three /></two></one> one { --foo: 10px; } two { --bar: calc(var(--foo) + 10px); } three { --foo: calc(var(--bar) + 10px); }
|
例子十
这是个 错误 的定义例子,变量的定义不能在属性名上
1 2 3 4
| .foo { --side: margin-top; var(--side): 20px; }
|
例子十一
在组件中使用,可以覆盖新想要覆盖的变量属性。可以灵活应用于组件中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| /* In the component’s style: */ .component .header { color: var(--header-color, blue); } .component .text { color: var(--text-color, black); } /* In the larger application’s style: */ .component { --text-color: #080; /* header-color isn’t set, and so remains blue, the fallback value */ } <div class="component"> <div class="header">header </div> <div class="text">text</div> <div>component</div> </div>
|
#### 响应式使用例子
在复杂的响应式布局中也可以使用变量的定义,根据不同分辨率的环境,设置不同的变量参数,达到相应变化的目的
张鑫旭的响应式例子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| .box { --columns: 4; --margins: calc(24px / var(--columns)); --space: calc(4px * var(--columns)); --fontSize: calc(20px - 4 / var(--columns)); } @media screen and (max-width: 1200px) { .box { --columns: 3; } } @media screen and (max-width: 900px) { .box { --columns: 2; } } @media screen and (max-width: 600px) { .box { --columns: 1; } }
|
兼容性
兼容性是绿油油的片
ps: 这是编辑草稿的公开副本。它仅供讨论,并可随时更改。其在这里的出版并不意味着W3C认可其内容。 官方文档