变量与自定义属性
自定义属性| Custom Properties/Variables
大部分的编程语言都有所谓变量的概念,早期我们在
语法基础
顾名思义,
/* 传统方式 */
#title {
color: #ff6f69;
}
.quote {
color: #ff6f69;
}
/* 统一变量 */
:root {
--red: #ff6f69;
}
#title {
color: var(--red);
}
.quote {
color: var(--red);
}
既然是变量,我们肯定需要考虑其作用域;如上面所示的声明在 :root
伪类中的变量,等价于绑定在了<html>
.alert {
--alert-color: #ff6f69;
}
// 在其子元素中使用
.alert p {
color: var(--alert-color);
border: 1px solid var(--alert-color);
}
上述定义的 alert-color
在应用中的其他部分就无法使用。对于需要进行计算的属性值,同样可以联合使用
.margin {
--space: calc(20px * 2);
font-size: var(--space); /*equals 40px*/
}
另一方面,
:root {
--main-font-size: 16px;
}
media all and (max-width: 600px) {
:root {
--main-font-size: 12px;
}
}
<!--HTML-->
<html style="--color: red">
<!--CSS-->
body { color: var(--color) }
</html>
同样,我们也可以使用
// 设置变量值
element.style.setProperty("--my-color", "rebeccapurple");
// 获取变量值
element.style.getPropertyValue("--my-color");
// => 'rebeccapurple'
// 移除变量值
element.style.removeProperty("--my-color");
在实际的使用中,我们还需要避免循环依赖的出现。当设置某个变量依赖其本身,或者两个变量互相依赖时,就出现了循环依赖:
/* 引用自身 */
:root {
--m: var(--m);
}
body {
margin: var(--m);
}
/* 相互依赖 */
:root {
--one: calc(var(--two) + 10px);
--two: calc(var(--one) - 10px);
}
典型应用
在这篇文章中也讨论了如何利用
<tr
class="table-row"
style="
--order-by-published: 161221;
--order-by-views: 2431;
"
>
<th class="table-cell">
<a href="http://kizu.ru/en/fun/controlling-the-specificity/"
>Controlling the Specificity</a
>
</th>
<td class="table-cell">2016-12-21</td>
<td class="table-cell">2 431</td>
</tr>
.table-body {
display: flex;
flex-direction: column;
}
.table-row {
order: calc(var(--order) * var(--sort-order, -1));
}
#sort-by-published:checked ~ .table > .table-body > .table-row {
--order: var(--order-by-published);
}
#sort-by-views:checked ~ .table > .table-body > .table-row {
--order: var(--order-by-views);
}
#sort-ascending:checked + .table {
--sort-order: 1;
}
#sort-by-name:checked ~ #sort-ascending:checked + .table > .table-body {
flex-direction: column-reverse;
}