您当前位置: 主页 / Dog 博客 / 存档

多重 CSS 背景图像

2005年6月7日 星期二 (格林尼治标准时间 8:33 AM)

CSS 最令人沮丧的地方之一就是无法为一个盒子应用多个背景图像。

我目前正在做一个特别需要这个功能的网站。目前,唯一的解决办法是添加大量的 spandiv 标签(或者依赖于更有意义的标签,如果合适的话,但这并不总是可能的)。

情况是这样的。我有一个列表项需要一个特定的小图片。除此之外,我还需要圆角。因为我希望整个元素能够根据内容的大小进行扩展和收缩,所以每个角都需要一个单独的背景图像。

所以 HTML 不可避免地看起来是这样的

<li><span><span><span><span>Booby</span></span></span></span></li>

天哪。

CSS 看起来是这样的

li {
	background: url(booby.jpg) center no-repeat;
}
li span {
	background: url(corner_top_right.gif) top right no-repeat;
	display: block;
}
	li span span {
	background: url(corner_bottom_right.gif) bottom right no-repeat;
}
	li span span span {
	background: url(corner_bottom_left.gif) bottom left  no-repeat;
}
	li span span span span {
	background: url(corner_top_left.gif) top left no-repeat;
	padding: 0.5em;
}

一张漂亮的背景图,以及每角一张图。

CSS 3 提供了多重背景的配置,这将非常棒。如果这能成为一个实际可行的选项就好了。

评论

评论1

不错的文章 - 只是少了一个...

bavel 于 2005年6月7日 星期二 8:38 AM GMT 说道。

评论2

哦,天哪... 应该是“只少了一个 ”...

bavel 于 2005年6月7日 星期二 8:39 AM GMT 说道。

评论3

哇,bavel。你评论得真快!我在将它们发布之前检查条目的速度有点慢。这已经不是我第一次经历一个小小的恐慌“哦,天哪!XML 解析错误!我肯定漏了什么东西!”了。

不过现在都修好了。谢谢。

Patrick 于 2005年6月7日 星期二 8:44 AM GMT 说道。

评论4

在 CSS3 可用之前,你不能使用 JavaScript 函数来插入所有这些 span 或 div 吗?

就像 nifty-corner? http://pro.html.it/esempio/nifty/

SteveC 于 2005年6月7日 星期二 9:31 AM GMT 说道。

评论5

啊。确实是一个可能性。不过有利有弊。代码会更整洁,但如果有人没有启用 JavaScript,他们就看不到你想要的展示效果。

Patrick 于 2005年6月7日 星期二 9:36 AM GMT 说道。

评论6

有很多关于圆角文章。真的有必要为所有角使用 4 种不同的图片吗?我不这么认为。
我想你可能已经看过这些了,但这里面一定有一个有用的:http://css-discuss.incutio.com/?page=RoundedCorners 以及我自己的,当然:http://www.ischagast.nl/knutselhoek/ronde-hoeken/

Ischa Gast 于 2005年6月7日 星期二 9:46 AM GMT 说道。

评论7

是的,在这些情况下,确实需要四种不同的图片。如果整个盒子的高度和宽度都可以不同以适应不同的尺寸,那就没有其他办法了。

Patrick 于 2005年6月7日 星期二 9:57 AM GMT 说道。

评论8

也许我太天真了,但既然这种多重背景图像的东西主要是(如果不是唯一的话)用于角,难道不能创造出其他的东西吗?
我想象的是一个像这样的“corner”值

#mybox {
corner-radius: 8px; }

这对于 CSS 的未来版本来说将非常有用。有人知道这种做法有什么潜在的缺点吗?我想我不是第一个希望有这种东西的人。

Olivier 于 2005年6月7日 星期二 10:24 AM GMT 说道。

评论9

我认为 Mozilla 已经有一些专有的 CSS 属性了。至于 CSS 标准,我不确定。这肯定会很酷。

SVG 可能是一个选项...

Patrick 于 2005年6月7日 星期二 10:31 AM GMT 说道。

评论10

"SVG 可能是一个选项..."

你说的 SVG 是什么意思?

(如果这对某些人来说很明显,请原谅)

Olivier 于 2005年6月7日 星期二 10:54 AM GMT 说道。

评论11

啊。抱歉。“可缩放矢量图形”(Scalable Vector Graphics)。我不是专家。请看 http://www.w3.org/TR/SVG/

Patrick 于 2005年6月7日 星期二 11:00 AM GMT 说道。

评论12

引用
是的,在这些情况下,确实需要四种不同的图片。如果整个盒子的高度和宽度都可以不同以适应不同的尺寸,那就没有其他办法了。

但在我发布的例子中,我只需要一张图片,唯一的问题是这张图片必须非常高和宽。我使用了 Roger Johansson 的例子(使用 2 张图片而不是 4 张),并在那里做了一些修改 http://www.456bereastreet.com/lab/teaser/flexible/

这不就是你想要的例子吗?

Ischa Gast 于 2005年6月7日 星期二 1:05 PM GMT 说道。

评论13

你可以将左上角的圆角作为主背景图像的一部分,这样你只需要 3 个额外的 span,而不是 4 个... 这仍然不是理想的,但它使用的无意义标签更少...

keith - SuPeR K! 于 2005年6月7日 星期二 1:07 PM GMT 说道。

评论14

Ischa - 哦,是的!抱歉,我没有仔细看。很巧妙。当然,你需要一个相当大的图片,而且你仍然受限于所有的 HTML 结构。

Keith - 那是假设你不需要那个盒子用于其他目的,就像这个例子一样!

Patrick 于 2005年6月7日 星期二 1:09 PM GMT 说道。

评论15

-moz-border-radius 是这个属性。SVG 在这里不是一个真正的选择。它需要完全相同的东西。

Anne 于 2005年6月7日 星期二 1:29 PM GMT 说道。

评论16

当 CSS3 变得可行时,圆角的背景将不再是必需的,因为边框(包括圆角)将拥有自己的模块。
http://www.w3.org/TR/css3-border

Richard Rutter 于 2005年6月7日 星期二 3:25 PM GMT 说道。

评论17

我通过使用 :before 和 :after 伪类以及一个 expression 技巧将它简化到了 2 个 span,使其能在 IE 中工作... 代码有点混乱,但只有 2 个 span... 在 ie6/win、firefox 和 opera 中测试过...

// html
<li><span><span>Booby</span></span></li>


// css
li {
background: url(booby.jpg) center no-repeat;
display: block;
list-style: none;
margin: 0;
padding: 0;
}
li span {
background: url(corner_bottom_left.gif) bottom left no-repeat;
display: block;
}
li span span {
background: url(corner_bottom_right.gif) bottom right no-repeat;
padding: 0.5em;
}
li:before {
content: url(corner_top_left.gif);
display: block;
height: 15px;
width: 15px;
}
li span:before {
content: url(corner_top_right.gif);
display: block;
height: 15px;
padding-left: 100%;
margin: -15px 0 -15px -15px;
width: 15px;
}
li span span:before {
display: none;
}
* html li {
font-size: expression(this.runtimeStyle.fontSize="1em", this.innerHTML=''+this.innerHTML+'');
}
* html li span span {
padding: 0;
}
* html li span span span {
background: url(corner_top_left.gif) top left no-repeat;
}
* html li span span span span {
background: url(corner_top_right.gif) top right no-repeat;
padding: 0.5em;
}

keith - SuPeR K! 于 2005年6月7日 星期二 3:27 PM GMT 说道。

评论18

关于 CSS 的“corner”属性——是的,我大约一年前读过一个关于 CSS3 提案的,我想它本该实现的,尽管我还没检查——据我回忆,它允许你使用完整的或简写的(类似于 border shorthand)代码来为元素的四个角指定图像。你也可以只使用一个角的图片,CSS 会处理它的旋转以适应其他角。我希望浏览器制造商能快点行动起来 :p

Jon B 于 2005年6月7日 星期二 7:38 PM GMT 说道。

评论19

这里应该是 css3-background,而不是 css3-border。css3-border 已经被该文档废弃了...

Anne 于 2005年6月7日 星期二 9:58 PM GMT 说道。

评论20

使用一点 PHP 似乎有一个简单的解决方案。效果是随机背景,我不确定这是否是你想要的效果。请看 http://sonspring.com/index.php?id=77 获取更多详情。该技术扩展了 Automatic Labs 此前的一项技术。

Joan M. Mas 于 2005年6月7日 星期二 10:46 PM GMT 说道。

评论21

我认为 Mozilla 已经有一些专有的 CSS 属性了。至于 CSS 标准,我不确定。这肯定会很酷。

Patrick,试试这个。背景图像/颜色可能会泄露,使它们重新变回方形,值得测试。

至于 CSS3,这是 border-image 的最新工作草案,如果我们能拥有所有那些功能就好了...

与此同时,你也可以试试 Dean 的那个非常酷的 IE7。这是圆角演示。

Tom 于 2005年6月7日 星期二 11:42 PM GMT 说道。

评论22

好的,看来我不应该发布 HTML。这是上面帖子遗漏的链接

Moz: http://www.xulplanet.com/references/elemref/ref_StyleProperties.html

CSS3: http://www.w3.org/TR/2005/WD-css3-background-20050216/#the-border-image

IE7: http://dean.edwards.name/IE7/
IE7,前后对比测试:http://dean.edwards.name/IE7/compatibility/content.html

Tom 于 2005年6月7日 星期二 11:45 PM GMT 说道。

评论23

“不要使用 HTML。使用‘&lt;’来显示‘<’字符。” ;)

Patrick 于 2005年6月7日 星期二 11:52 PM GMT 说道。

评论24

Patrick:是的,我的技术(现已更新为支持带 alpha 透明度的 PNG 图像,并使用非侵入性 JavaScript 插入多余的元素:http://www.456bereastreet.com/archive/200505/transparent_custom_corners_and_borders/))使用的图像在计算像素时很大,但这并不一定意味着文件大小会很大。事实上,与下载多个小图片相比,总带宽实际上可以减少。而且服务器请求也更少。不过多余的 HTML 仍然存在。

Roger Johansson 于 2005年6月13日 星期一 2:26 PM GMT 说道。

评论25

无法为一个块级元素应用多个背景图像确实是一个令人沮丧的问题。我认为这是 CSS 中最令人沮丧的事情之一。我迫不及待地等到 CSS3 成为标准,但我担心那将是一个漫长的过程。

RMM 于 2005年7月12日 星期二 10:39 PM GMT 说道。

评论26

用一张图片处理所有角的粗糙方法*...

基于 Roger 的,我想

http://www.elogicom.com/curvy.htmlhttp://www.elogicom.com/c/sp/

* IE 在某个地方的颜色显示不对

Chris Neale 于 2005年9月28日 星期三 10:08 AM GMT 说道。

评论27

第二个链接有两种方法... 单张图片角的变体用于两页中的同一张图片。

Chris Neale 于 2005年9月28日 星期三 10:11 AM GMT 说道。

评论28

试过了,现在可以用了 ;-) 谢谢

Conner 于 2005年10月2日 星期日 2:04 AM GMT 说道。

评论29

Mozilla 的方式就像 CSS3 一样不受支持。
可以这样做。

<div id="box">
<img src="top.jpg" width=100%>
bla bla bla
<img src="bottom.jpg" width=100%>
</div>

这使得当盒子变大时,圆角半径变得更圆。

这是 Firefox 的方法。
http://sitemeterreview.blogspot.com/

哎呀,在其他浏览器里很难看。:(

gaby de wilde 于 2005年10月8日 星期六 10:32 AM GMT 说道。

评论30

嗯... 好技巧。我会试试的。有趣的是在 Opera 浏览器里看起来怎么样。

Roman 于 2005年11月18日 星期五 9:54 AM GMT 说道。

评论31

...这是一种非常混乱的技术。为什么不直接

[ul]
[li] [a href="#"] 链接 1 [/a] [/li]
[li] [a href="#"] 链接 2 [/a] [/li]
[li] [a href="#"] 链接 2 [/a] [/li]
[/ul]

以及 CSS

div { background: url(...) top left no-repeat; }
div ul { background: url(...) top right no-repeat; }
div ul li {background: url(...) bottom left no-repeat; }
div ul li a {background: url(...) bottom right no-repeat; }

更简洁,更简单;尽情享受 :)

Boris Cherny 于 2005年11月25日 星期五 6:25 AM GMT 说道。

评论32

呃,因为那行不通。你会在列表和每个列表项上得到两个角。这个例子是为每个(非链接)列表项的四个图像准备的。

Patrick 于 2005年11月25日 星期五 3:48 PM GMT 说道。

评论33

不幸的是,这两种方法都不能让我满意(至少对我个人而言)。用不必要的 HTML 标签来充斥会破坏 HTML/HTML/XHTML 文档的逻辑结构。有时我会牺牲图形来使文档的标签结构更具逻辑性。

Cowboy Marlboro 于 2005年12月2日 星期五 12:13 PM GMT 说道。

另请参阅

SiteGround: Fast, reliable, recommended hosting.