Hace: antes no funciona en elementos img?


Estoy tratando de usar el selector :before para colocar una imagen sobre otra imagen, pero estoy encontrando que simplemente no funciona colocar una imagen antes de un elemento img, solo algún otro elemento. Específicamente, mis estilos son:

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

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

Y encuentro que esto funciona bien:{[15]]}

<a href="[url]" class="container">
  <span class="overlay"/>
  <img width="200" src="[url]"/>
</a>

Pero esto no:

<a href="[url]" class="container">
  <img width="200" src="[url]" class="overlay"/>
</a>

Puedo usar un elemento div o p en lugar de ese span, y el navegador superpone correctamente mi imagen sobre la imagen en el elemento img, pero si aplico superponer la clase a img en sí, no funciona.

Me gustaría hacer que esto funcione porque ese span extra me ofende, pero lo más importante es que tengo alrededor de 100 entradas de blog que me gustaría modificar, y puedo hacerlo de una sola vez si pudiera modificar la hoja de estilo, pero si tengo que volver y agregar un elemento span extra entre los elementos a y img, esto será mucho más trabajo.

 219
Author: Joshua Frank, 2011-04-30

6 answers

Desafortunadamente, la mayoría de los navegadores no admiten el uso de :after o :before en etiquetas img.

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

Sin embargo, es posible lograr lo que necesita con JavaScript/jQuery. Echa un vistazo a este violín:

Http://jsfiddle.net/xixonia/ahnGT /

$(function() {

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

});

Editar:

Por la razón por la que esto no está soportado, echa un vistazo a la respuesta de coreyward.

 224
Author: cwharris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:25

Los pseudo-selectores antes y después no insertan elementos HTML - insertan texto antes o después del contenido existente del elemento de destino. Debido a que los elementos de imagen no contienen texto o tienen descendientes, ni img:before ni img:after le servirán de nada. Este es también el caso de elementos como <br> y <hr> por la misma razón.

 116
Author: coreyward,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-30 16:36:52

Encontré una manera de hacer que esto funcione en css puro:

El Solo soy contenido falso -método

Un método CSS puro para habilitar img:after.

Usted puede comprobar hacia fuera el CodePen: Solo soy contenido falso o ver la fuente .

Fuente

HTML

<img
    alt="You are watching the ~ I'm just fake content ~ method"  
/>

CSS

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

Soporte del navegador

✓ Cromo 10 +

✓ Firefox 11 +

✓ Opera 9.8 +

✓ Safari

No apoyo

Internet Internet Explorer 8 / 9

Por favor, pruebe en otros navegadores

 39
Author: TimPietrusky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-16 19:47:54

Aquí hay otra solución que usa un contenedor div para img mientras usa :hover::after para lograr el efecto.

El HTML como sigue:

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

El CSS como sigue:

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

Para verlo en acción, echa un vistazo al violín que he creado. Solo para que sepas que esto es compatible con el navegador cruzado y no hay necesidad de engañar al código con 'contenido falso'.

 3
Author: truleighsyd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 13:04:53

Creo que la mejor manera de ver por qué esto no funciona es que :antes y :después inserte su contenido antes o después del contenido dentro de la etiqueta a la que los está aplicando. Así que funciona con divs o spans (o la mayoría de las otras etiquetas) porque puedes poner contenido dentro de ellas.

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

Sin embargo, un img es una etiqueta autónoma de cierre automático, y como no tiene ninguna etiqueta de cierre separada, no puede poner nada dentro de ella. (Eso tendría que verse como <img>Content</img>, pero por supuesto que no trabajo.)

Sé que este es un tema antiguo, pero aparece primero en Google, así que espero que esto ayude a otros a aprender.

 0
Author: BevansDesign,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-17 14:57:15

Intenté y encontré un método más simple para hacerlo. Aquí está el HTML:

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

Lo que hice fue colocar una etiqueta <p> vacía después de mi etiqueta de imagen. Ahora usaré p:: before para mostrar la imagen y colocarla de acuerdo a mis necesidades. Aquí está el 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');
}

Pruébalo.

 -1
Author: Tajveer Singh Nijjar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-24 16:48:26