我试图使用:before选择器将图像放在另一个图像上,但我发现它根本不能将图像放在img元素之前,只有一些其他元素。具体来说,我的风格是:

.container
{
   position: relative;
   display: block;
}

.overlay:before
{
    content: url(images/[someimage].png);
    position: absolute;
    left:-20px;
    top: -20px;
}

我发现这很有效:

<a href="[url]" class="container">
  <span class="overlay"/>
  <img width="200" src="[url]"/>
</a>

但这不是:

<a href="[url]" class="container">
  <img width="200" src="[url]" class="overlay"/>
</a>

我可以使用div或p元素来代替这个span,浏览器会正确地将我的图像覆盖到img元素中的图像上,但如果我将overlay类应用到img本身,它就不起作用了。

我想让它工作,因为这个额外的span冒犯了我,但更重要的是,我有大约100篇博客文章,我想修改,如果我可以修改样式表,我可以一次完成这一点,但如果我必须返回并在a和img元素之间添加一个额外的span元素,这将是更多的工作。


当前回答

before和after伪选择器不插入HTML元素——它们在目标元素的现有内容之前或之后插入文本。因为图像元素不包含文本,也没有后代,所以img:before或img:after都不会对您有任何好处。对于<br>和<hr>这样的元素也是如此,原因相同。

其他回答

不幸的是,大多数浏览器不支持在img标记上使用:after或:before。

http://lildude.co.uk/after-css-property-for-img-tag

然而,你可以用JavaScript/jQuery来完成你所需要的。看看这把小提琴:

http://jsfiddle.net/xixonia/ahnGT/

$(function() {

    $('.target').after('<img src="..." />');

});

编辑:

对于不支持的原因,请查看coreyward的答案。

before和after伪选择器不插入HTML元素——它们在目标元素的现有内容之前或之后插入文本。因为图像元素不包含文本,也没有后代,所以img:before或img:after都不会对您有任何好处。对于<br>和<hr>这样的元素也是如此,原因相同。

下面是另一个img使用div容器的解决方案,同时使用:hover::after来达到效果。

HTML如下:

<div id=img_container><img src='' style='height:300px; width:300px;'></img></div>

CSS如下:

#img_container { 
    margin:0; 
    position:relative; 
} 

#img_container:hover::after { 
    content:''; 
    display:block; 
    position:absolute; 
    width:300px; 
    height:300px; 
    background:url(''); 
    z-index:1; 
    top:0;
} 

要查看它的操作,请检查我创建的小提琴。只是为了让你知道这是跨浏览器友好的,没有必要用“假内容”欺骗代码。

由于<img>是一个替换的元素,文档样式化不会影响它。

为了引用它,<picture>提供了一个理想的本机包装器,可以将伪元素附加到它上面,如下所示:

img:之后, {后图片: 内容:“\ 1 f63b”; 字体大小:大; 保证金:1 em; } < img src = " / / placekitten.com/110/80 " > <图片> < img src = " / / placekitten.com/110/80 " > < /图片>

我认为了解为什么这行不通的最好方法是:before和:after将它们的内容插入到你应用它们的标签内的内容之前或之后。所以它适用于div或span(或大多数其他标签),因为您可以在其中放置内容。

<div>
:before
Content
:after
</div>

但是,img是一个自包含、自结束标记,由于它没有单独的结束标记,所以不能在其中放入任何东西。(这需要看起来像<img>Content</img>,但当然这是行不通的。)

我知道这是一个老话题,但它首先出现在谷歌上,所以希望这能帮助其他人学习。