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

时间:2011-04-30 16:14:47

标签: html css

我正在尝试使用: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>

我可以使用divp元素代替span,并且浏览器会正确地将我的图片覆盖在img元素中的图片上,但如果我将覆盖类应用于img本身,它不起作用。

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

13 个答案:

答案 0 :(得分:241)

很遗憾,大多数浏览器都不支持在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's answer

答案 1 :(得分:128)

前后伪选择器不插入HTML元素 - 它们在目标元素的现有内容之前或之后插入文本。由于图片元素不包含文字或有后代,因此img:beforeimg:after对您都没有好处。出于同样的原因,<br><hr>等元素也是如此。

答案 2 :(得分:41)

我找到了一种方法,可以在纯css中完成这项工作:

我只是假内容 -method

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

您可以查看 CodePen: I'm just fake content 或查看来源

来源&amp;段

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);
}
<img
    alt="You are watching the ~ I'm just fake content ~ method"  
/>

浏览器支持

✓Chrome10 +

✓Firefox11 +

✓Opera9.8 +

✓Safari

不支持

⊗InternetExplorer 8/9

请在其他浏览器中测试

答案 3 :(得分:3)

这是另一个使用div容器进行img同时使用: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;
} 

要查看它的实际效果,请查看我创建的fiddle。只是因为你知道这是跨浏览器友好的,并且没有必要用'假内容'欺骗代码。

答案 4 :(得分:1)

这个对我有用:

html

<ul>
    <li> name here </li>
</ul>

CSS

ul li::before {
    content: url(../images/check.png);
}

答案 5 :(得分:1)

由于<img>replaced element的性质,文档样式不会对其产生影响。

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

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

<picture>
    <img src="//placekitten.com/110/80">
</picture>

答案 6 :(得分:1)

::after 可以用于显示图像的后备图像


请参见下面的示例,前2个img标记指向断开的网址。但是第二个显示的是备用图片,而不是浏览器中默认的损坏徽标。但是,我不确定这是否可行,我觉得要使其正常工作有点棘手。

img {
  position: relative;
  display: inline-block;
  width: 300px;
  height: 200px;
  vertical-align: top;
}
img:not(:first-child)::after {
  position: absolute;
  left: 0; top: 0; right: 0; bottom: 0;
  content: "<" attr(alt) "> NOT FOUND";
  border: 1px dashed #999;
  background: url(https://cdn.dribbble.com/users/1012566/screenshots/4187820/topic-2.jpg) center/100%;
}
<img src="https://source.unsplash.com/random/100/75" alt="logo">
<img src="https://source.unsplash.com/random/100/75" alt="logo">
<img src="https://source.unsplash.com/random/100x75" alt="logo">

答案 7 :(得分:0)

我认为,查看为什么这不起作用的最佳方式是:在标记之前或之后插入其内容之前和之后,将其应用到标记中。所以它适用于div或spans(或大多数其他标签),因为你可以将内容放在其中。

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

但是,img是一个独立的自动关闭标签,由于它没有单独的结束标签,因此您无法在其中放置任何内容。 (那需要看起来像<img>Content</img>,但当然这不起作用。)

我知道这是一个古老的主题,但它首先出现在Google上,所以希望这会有助于其他人学习。

答案 8 :(得分:0)

在上一个元素上尝试 :: after

答案 9 :(得分:0)

:: before和:: after生成的伪元素包含在元素的格式框中,因此不适用于替换的元素(例如img)或br元素。

https://developer.mozilla.org/en-US/docs/Web/CSS/::after

答案 10 :(得分:0)

尝试此代码

.button:after {
    content: ""
    position: absolute
    width: 70px
    background-image: url('../../images/frontapp/mid-icon.svg')
    display: inline-block
    background-size: contain
    background-repeat: no-repeat
    right: 0
    bottom: 0
}

答案 11 :(得分:0)

只要给图像“位置:相对”就行了

答案 12 :(得分:-1)

我试过并找到了一种更简单的方法。这是HTML:

    <img id="message_icon" src="messages2.png">
    <p id="empty_para"></p>

我所做的是在我的图片标记后面放置一个空<p>标记。现在我将使用p :: before来显示图像并根据我的需要定位它。这是CSS:

#empty_para
{
    display:inline;
    font-size:40;
    background:orange;
    border:2px solid red;
    position:relative;
    top:-400px;
    left:100px;
}
#empty_para::before
{
    content: url('messages.png');
}

试试吧。