【问题标题】:Multiple background-images and a background-color多个背景图像和背景颜色
【发布时间】:2011-07-22 14:13:20
【问题描述】:

假设我想在 CSS 中渲染一个箭头,它应该有一个头部、一个尾部和灵活的宽度,以便它可以包含文本。我当然可以创建多个 div 来获得我想要的,但是如何在 CSS3 中完成呢?

我可以使用多个背景图片:

div.arrow{
    background: url('arrowtail.png') left no-repeat, url('arrowhead.png') right no-repeat;
}

html:

<div class="arrow">This text is on a transparent background</div>

这给了我一个带有箭头和尾巴的div,以及一个透明的中间部分。 似乎无法为中间部分指定颜色。

只有一张背景图片,您可以这样做:

div.arrow{ background: red url('some_image.png') no-repeat; }

我知道这在很多方面都是可行的,但是 background-color 属性真的从速记定义中丢失了吗?

【问题讨论】:

    标签: css background-image background-color


    【解决方案1】:

    不,它并没有完全从速记声明中丢失。您仍然可以指定背景颜色,但仅限于最后(中间)层(无论您是否将图像放在那里):

    div.arrow {
        background: url('arrowtail.png') left no-repeat, 
                    url('arrowhead.png') right no-repeat, 
                    red;
    }
    

    请注意,对于您的场景,您的图像可能必须具有完全不透明的背景。背景颜色将显示在图像的任何透明像素下方。

    jsFiddle demo


    但是,单独声明 background-color 可能更适合您的场景,因为它允许您根据相同的背景图像使用不同的颜色(如果您擅长在要填充的图像部分使用透明像素) CSS 背景颜色):

    div.arrow {
        background: url('arrowtail.png') left no-repeat, 
                    url('arrowhead.png') right no-repeat;
    }
    
    /* Assuming your red arrow has this ID */
    #red {
        background-color: red;
    }
    

    jsFiddle demo

    【讨论】:

    • 这很酷。它适用于 IE9,但不适用于 IE9 的“兼容”模式。
    • @Steve Wellens:因为 IE9 兼容模式不使用 IE9 渲染引擎。我不记得是 7 还是 8。
    • 啊,谢谢。问题是不透明的背景图像。当然,background-color 会填充透明区域,让它看起来像是覆盖了 bgs!
    【解决方案2】:

    我发现使用多个背景图像对于这样的事情是有问题的。您是否考虑过使用 :before 和 :after 伪元素?我写了一个简单的例子:

    <style>
        .arrow { display:block; margin:0; padding:0; width:200px; height:45px; line-height:45px; text-align:center; background:#ddd; }
        .arrow:before { float:left; display:block; margin:0; padding:0; width:25px; height:45px; background:#ccc; content:''; }
        .arrow:after { float:right; display:block; margin:0; padding:0; width:25px; height:45px; background:#ccc; content:''; }
    </style>
    
    <div class="arrow">This text is on a transparent background</div>
    

    只需将 :before 和 :after 声明中的背景颜色替换为所需的箭头图像即可。

    【讨论】:

    • 其实我没有想到这个。不错的解决方案!
    • @Frederik:而且在兼容性方面稍微好一点:)
    • 是的,我知道 :) 我只是在搞乱 css3 来测试一些东西。但是,是的,在实际项目中依赖它仍然不受支持。