CSS 自定义属性的一件很酷的事情是它们可以成为一个值的部分。假设您正在使用 多个背景 来实现设计。每个背景将有自己的颜色、图像、重复、位置等。这可能很冗长!
您有四张图片
body {
background-position:
top 10px left 10px,
top 10px right 10px,
bottom 10px right 10px,
bottom 10px left 10px;
background-repeat: no-repeat;
background-image:
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-left.svg),
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-right.svg),
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-right.svg),
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-left.svg);
}
您想在媒体查询中添加第五张
@media (min-width: 1500px) {
body {
/* REPEAT all existing backgrounds, then add a fifth. */
}
}
这将非常冗长!您将不得不再次重复这四张图片中的每一张,然后添加第五张。这会造成很多重复。
一种可能性是为基本集创建一个变量,然后更简洁地添加第五张
body {
--baseBackgrounds:
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-left.svg),
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-right.svg),
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-right.svg),
url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-left.svg);
background-position:
top 10px left 10px,
top 10px right 10px,
bottom 10px right 10px,
bottom 10px left 10px;
background-repeat: no-repeat;
background-image: var(--baseBackgrounds);
}
@media (min-width: 1500px) {
body {
background-image:
var(--baseBackgrounds),
url(added-fifth-background.svg);
}
}
但是,这完全取决于您。如果您将每个背景图片都变成一个变量,然后根据需要将它们拼凑起来,这可能更有意义,也更容易管理。
body {
--bg1: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-left.svg);
--bg2: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-right.svg);
--bg3: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-right.svg);
--bg4: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-left.svg);
--bg5: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-left.svg);
background-image: var(--bg1), var(--bg2), var(--bg3), var(--bg4);
}
@media (min-width: 1500px) {
body {
background-image: var(--bg1), var(--bg2), var(--bg3), var(--bg4), var(--bg5);
}
}
这是一个基本版本,包括一个支持查询
查看 CodePen 上的示例
使用自定义属性的多个背景,作者:Chris Coyier (@chriscoyier)
在 CodePen 上。
动态更改值的某一部分 是 CSS 自定义属性的一大优势!
还要注意,对于背景,最好将整个简写形式作为变量包含进来。这样一来,将所有内容一次性拼凑在一起就容易得多,而不是需要类似于... 的东西。
--bg_1_url: url();
--bg_1_size: 100px;
--bg_1_repeat: no-repeat;
/* etc. */
将所有属性放到简写形式中,然后根据需要使用它们更容易
body {
--bg_1: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-left.svg) top 10px left 10px / 86px no-repeat;
--bg_2: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-top-right.svg) top 10px right 10px / 86px no-repeat;
--bg_3: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-right.svg) bottom 10px right 10px / 86px no-repeat;
--bg_4: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/angles-bottom-left.svg) bottom 10px left 10px / 86px no-repeat;
background:
var(--bg_1), var(--bg_2),var(--bg_3),var(--bg_4);
}
嗨 Chris,这篇文章很棒,介绍了在 CSS 中管理多个背景的方法。我有一个疑问,在 CSS 中创建变量是否与所有浏览器兼容?
这就是为什么有人创建了 caniuse 网站。
https://caniuse.cn/#feat=css-variables
将其添加到您的工具集中!
干杯。
Alan,收到关于渲染的消息。某些浏览器是否有问题?
bigleegeek
这是一项很棒的技术,可以添加到我的工具集中,并且它提醒我,可以更新自定义属性中值的各个部分。
问题:在示例笔中,使用
@supports
测试多个背景的目的是什么?自定义属性和@supports
本身都比多个背景的浏览器支持更差( https://caniuse.cn/#feat=multibackgrounds ),而多个背景几乎是通用的。不幸的是,IE 不支持 CSS 变量。这几乎完全破坏了使用它们的意义。
从某种意义上说,我同意,如果您的项目必须支持 IE,您就不能真正使用它们。我不喜欢用 polyfill 来填充它们,因为任何可以 polyfill 的东西都会破坏很多意义。
另一方面,仅仅因为您的项目支持旧的 IE,并不意味着我的项目也必须支持,我可以随意使用它们。事实上,我确实在几乎我参与的每个项目中都使用它们。
IE 不支持任何东西,因此我在我的项目中也不支持它。