Foros del Web » Creando para Internet » CSS »

[SOLUCIONADO] ¿Cómo lograr animaciones de ida y vuelta con CSS?

Estas en el tema de ¿Cómo lograr animaciones de ida y vuelta con CSS? en el foro de CSS en Foros del Web. Buena noche. Cuando se hace una animación básica en CSS, digamos cuando la ida se ejecuta cuando el elemento a animar tiene el cursor encima, ...
  #1 (permalink)  
Antiguo 08/01/2014, 20:07
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Sonrisa ¿Cómo lograr animaciones de ida y vuelta con CSS?

Buena noche.

Cuando se hace una animación básica en CSS, digamos cuando la ida se ejecuta cuando el elemento a animar tiene el cursor encima, la animación cuenta con tantos frames como se hayan establecido, mas no la vuelta. Ésta regresa de 100% a 0% de una vez.

La pregunta es: ¿Cómo hacer para que el regreso tenga tantos frames como la ida, o sea, que se realice la misma animación en reversa, u otra, cuando se quita el cursor del elemento animado?


Un ejemplo claro de lo que pretendo está aquí: http://www.fertility.com.mx/es/index.html Está en Flash, pero la idea es la misma.


Hasta ahora, llevo lo siguiente, que es la ida. Falta la vuelta:
Código CSS:
Ver original
  1. @-webkit-keyframes animation_1
  2. {
  3.     0% {-webkit-transform:translateX(0px);}
  4.     20% {-webkit-transform:translateX(500px);}
  5.     22% {-webkit-transform:translateX(450px);}
  6.     24% {-webkit-transform:translateX(500px);}
  7.     56% {-webkit-transform:translateX(450px);}
  8.     100% {-webkit-transform:translateX(500px);}
  9. }
  10. .caja {
  11.     position:absolute;
  12.     top:0;
  13.     left:-500px;
  14.     width:600px;
  15.     height:100px;
  16.     background-color:red;
  17. }
  18.  
  19. .caja:hover {
  20.     -webkit-animation-name:animation_1;
  21.     -webkit-animation-duration:500ms;
  22.     -webkit-animation-fill-mode:forwards;
  23.     -webkit-animation-iteration-count:1;
  24.     -webkit-animation-timing-function:linear;
  25. }

Código HTML:
Ver original
  1. <div class="caja">  </div>



Saludos cordiales

Última edición por berkeleyPunk; 08/01/2014 a las 21:09
  #2 (permalink)  
Antiguo 09/01/2014, 05:15
Avatar de g3kdigital  
Fecha de Ingreso: noviembre-2013
Ubicación: En mi apartamento en bogotá
Mensajes: 208
Antigüedad: 10 años, 5 meses
Puntos: 39
Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Hola

Interesante duda la que planteas. Aunque debo reconocer que un ":unhover" sería genial. Lo cierto es que no existe (hasta donde sé) en CSS un seudoselector "mouse-leave" o "mouse-out" o parecidos, esos son terrenos del Javascript o Jquery.

Tampoco sabría si hay alguna forma de lograr la reversa de una animación automaticamente, sin tener que crear otra animación por keyframe con el efecto contrario por lo menos en la especificación actual del css3.

Pero, si se me ocurren diferentes formas de abordar lo que quieres con css.

La forma más rapida que se me ocurrió lo puedes ver aquí:

http://codepen.io/g3kdigital/pen/mEndf

Lo que hice fue que cogí la propiedad transition para que cualquier cambio de propiedades en el css se anime automáticamente.

Coloque la propiedad que animas a la clase y al hover. Aunque bien no logra el efecto por completo, sí llega a verse una transición más leve entre los estados.

  #3 (permalink)  
Antiguo 09/01/2014, 05:45
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 9 meses
Puntos: 2114
Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Puedes usar tal vez animation-direction que tiene un valor reverse, tal vez haciendo una animación en el estado natural y otra cuando se pase el mouse por encima. Pero tal vez tengas algún problema con que no se realice la animación al sacarlo, ya que igual choca ese forwards, y sin eso pues no se mantiene. Haré alguna prueba por la tarde.

Si la animación sólo tuviera "una vuelta" podrías usar cubic-bezier() para timing-function.
  #4 (permalink)  
Antiguo 09/01/2014, 10:19
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Sonrisa Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Cita:
Iniciado por pzin Ver Mensaje
Puedes usar tal vez animation-direction que tiene un valor reverse, tal vez haciendo una animación en el estado natural y otra cuando se pase el mouse por encima...
Maestro pzin, gracias por responder. Igualmente al compañero g3kdigital.

Se me ocurrió hacer un menú animado, como el de aquí http://master.demo.offlajn.com/demo.html#GI_glassymenu (El menú está del lado izquierdo de la página.) La idea es la misma que en este ejemplo, salvo que me parece se vería más agradable si hubiera una animación de rebote cuando llegue al final de la ida y al final de la vuelta.

Ya le estuve moviendo al código y no sale . Aun espero que el maestro pzin haga sus pruebas.

Imaginaba que las animaciones de CSS3 traerían consigo la posibilidad de animar el regreso. Por el momento secundaré la idea de g3kdigital: "esos son terrenos del Javascript o Jquery." Apenas conozco algo de jQuery. Conozco un poco mejor JS. Voy a intentar lo siguiente: hacer 2 animaciones, la de ida y la de vuelta. Y con los listeners tratar de hacer que se ejecute la respectiva animación cuando se pone y quita el cursor del elemento a animar.

Saludos y nos leemos al rato!
::
  #5 (permalink)  
Antiguo 09/01/2014, 14:49
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 9 meses
Puntos: 2114
Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Pues estuve probando con poco éxito.

Si no te importa tener dos animaciones, puedes hacer algo así:



Curiosamente no funciona con la misma animación, que son totalmente iguales, sólo cambia el nombre. Pero al usar la misma parece quedarse estoicamente congelado por forwards.

Estuve probando con reverse y alternate-reverse pero sólo funciona en la misma petición de la animación.

Si fuese un pelín más simple la animación se podría igual hacer algo con transition. Bueno de hecho tal vez se puede así combinando transformaciones con anchos, cubic-bezier() y animation-delay.
  #6 (permalink)  
Antiguo 09/01/2014, 18:49
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Cita:
Iniciado por pzin Ver Mensaje
Pues estuve probando con poco éxito...

¿Poco éxito?

Yo diría que lo hiciste bien, nuevamente, maestro pzin.

Aunque quizá con lo de poco éxito te refieras a ese anti-estético efecto del inicio : cuando se carga la página, inmediatamente se ejecuta la animación llamada reducir, que hace que se meta el div en el costado izquierdo de la pantalla. Uno diría: "pero yo quiero que ese div se anime sólo cuando yo le ponga o le quite el cursor de encima, ¡no tantes!".

De cualquier modo, lo hiciste y eso vale un punto más.

Abrí este post en el foro de CSS con el fin de encontrar solución en CSS, lo sé. Pero dadas las dificultades planteadas por los aquí presentes, me desmoralicé . Así que traté de echarme una mano con un poco de javascript. La cosa resultó bien. Dejo el código aquí, para a quien le interese (voy a postear mi solución con js porque no saben cómo odio -- a esa gente que pide ayuda en los foros y cuando logran solucionar por sí solos, o por otra parte, sus problemas, regresan al foro a postear algo así como: "ya solucioné mi problema, adiós". Y uno se queda con las palabras en la boca: "Sí, %$&()#$, pero dinos cómo le hiciste, que los foros son para eso, para ayudarnos todos, no para que te quedes la información y las respuestas para ti solo!"):


Código CSS:
Ver original
  1. @-webkit-keyframes ida
  2. {
  3.     0%   {-webkit-transform:translateX(0px);}
  4.     25%  {-webkit-transform:translateX(500px);}
  5.     55%  {-webkit-transform:translateX(300px);}
  6.     75%  {-webkit-transform:translateX(500px);}
  7.     90%  {-webkit-transform:translateX(450px);}
  8.     100% {-webkit-transform:translateX(500px);}
  9. }
  10. @-webkit-keyframes vuelta
  11. {
  12.     0%   {-webkit-transform:translateX(500px);}
  13.     25%  {-webkit-transform:translateX(0px);}
  14.     55%  {-webkit-transform:translateX(300px);}
  15.     75%  {-webkit-transform:translateX(0px);}
  16.     90%  {-webkit-transform:translateX(100px);}
  17.     100% {-webkit-transform:translateX(0px);}
  18. }
  19.  
  20. #caja {
  21.     position:relative;
  22.     top:0px;
  23.     left:-600px;
  24.     width:700px;
  25.     height:100px;
  26.     background-color:black;
  27. }


Código Javascript:
Ver original
  1. window.onload = function()
  2.     {
  3.         var caja = document.getElementById("caja");
  4.        
  5.         caja.addEventListener('mouseover',function()
  6.         {
  7.             caja.style.webkitAnimationName = 'ida';
  8.             caja.style.webkitAnimationDuration = '1s';
  9.             caja.style.webkitAnimationFillMode = 'forwards';
  10.             caja.style.webkitAnimationIterationCount = '1';
  11.             caja.style.webkitAnimationTimingFunction = 'ease';
  12.  
  13.         },false)
  14.  
  15.         caja.addEventListener('mouseout',function()
  16.         {
  17.             caja.style.webkitAnimationName = 'vuelta';
  18.             caja.style.webkitAnimationDuration = '1s';
  19.             caja.style.webkitAnimationFillMode = 'forwards';
  20.             caja.style.webkitAnimationIterationCount = '1';
  21.             caja.style.webkitAnimationTimingFunction = 'ease';
  22.  
  23.         },false)
  24.     }


Código HTML:
Ver original
  1. <div id="caja"></div>


Saludos cordiales

Última edición por berkeleyPunk; 09/01/2014 a las 19:59
  #7 (permalink)  
Antiguo 09/01/2014, 20:03
Avatar de g3kdigital  
Fecha de Ingreso: noviembre-2013
Ubicación: En mi apartamento en bogotá
Mensajes: 208
Antigüedad: 10 años, 5 meses
Puntos: 39
De acuerdo Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Excelente.

Lo cierto es que aprendí bastante de este post, la solución PZIN era bastante mas sencilla que la que pensé con transition.

No conocía animation-direction ha sido todo un descubrimiento y excelente BerkeleyPunk, te felicito por haberlo logrado .
  #8 (permalink)  
Antiguo 10/01/2014, 11:10
Avatar de g3kdigital  
Fecha de Ingreso: noviembre-2013
Ubicación: En mi apartamento en bogotá
Mensajes: 208
Antigüedad: 10 años, 5 meses
Puntos: 39
De acuerdo Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Hola nuevamente

Bueno, lo cierto es que aunque ya "concluimos" lo de la animación en reversa, quise probar lo de las curvas bezier que proponía PZIN y al hacerlo encontre una manera de lograr el mismo efecto en concreto hasta en menos lineas de código prescindiendo del @keyframe y sin usar javascript para lograr el ":unhover" de paso.

Código HTML:
Ver original
  1. <div></div>

Código CSS:
Ver original
  1. div
  2. {
  3.   position:relative;
  4.   top:0px;
  5.   left:-600px;
  6.   width:700px;
  7.   height:100px;
  8.   background-color: lightSeaGreen;
  9.   -webkit-transform:translateX(0px);
  10.   transition: all cubic-bezier(0.68, -0.55, 0.265, 1.55) 1s;
  11. }
  12.  
  13. div:hover
  14. {
  15.   -webkit-transform:translateX(500px);
  16. }


Pueden comprobarlo aquí: http://codepen.io/g3kdigital/pen/GAijg


  #9 (permalink)  
Antiguo 10/01/2014, 12:09
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Cita:
Iniciado por g3kdigital Ver Mensaje
...quise probar lo de las curvas bezier que proponía PZIN y al hacerlo [B]encontre una manera de lograr el mismo efecto...

Ah, caray, pues bien. Diste con otra solución al problema de este post. Y sin duda con un código más ligero. Eso vale algo.

Antes ya había googleado un poco para conocer el funcionamiento de cubic-bezier. Y hasta donde entiendo, cubic-bezier es la forma difícil de definir el transition-timing-function por medio de números. La forma fácil es poner ease, ease-in, ease-out, etc. Compañero g3kdigital, puedes ahondar un poco en la explicación de los parámetros que lleva cubic-bezier, para qué sirve cada número que se coloca?


Saludos
  #10 (permalink)  
Antiguo 10/01/2014, 13:34
Avatar de pzin
Moderata 😈
 
Fecha de Ingreso: julio-2002
Ubicación: Islas Canarias
Mensajes: 10.488
Antigüedad: 21 años, 9 meses
Puntos: 2114
Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Si a eso mismo refería con usar cubic-bezier(). Pero no queda totalmente igual, por eso decía lo de "si la animación fuese más simple". De todas formas animando múltiples propiedades y combinándolo con delay se podría llegar a hacer exactamente el mismo efecto.

berkeleyPunk la función crea una Curva de Bézier. La cosa es que al poder poner números negativos, se crea una especie de animación extra —visualmente, ya que matemáticamente no lo es.

Yo suelo usar mucho este sitio para hacerlas menos artesalnamente: http://cubic-bezier.com
  #11 (permalink)  
Antiguo 10/01/2014, 17:28
Avatar de berkeleyPunk  
Fecha de Ingreso: febrero-2013
Ubicación: México :C
Mensajes: 565
Antigüedad: 11 años, 2 meses
Puntos: 22
De acuerdo Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Bueno, pues parece que ahora sí ya se puede dar por cerrado este post.

Buenas tardes y hasta pronto.

Saludos
  #12 (permalink)  
Antiguo 10/01/2014, 17:59
Avatar de g3kdigital  
Fecha de Ingreso: noviembre-2013
Ubicación: En mi apartamento en bogotá
Mensajes: 208
Antigüedad: 10 años, 5 meses
Puntos: 39
De acuerdo Respuesta: ¿Cómo lograr animaciones de ida y vuelta con CSS?

Cita:
Iniciado por pzin Ver Mensaje
berkeleyPunk la función crea una [URL="http://es.wikipedia.org/wiki/Curva_de_B%C3%A9zier"][I]Curva de Bézier[/I][/URL]. La cosa es que al poder poner números negativos, se crea una especie de animación extra —visualmente, ya que matemáticamente no lo es.

Yo suelo usar mucho este sitio para hacerlas menos artesalnamente: [url]http://cubic-bezier.com[/url]
Pues PZIN lo ha resumido bastante, yo tampoco lo había usado hasta que el lo menciono, me puse a investigar y encontré este [URL="http://www.cristalab.com/blog/10-secretos-de-css3-que-tal-vez-no-conocias-c102271l/"]link[/URL]: en el otro usuario recomendó precisamente la misma página que recomendó PZIN creada por Vea Lerou, cuando vi lo de los negativos, simplemente pensé ¿Qué tal y sí? .

El funcionamiento lo entiendo así:

La aceleración y la desaceleración se forman mediante esta curva. Los números equivalen a los coordinadas de los puntos "bezier" en el plano de coordenadas bezier y no de lo puntos de origen , no son del elemento en sí a animar ni del espacio o dimensiones relativas o absolutas al "padre" contenedor del elemento (lo digo, porque esto me confundió al principio).

Siendo la primera coordenada horizontal "x" y la segunda vertical "y". Se podría leer así:

( PI ( X , Y ) , PF ( X , Y ) ) => PI = Punto de Inicio & PF = PuntoFinal

Como curiosidad solo "Y" puede tomar valores negativos, dando como resultado este vistoso efecto.

Y bueno, debí mencionarlo como sí hizo PZIN, solo funciona para animaciones no tan complejas y creo que el el efecto de denomina "bouncing" y que si lo pensamos bien puede resultar bueno como sustituto del efecto flashero en botones o efectos hover: o :focus UI.

Y sí ya se puede dar por terminado el post Feliz día!.

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:43.