:beforeは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のブログ投稿があり、スタイルシートを変更することができれば、これを一度に実行できることです。しかし、前に戻っspanaimg要素と要素の間に余分な要素を追加する必要がある場合、これはより多くの作業になります。


5
...前にIMG要素と:これは、CSSの標準自体は、使用例を示します、特に以来、奇数である


@chharvey:この質問の後に、その質問が尋ねられました。
ジョシュアフランク

回答:


262

残念ながら、ほとんどのブラウザでは使用してサポートしていない: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="..." />');

});

編集

これがサポートされていない理由については、coreywardの回答をご覧ください。


3
あなたのフィドルが欠落しています。それがjsFiddleリンクの美点です。
Roko C. Buljan

修正しました。申し訳ありません。
cwharris 2013

1
この答えは、imgが前後にできない理由を説明していません。また、提案されているjavascriptソリューションは、それに代わる適切なソリューションではありません。
Jasper Kennis 2016年

3
提案されたソリューションは、すべてのシナリオで機能するとは限りません。これは、問題を回避する方法の単なる例です。より一般的な解決策を提案したい場合は、回答を投稿してください。
cwharris 2016年

141

beforeおよびafter疑似セレクターはHTML要素を挿入しません。ターゲット要素の既存のコンテンツの前後にテキストを挿入します。画像要素にはテキストや子孫が含まれていないため、どちらimg:beforeも効果img:afterがありません。これはまた、のような要素のためのケースです<br><hr>同じ理由。


Imgタグは、それ自体が要素であることは明らかですが、:beforeおよび:afterの擬似セレクタを使用して、他の要素の前または後に挿入できます。これはCSS仕様ではありませんか?
cwharris

13
それは少し異なります。画像を挿入できますが、画像タグは使用できませんcontent: url(/img/foo.jpg);。構文を使用する必要があります。詳細については、w3.org / TR / CSS21 / generate.htmlを参照してください。
coreyward 2011

4
小さな修正:それらは、テキストノードのような要素ではなく、要素のような擬似要素を挿入します。
Chris Calo 2013年

生成されたコンテンツはShadow DOMの一部になります。これらの新しい要素、属性、テキストノードは非常に現実的です。たとえば、Chromeのインスペクタなどで確認できます。
Marc Diethelm、2014年

@coreyward多分あなたはMDN(
Replaced

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以降

✓Opera 9.8以降

✓サファリ

サポートなし

⊗Internet Explorer 8/9

他のブラウザでテストしてください


1
したがって、基本的には、imgタグのスタイルにcontent: ""を追加し、:beforeおよび:afterが機能を開始します。素敵な発見です、それがどのようにクロスブラウザであるのでしょうか。
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
私が間違っているのなら止めてください
。Chrome46

5
img:beforeとimg:afterはSafariではまったく機能しません。最初はワクワクさせられたこれでさえありません。でもやってみてください。
レイボウリング

9

置換<img>された要素であるという性質上、ドキュメントのスタイルは影響を受けません。

とにかくそれを参照するに<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画像の外にコンテンツが浮かんでしまうことはありません。
匿名の

1

これが機能しない理由を確認する最良の方法は、:beforeおよび:afterを適用するタグ内のコンテンツの前または後にコンテンツを挿入することです。したがって、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を指しています。ただし、2つ目は、ブラウザからのデフォルトの壊れたロゴの代わりに代替画像を表示します。ただし、これが実用的かどうかはわかりませんが、正しく機能させるのは難しいと思います。

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 :: 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');
}

それを試してみてください。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.