: img 요소에서 작동하지 않습니까?


262

: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요소 의 이미지 위에 이미지를 올바르게 오버레이 하지만 오버레이 클래스를 img자체에 적용하면 작동하지 않습니다.

추가 작업이 span저를 화나게 하기 때문에이 작업을하고 싶습니다 . 그러나 더 중요한 것은 수정하고 싶은 블로그 게시물이 100 개 정도 있는데, 스타일 시트 만 수정하면 한 번에이 작업을 수행 할 수 있습니다. 난 다시 가서 여분의 추가해야하지만 만약 span사이에서 요소 aimg요소, 이것은 더 많은 작업을 할 것이다.


5
이것은 CSS 표준 자체가 IMG 요소와 함께 : before를 사용하는 예제를 제공하기 때문에 이상합니다.


@chharvey : 그 질문은이 질문 이후에 요청되었습니다.
Joshua Frank

답변:


262

불행히도, 대부분의 브라우저는 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의 답변을 확인하십시오 .


3
당신의 바이올린이 없습니다. 이것이 jsFiddle 링크의 아름다움입니다.
Roko C. Buljan

고쳤다. 미안합니다.
cwharris 2016

1
이 답변은 왜 img가 이전이나 이후에 가질 수 없는지 설명하지 않습니다. 또한 제안 된 자바 스크립트 솔루션은이를 대체하는 것이 아닙니다.
재스퍼 케니스

3
제안 된 솔루션이 모든 시나리오에서 작동하는 것은 아닙니다. 문제를 우회하는 방법에 대한 예일뿐입니다. 보다 일반적인 해결책을 제안하려면 자유롭게 답변을 게시하십시오.
cwharris

141

이전 및 이후 의사 선택기는 HTML 요소를 삽입하지 않습니다. 대상 요소의 기존 내용 앞이나 뒤에 텍스트를 삽입합니다. 이미지 요소는 텍스트를 포함하지 않거나 후손을 가지고 있기 때문에, img:before또는 img:after당신에게 유익하지 않습니다. 이것도 같은 요소에 대한 경우 <br><hr>동일한 이유로.


Img 태그는 분명히 그 자체로 요소이지만, : before 및 : after psuedo-selectors를 사용하여 다른 요소 앞뒤에 삽입 할 수 있습니다. 이것은 CSS 사양에 있지 않습니까?
cwharris

13
조금 다릅니다. 이미지를 삽입 할 수 있지만 이미지 태그는 사용하지 않고 이미지를 삽입 할 수 있습니다 content: url(/img/foo.jpg);. 구문 을 사용해야 합니다. 자세한 내용은 w3.org/TR/CSS21/generate.html 을 참조 하십시오.
coreyward

4
작은 수정 : 텍스트 요소보다 요소와 유사한 유사 요소를 삽입합니다.
Chris Calo

생성 된 컨텐츠는 Shadow DOM의 일부가됩니다. 이러한 새로운 요소, 속성 및 텍스트 노드는 매우 실제적입니다. 예를 들어 Chrome 검사기에서 볼 수 있습니다.
Marc Diethelm

@coreyward 아마도 당신은 MDN (Replaced Element)을
Marc Diethelm

41

순수한 CSS 에서이 작업을 수행하는 방법을 찾았습니다.

그냥 가짜 내용 해요 -method

img : after를 활성화하는 순수한 CSS 메소드

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

브라우저 지원

✓ Chrome 10 이상

✓ Firefox 11 이상

✓ 오페라 9.8+

✓ 사파리

지원 없음

Explorer Internet Explorer 8/9

다른 브라우저에서 테스트하십시오


1
따라서 기본적으로 img 태그 스타일과 : before 및 : after 작업을 시작하기 전에 content : ""를 추가하면됩니다. 좋은 발견, 크로스 브라우저가 얼마나 궁금합니다.
w00t

2
아이콘 테스트 jsbin.com/esewow/edit#html,live를 설정했는데 IE8에서는 작동하지 않지만 Chrome 및 Safari에서는 제대로 작동하는지 확인할 수 있습니다.
w00t

14
CodePen 예제는 img 태그의 src가 유효하지 않은 경우에만 Firefox에서 작동합니다. 그러면 alt 속성이 실제로 : before 및 : after를 허용하는 요소로 렌더링됩니다. img src가 존재하면 작동을 멈 춥니 다 : codepen.io/anon/pen/EjtDu
thenickdude

2
내가 틀렸다면 멈춰도 더 이상 Chrome 46에서 작동하지 않는 것 같습니다
Fox

5
img : before 및 img : after는 Safari에서 전혀 작동하지 않습니다 . 이것조차도 처음에는 흥분했습니다. 그래도 좋은 시도.
Wray Bowling

9

때문에의 성격에 <img>있는 Being 대체 요소 , 문서의 스타일은 영향을받지 않습니다.

어쨌든 그것을 참조하기 위해 <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>


3

다음 :hover::after은 효과를 달성하기 위해 img에 div 컨테이너를 사용하는 또 다른 솔루션 입니다.

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

실제로 작동하는지 확인하려면 내가 만든 바이올린을 확인하십시오 . 크로스 브라우저 친화적이므로 '가짜 콘텐츠'로 코드를 속일 필요가 없습니다.


에 적용 display: inline-block하면 도움이됩니다 #img_container. 그러면 컨테이너의 너비가 모든 화면 크기의 이미지와 같아집니다. 따라서 :after이미지 외부에 내용이 떠 다니지 않습니다 .
Anonymous

1

왜 이것이 작동하지 않는지를 보는 가장 좋은 방법은 적용하기 전에 태그 내에서 내용 전후에 내용을 삽입하는 것입니다. 따라서 내용을 넣을 수 있기 때문에 div 또는 span (또는 대부분의 다른 태그)에서 작동합니다.

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

그러나 img는 자체 포함 된 자체 닫기 태그이며 별도의 닫기 태그가 없으므로 태그 안에 아무 것도 넣을 수 없습니다. (이것은처럼 <img>Content</img>보이지만 물론 작동하지 않습니다.)

나는 이것이 오래된 주제라는 것을 알고 있지만 Google에서 먼저 나타나므로 다른 사람들이 배우는 데 도움이되기를 바랍니다.


1

이것은 나를 위해 작동합니다 :

html

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

CSS

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


1

::after 이미지대체 이미지표시 하는 데 사용될 있습니다.


아래 예를 참조하십시오. 처음 2 개의 img태그는 깨진 URL을 가리 킵니다. 그러나 두 번째 이미지는 브라우저에서 기본 깨진 로고 대신 대체 이미지를 표시합니다. 그러나 이것이 실제로 실용적이지 않다는 것을 잘 모르겠습니다. 제대로 작동하려면 까다로운 일입니다.

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

이 코드를 사용해보십시오

.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
}

-1

나는 그것을 시도하는 더 간단한 방법을 찾았습니다. HTML은 다음과 같습니다.

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

내가 <p>한 것은 이미지 태그 뒤에 빈 태그를 배치하는 것 입니다. 이제 p ::를 사용하여 이미지를 표시하고 필요에 따라 이미지를 배치합니다. 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');
}

시도 해봐.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.