Animar la propiedad de transición CSS dentro de:after/: before pseudo-clases


¿Es posible animar pseudo-clases CSS?

Digamos que tengo:

#foo:after {
    content: '';
    width: 200px;
    height: 200px;
    background: red;
    display: block;
    -webkit-transition: all 1s ease-in-out;
    -moz-transition: all 1s ease-in-out;
    -o-transition: all 1s ease-in-out;
}

#foo:hover:after {
    width: 250px;
    height: 250px;
}

¿Es esto posible? He estado probando y hasta ahora no puedo encontrar una solución. Estoy tratando de reducir la cantidad de soporte de JavaScript que necesito mediante el uso de Modernizr.

Ya tengo un método JavaScript, así que por favor no hay alternativas de JavaScript.

Demo: http://jsfiddle.net/MxTvw/

Author: jacefarm, 2011-10-18

4 answers

Tu violín funciona para mí en Firefox. Y por lo que sé, y si este artículo está actualizado este es el único navegador que puede animar pseudo-elementos.


EDITAR: A partir de 2016, el enlace al artículo está roto y el error WebKit relevante fue corregido 4 hace años . Sigue leyendo para ver otras respuestas, esta es obsoleta.

 11
Author: Litek,
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
2016-07-06 15:07:48

Google Chrome agregó la corrección del error de webkit a la versión 27.0.1453.110 m

Este error de WebKit fue corregido: http://trac.webkit.org/changeset/138632

ES POSIBLE animar pseudo :before y :after, aquí hay un par de ejemplos para animar los elementos psuedo :before y :after.

Aquí hay una modificación de su ejemplo anterior con algunas ediciones, que lo hacen animar hacia adentro y hacia afuera más suavemente sin la simulación mouseleave / mouseout retraso en hover:

Http://jsfiddle.net/MxTvw/234 /

Intente agregar el selector principal #foo con la pseudo-clase agrupada :hover en su segunda regla de pseudo-clase :hover. También agregue la propiedad transition, y no solo las propiedades prefijadas específicas del proveedor para transition:

#foo:after{
   display: block;
   content: '';
   width: 200px;
   height: 200px;
   background: red;
   -webkit-transition: all .4s ease-in-out;
   -moz-transition: all .4s ease-in-out;
   -o-transition: all .4s ease-in-out;
   transition: all .4s ease-in-out;
} 

#foo,
#foo:hover:after,
#foo:hover:before{
   width: 250px;
   height: 250px;
}

Tenga en cuenta que en el futuro cualquier Pseudo Elemento como :before y :after debe usar la sintaxis de dos puntos ::before y ::after. Este ejemplo simula un fundido de entrada y salida usando una superposición background-color y un background-image al flotar:

Http://jsfiddle.net/MxTvw/233 /

Este ejemplo simula una animación de rotación en hover:

Http://jsfiddle.net/Jm54S/28 /

Por supuesto, avanzando con los estándares css3 podríamos usar ::before y ::after.

Esto funciona en las últimas versiones de Firefox, Chrome, Safari, Opera 18+, IE10, IE11 (IE9 y versiones anteriores no admiten transiciones css3 ni animate.)

 12
Author: Jonathan Marzullo,
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-11-03 17:50:43

No parece funcionarahora, sin embargo, de acuerdo con las especificaciones W3 puede aplicar transiciones a pseudo-elementos. Tal vez en algún momento en el futuro {

 0
Author: Lapple,
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-10-18 15:51:34

Acabo de descubrir que puedes animar: after y: before (:

Ejemplo de código -

  .model-item {
    position: relative;

    &:after {
      content: '';
      position: absolute;
      width: 100%;
      height: 100%;
      top: 0;
      right: 0;
      background: transparent;
      transition: all .3s;
    }
  }

  .opc {
    &:after {
      content: '';
      position: absolute;
      width: 100%;
      height: 100%;
      top: 0;
      right: 0;
      background: rgba(0, 51, 92, .75);
    }
  }

Tengo el div .model-item y yo necesitábamos animar el suyo: after. Así que he añadido otra clase que cambia el fondo y he añadido el código de transición a la principal: después (antes de la animación)

 -2
Author: Netanel Perez,
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-01-30 13:34:42