Does :before not work on img elements?

后端 未结 12 2237
眼角桃花
眼角桃花 2020-11-22 01:46

I\'m trying to use the :before selector to place an image over another image, but I\'m finding that it simply doesn\'t work to place an image before an im

相关标签:
12条回答
  • 2020-11-22 02:26

    ::after may be used to display the fallback image of an image


    See the example below, first 2 img tags are point to the broken urls. But the second one displays the fallback image instead of the default broken logo from the browser. However, I'm not sure this's any practical, I find it kind of tricky to get it to work right.

    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">

    0 讨论(0)
  • 2020-11-22 02:27

    Here's another solution using a div container for img while using :hover::after to achieve the effect.

    The HTML as follows:

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

    The CSS as follows:

    #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;
    } 
    

    To see it in action, check out the fiddle I've created. Just so you know this is cross browser friendly and there's no need to trick the code with 'fake content'.

    0 讨论(0)
  • 2020-11-22 02:32

    Due to the nature of <img> being a replaced element, document styling doesn’t affected it.

    To reference it anyway, <picture> provides an ideal, native wrapper that can have pseudo-elements attached to it, like so:

    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>

    0 讨论(0)
  • Try ::after on previous element.

    0 讨论(0)
  • 2020-11-22 02:36

    I think the best way to look at why this doesn't work is that :before and :after insert their content before or after the content within the tag you're applying them to. So it works with divs or spans (or most other tags) because you can put content inside them.

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

    However, an img is a self-contained, self-closing tag, and since it has no separate closing tag, you can't put anything inside of it. (That would need to look like <img>Content</img>, but of course that doesn't work.)

    I know this is an old topic, but it pops up first on Google, so hopefully this will help others learn.

    0 讨论(0)
  • 2020-11-22 02:39

    Try this code

    .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
    }
    
    0 讨论(0)
提交回复
热议问题