多个背景图片是 CSS3 的一个很酷的功能。 语法很简单,只需用逗号分隔它们即可。 我发现使用background
简写属性最简单/最好,这样你就可以声明位置、重复等,并将它们全部组合在一起。 在查看语法时,并不明显的是,当这些图片重叠时,在垂直堆叠顺序中哪个图片位于顶部。 规范在这方面很明确,并且浏览器实现遵循该规范。 第一个位于顶部,然后依次向下。
background:
url(number.png) 600px 10px no-repeat, /* On top, like z-index: 4; */
url(thingy.png) 10px 10px no-repeat, /* like z-index: 3; */
url(Paper-4.png); /* On bottom, like z-index: 1; */
它类似于z-index
,但这不是z-index
,它是一个单一元素的一部分。
我认为这有点令人困惑,因为它与 HTML 的自然工作方式相反。 如果所有元素都具有相同的 z-index(并且以某种方式定位并重叠),则**最后一个**元素将位于顶部,而不是第一个。 不过,这也不是什么大问题,只需要学习一次即可。
需要记住的重要一点是,如果要将其中一个背景用于完全不透明/完全重复的图片,请将其列在最后而不是第一个,否则它将覆盖所有其他图片。
还要记住,虽然多个背景非常棒,但不支持它的浏览器的回退是根本不显示背景,所以要小心。 处理它的最佳方法,一如既往,是 Modernizr。 他们甚至在他们网站的首页上使用它作为演示(为了清晰起见进行了调整)
.multiplebgs body {
/* Use awesome multiple backgrounds here */
}
.no-multiplebgs body {
/* laaaaaame fallback */
}
如今(2019 年 5 月更新),我可能根本不会担心这个问题,因为该功能在浏览器中的支持率非常高。 此外,你也可以像这样在 CSS 中实现它:
@supports (background-image: url(foo.jpg), url(bar.jpg)) {
body { }
}
清晰简单的解释。谢谢。
如果他们允许另一个值来实现类似 z-index 的效果,那将会很有趣。
例如
background: url(number.png) 600px 10px 5 no-repeat
可能……但这可能过于复杂了。 与仅仅更改顺序相比,这样做有什么优势?
使用 JavaScript 切换背景图层? 我能想到的也就只有这个了。
但这又引出了另一个问题。 这如何改变 jQuery 使用 .css() 方式对其进行目标定位?
既然你提到了……我真的很希望在 CSS 中看到一个针对这些背景的简单属性,用于几件事(我知道它们是可能的,但更简单的语法会很棒)。
为了举一个更好的例子,假设一个黑色和灰色格子背景,以及两个纯色块图片。 例如“checker”属性,或者“fade-left: value;”之类的东西,用于渐变图片。
我不知道,但这将会很疯狂。
我认为允许透明度会很酷,并且很有创意。 尝试在顶部使用 rgba 颜色。 不可能。
我听说它即将到来 ;-)
你将能够在“image()”表达式中放置很多东西,尤其是 rgba 颜色; 然后,“image()”表达式可以在任何允许使用图片的地方使用。
不需要使用 Modernizr 进行回退。 在多背景属性之前添加一个标准背景。 现代浏览器将使用最后读取的声明,而旧版浏览器应该忽略它们不理解的声明。
抢先一步!
这种方法的唯一问题是,即使新版浏览器不需要回退,也需要加载回退,从而导致性能下降。 现代浏览器只有在选择器匹配元素时才会加载资源,因此 Modernizr 选择器不匹配新版浏览器,并且不会加载回退图片。
Modernizr 的方法是为开发人员提供一种方法,只通过加载 polyfill 或一些合理的回退来惩罚不符合标准的浏览器。
我完全更喜欢由于重复属性导致的新版浏览器受到的小惩罚,而不是依赖 JavaScript 来实现 CSS 回退。
一些浏览器会下载这个额外的图形,有些则不会。
曾经有一段时间,我尝试使用渐变的混合来制作 Web 2.0 风格的漂亮按钮。 所以我对 WebKit 和 Gecko 使用了 CSS3 渐变。 我需要两个回退。 对于 Opera,我使用了多个背景(png 中的渐变),对于旧版浏览器,我使用了一个背景。
在图片背景的情况下,没有性能下降,因为我使用了创建所需渐变背景的相同图片。 在这种情况下,回退只是减少了图片的数量,因此按钮更简单。
在渐变背景的情况下,Chrome 和 FF 没有下载回退图片(Opera 的图片),但 Safari 下载了 :P。
下载和初始化 JS 脚本(Modernizer)不算是性能下降吗?
我总是对需要 JavaScript 来实现功能感到困扰。 特别是当它仅仅用于降级时。
在我看来,使用旧版浏览器的用户很可能默认禁用了 JS。
酷
关于不支持多个背景的浏览器的回退,没有必要依赖 Modernizr。 你可以通过在同一个声明中简单地声明两个背景属性来创建有效的回退。
示例
…拔枪 ;)
好的,我测试了一下,你们是对的。
http://jsbin.com/egabe5/2/edit
我在 Firefox 2 中测试了它,它不支持多个 BG,它确实获取了第一个声明。 这是一个很棒的方法。 我一直认为第二个会覆盖第一个(因为是相同的属性)并且什么都不显示。 并非如此。
看来 Chris 沉迷于 CSS 的新可能性,以至于忘记了它的基本原理 ;)
非常好..谢谢!!
感谢 Chris 的这篇帖子,我一直不明白为什么悬停时额外的 rgba(255,255,255,.3) 背景不起作用。
啊,伙计,你总是让事情变得比我想象的要容易得多。 谢谢老兄。 你真的帮助我进步了。
在我看来,现有的堆叠顺序实际上更有意义。 鉴于 CSS 的开发是为了将设计与标记分离,因此它遵循“设计师范式”而不是“标记范式”是有道理的。 在这种情况下,它类似于 Photoshop 等图形软件包中的图层,其中“顶部”图层具有优先级/可见性。
感谢你的提示。 我一直都是这样做的
body {
/*...background*/
margin: 0; padding: 0;
}
#border-wrapper {
/*...background*/
margin: 20px; padding: 20px; /*可选*/
}
我最近尝试过的事情是在 HTML 元素上放置一个背景,在 BODY 上放置另一个背景。
Bingo,这非常有效。 我尝试在 HTML 上使用平铺背景,例如,在 BODY 上使用居中的透明 png(类似于 alpha 渐变)。 这种方法似乎在几乎所有浏览器上都完美运行,并且与 dd_belated png 修复程序一起使用。 我想知道是否还有其他人使用过这种方法,如果我错了,请更正我
是否可以在某个地方看到一个示例? 我很难想象它? 不过听起来很酷!
这是一个示例……http://bit.ly/gfNJzF。
请原谅可读性差和客户未经修饰的徽标。 纸质纹理分配给 HTML 标签,覆盖的地图在 BODY 上
Alistair – 你是否知道你的样式声明中包含以下内容?
color: 333px;
是的,当我尝试创建多个背景图像并在其下方添加背景渐变时,堆叠顺序让我感到困惑。有一段时间,我无法弄清楚为什么只有渐变显示出来(它在列表中排在第一位,然后应用其他图像)。
就像你说的,我与之交谈过的每位开发者都觉得这违反直觉,但这只是你需要学习一次的事情;尽管这让我很好奇,为什么编写规范的人会创建这样的顺序。
有趣的是,不仅可以分层图像,还可以分层 CSS 渐变。
我在 IE 8 中遇到了问题。
无法显示
-moz-border-radius
-moz-box-shadow
我希望你知道这些是仅在 Firefox 中有效的供应商特定的 CSS 选择器,因此前缀“moz”代表“Mozilla”。
标准对我来说没有意义。
我会说第一个声明应该在最底层。艺术家不会先画顶层,然后尝试在下面添加图层。
从逻辑上讲,我们倾向于从背景开始,铺设(例如)一张图像,然后可能在顶部放置一个 100% 的 div,其中包含一个半透明的图像,依此类推。
显然,编写规范这部分的人不是设计师或艺术家。或者瓦肯人,就此而言 ;-)
如果有一种方法可以添加第二个背景而无需重复整个属性,那就太好了。
示例
想象通过 CSS 生成卡片,你有一个带有图像和图案的框架。
今天**有没有办法在不使用 js 的情况下**实现这一点?
如果必须对同一个标签使用不同的属性,如何获取 CSS3 多个背景属性?