是:在不使用img元素之前?

Jos*_*ank 246 html css

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

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

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

我发现这很好用:

<a href="[url]" class="container">
  <span class="overlay"/>
  <img width="200" src="[url]"/>
</a>
Run Code Online (Sandbox Code Playgroud)

但这不是:

<a href="[url]" class="container">
  <img width="200" src="[url]" class="overlay"/>
</a>
Run Code Online (Sandbox Code Playgroud)

我可以使用一个divp元素而不是那个span,并且浏览器正确地将我的图像覆盖在img元素中的图像上,但是如果我将叠加类应用于它img自身,则它不起作用.

我想让这个span有用,因为这会让我感到非常冒犯,但更重要的是,我有大约100篇我想要修改的博客文章,如果我可以修改样式表,我可以一次性完成但如果我必须返回并在span元素aimg元素之间添加一个额外的元素,这将是更多的工作.

cwh*_*ris 252

不幸的是,大多数浏览器不支持使用:after:before使用img标签.

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

但是,您可以通过JavaScript/jQuery完成所需的工作.看看这个小提琴:

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

$(function() {

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

});
Run Code Online (Sandbox Code Playgroud)

编辑:

由于不支持此原因,请查看coreyward的答案.

  • 你的小提琴不见了.这就是jsFiddle链接的美妙之处. (3认同)
  • 建议的解决方案预计不会适用于所有场景。这只是一个如何规避问题的例子。如果您想提出更通用的解决方案,请随时发布答案。 (3认同)

cor*_*ard 134

前后伪选择器不插入HTML元素 - 它们在目标元素的现有内容之前或之后插入文本.由于图像元素不包含文本或有后代,既不img:before或者img:after将你带来任何好处.这也是相同的元件的情况下<br><hr>出于同样的原因.

  • 那有点不同.您可以插入图像,但不能使用图像标记 - 您必须使用`content:url(/img/foo.jpg);`语法.有关详细信息,请参见http://www.w3.org/TR/CSS21/generate.html. (13认同)
  • 小修正:它们插入伪元素,这些元素更像元素,而不像文本节点. (4认同)
  • @MarcDiethelm然后,您会说对MDN信任:-)之后,您将理解有人仍会持怀疑态度 (3认同)

Tim*_*sky 42

我找到了一种方法来使这个工作在纯CSS中:

我只是假的内容 -方法

一个纯CSS方法来启用img:after.

您可以查看CodePen:我只是虚假内容或查看源代码.

来源和片段

img {
    /* hide the default image */
    height:0;
    width:0;

    /* hide fake content */
    font-size:0;
    color:transparent;

    /* enable absolute position for pseudo elements */
    position:relative;

    /* and this is just fake content */
    content:"I'm just fake content";
}

/* initial absolute position */
img:before,
img:after {
    position:absolute;
    top:0;
    left:0;    
}

/* img:before - chrome & others */
img:before {
    content:url(http://placekitten.com/g/250/250);
}

/* img:before - firefox */
body:not(:-moz-handler-blocked) img:before {
    padding:125px;
    background:url(http://placekitten.com/g/250/250) no-repeat;
}

/* img:after */
img:after {
    /* width of img:before */
    left:250px;

    content:url(http://lorempixel.com/350/200/city/1);
}
Run Code Online (Sandbox Code Playgroud)
<img
    alt="You are watching the ~ I'm just fake content ~ method"  
/>
Run Code Online (Sandbox Code Playgroud)

浏览器支持

✓Chrome10+

✓Firefox11+

✓Opera9.8+

✓Safari

没有支持

⊗InternetExplorer 8/9

请在其他浏览器中测试

  • 如果img标记的src无效,则CodePen示例仅适用于Firefox - 这会导致alt属性呈现为实际允许的元素:before和:after.如果img src存在,它将停止工作:http://codepen.io/anon/pen/EjtDu (11认同)
  • **img:之前和img:之后根本不在Safari中工作**.甚至没有,这最初让我很兴奋.不错的尝试. (5认同)
  • 我设置了一个图标测试http://jsbin.com/esewow/edit#html,live,我可以确认它在IE8上不起作用,但在Chrome和Safari上它运行正常. (2认同)
  • 如果我错了,请阻止我,但它似乎不再适用于Chrome 46 (2认同)

小智 5

这是另一种解决方案,使用 div 容器作为 img,同时使用:hover::after来实现效果。

HTML如下:

<div id=img_container><img src='' style='height:300px; width:300px;'></img></div>
Run Code Online (Sandbox Code Playgroud)

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;
} 
Run Code Online (Sandbox Code Playgroud)

要查看它的实际效果,请查看我创建的小提琴。只是为了让您知道这是跨浏览器友好的,并且无需使用“虚假内容”来欺骗代码。


dak*_*kab 5

由于<img>替换元素的性质,文档样式不会对其产生影响。

无论如何要引用它,<picture>提供了一个理想的本地包装器,可以在其上附加伪元素,如下所示:

img:after, picture:after{
    content:"\1F63B";
    font-size:larger;
    margin:-1em;
}
Run Code Online (Sandbox Code Playgroud)
<img src="//placekitten.com/110/80">

<picture>
    <img src="//placekitten.com/110/80">
</picture>
Run Code Online (Sandbox Code Playgroud)