将背景图片放在包含 div 边框之外

23

我正在尝试将背景图像设置在实际包含div的外部。

<div class="expandable">Show Details</div>

.expandable
{
    background: transparent url('./images/expand.gif') no-repeat -20px 0px;
}

因此,“展开”图像基本上应出现在 div 左侧。

我无法使其正常工作,当图像位于容器边界之外时,它不会显示。我不确定是否有 CSS 技巧我遗漏了,或者这与我的页面布局有关(“可展开” div 嵌套在其他几个 div 中)。

这种做法是否可行? 有什么提示吗?

编辑:这是一个 jsFiddle,展示了问题:链接

4个回答

40

我知道这是一个旧帖子,但我只是想更新一下并补充说,使用CSS伪元素是可以实现的。

.class:before {
    content: "";
    display: inline-block;
    width: {width of background img};
    height: {height of background img};
    background-image: url("/path/to/img.png");
    background-repeat: no-repeat;
    position: relative;
    left: -5px; //adjust your positioning as necessary
}

18

您需要将背景图像放在一个单独的元素内。背景图像位置不能将其放置在应用它们的元素之外。

编辑您的问题唤起了我的记忆,我去查看了CSS规范。实际上有一个"background-attachment" CSS属性,可以将背景锚定到视口而不是元素。然而,在IE浏览器中存在错误或无法正常工作,这就是为什么我将其放在了我的“不要使用”列表中的原因 :-)

编辑 - 请注意,此答案来自2010年,2016年存在更新且更广泛支持的CSS功能。


那太糟糕了!好吧,看来 jQuery 又要来拯救我了 :) - fearofawhackplanet
“background-attachment” 这个东西本来就很奇怪,使用它可能比使用伴随元素更麻烦。我怀疑你无法仅通过 CSS 让 “background-attachment” 生效,因为当你使用它时,定位值是参考窗口而不是元素的。因此,你需要计算这些坐标应该是什么,这似乎很麻烦。 - Pointy

13

你不能按照你想要的方式来做这件事情,但是有一个相当简单的解决方案。你可以在.expandable内部再放置另一个

,例如:

<div class="expandable">Show Details<div class="expandable-image"></div></div>

那么你的CSS将会是这样的:

.expandable{ position:relative; }
.expandable-image{ 
    position:absolute; top:0px; left:-20px;
    width:<width>px; height:<height>px;
    background: url('./images/expand.gif') no-repeat;
}

5
根据您的情况,您可能可以使用CSS3的border-image-* rules来解决问题。例如,我在yii的CGridView小部件的筛选行中有效地使用它们来放置“虚拟搜索按钮”(单击筛选器输入框之外的任何位置都将触发ajax调用,但这些“按钮”为用户提供了直观的操作)。我不想通过子类化CGridColumn小部件来hack它的renderFilterCell()方法来实现它-我需要一个纯CSS解决方案。
  .myclass .grid-view .items {
    border-collapse: separate ;
  }

  .myclass .grid-view .filters td + td {
    border-image-source: url("/path/to/my/img_32x32.png");
    border-image-slice: 0 0 0 100%;
    border-image-width: 0 0 0 32;
    border-image-outset: 0 0 0 40px;
    border-width: 1px;
  }

  .myclass .grid-view .filters input {
    width: 80%;
  }

在border-image-width值中有一个�技巧——32是��为border-width(�1px)的乘数,而�是长度(��加上px)。结�是在网格视图的�n-1列中出�了伪按钮。在我的情况下,我�需�最�一列中的任何内容,因为它是一个CButtonsColumn,没有筛选框。无论如何,我希望这对寻找纯CSS解决方案的人有所帮助😀:-D。
* 写完这篇文章��久,我��我�以将代���到用��造CGridColumn的数组的“filter��性中的图�中,因此我的�由�得无�义了。此外,在Firefox中似�存在一个问题,�强制border-image-repeat被拉伸,�使指定了空间也是如此。尽管如此,也许这对�些人会有用😕:-\。

这太棒了,非常感谢您的分享!我正在编写一个Firefox插件,所以我已经让它在Firefox中按照我需要的方式工作了,效果很好!谢谢! - Noitidart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接