stop start running play paused pause initial and javascript animation css3 resume

javascript - running - start animation css



¿Cómo pausar y reanudar la animación de CSS3 usando JavaScript? (5)

Aquí hay una solución que usa javascript:

var imgs = document.querySelectorAll(''.pic''); for (var i = 0; i < imgs.length; i++) { imgs[i].onclick = toggleAnimation; imgs[i].style.webkitAnimationPlayState = ''running''; } function toggleAnimation() { var style; for (var i = 0; i < imgs.length; i++) { style = imgs[i].style; if (style.webkitAnimationPlayState === ''running'') { style.webkitAnimationPlayState = ''paused''; document.body.className = ''paused''; } else { style.webkitAnimationPlayState = ''running''; document.body.className = ''''; } } }

.pic { position: absolute; opacity: 0; } #pic1 { -webkit-animation: pic1 4s infinite linear; } #pic2 { -webkit-animation: pic2 4s infinite linear; } @-webkit-keyframes pic1 { 0% { opacity: 0; } 5% { opacity: 1; } 45% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 0; } } @-webkit-keyframes pic2 { 0% { opacity: 0; } 50% { opacity: 0; } 55% { opacity: 1; } 95% { opacity: 1; } 100% { opacity: 0; } } .paused { background-color: #ddd; }

<img id="pic1" class="pic" src="http://placehold.it/200x200/ff0000/ffffff"> <img id="pic2" class="pic" src="http://placehold.it/200x200/ff00ff/ffffff">

Solución jQuery (más corta y más legible):

var imgs = $(''.pic''), playState = ''-webkit-animation-play-state''; imgs.click(function() { imgs.css(playState, function(i, v) { return v === ''paused'' ? ''running'' : ''paused''; }); $(''body'').toggleClass(''paused'', $(this).css(playState) === ''paused''); });

.pic { position: absolute; opacity: 0; } #pic1 { -webkit-animation: pic1 4s infinite linear; } #pic2 { -webkit-animation: pic2 4s infinite linear; } @-webkit-keyframes pic1 { 0% { opacity: 0; } 5% { opacity: 1; } 45% { opacity: 1; } 50% { opacity: 0; } 100% { opacity: 0; } } @-webkit-keyframes pic2 { 0% { opacity: 0; } 50% { opacity: 0; } 55% { opacity: 1; } 95% { opacity: 1; } 100% { opacity: 0; } } .paused { background-color: #ddd; }

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <img id="pic1" class="pic" src="http://placehold.it/200x200/ff0000/ffffff"> <img id="pic2" class="pic" src="http://placehold.it/200x200/ff00ff/ffffff">

Intenté buscar en Google y buscar en este foro una solución para mi problema, pero hasta ahora no he tenido suerte. Me gustaría detener mi animación CSS3 (presentación de diapositivas de imágenes) haciendo clic en una imagen y también reanudar la misma animación haciendo clic en una imagen.

Sé cómo pausar la presentación de diapositivas y también pude reanudarla una vez, pero luego deja de funcionar si intenta detenerla y reanudarla más de una vez. Así es como se ve mi código:

<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> .pic { position: absolute; opacity: 0; } #pic1 { -webkit-animation: pic1 4s infinite linear; } #pic2 { -webkit-animation: pic2 4s infinite linear; } @-webkit-keyframes pic1 { 0% {opacity: 0;} 5% {opacity: 1;} 45% {opacity: 1;} 50% {opacity: 0;} 100% {opacity: 0;} } @-webkit-keyframes pic2 { 0% {opacity: 0;} 50% {opacity: 0;} 55% {opacity: 1;} 95% {opacity: 1;} 100% {opacity: 0;} } </style> <script type="text/javascript"> function doStuff(){ var pic1 = document.getElementById("pic1"); var pic2 = document.getElementById("pic2"); pic1.style.webkitAnimationPlayState="paused"; pic2.style.webkitAnimationPlayState="paused"; pic1.onclick = function(){ pic1.style.webkitAnimationPlayState="running"; pic2.style.webkitAnimationPlayState="running"; } pic2.onclick = function(){ pic1.style.webkitAnimationPlayState="running"; pic2.style.webkitAnimationPlayState="running"; } } </script> </head> <body> <img id="pic1" class="pic" src="photo1.jpg" /> <img id="pic2" class="pic" src="photo2.jpg" onclick="doStuff()" /> </body> </html>

No quiero usar ninguna biblioteca JS (por ejemplo, jQuery) ni ninguna otra solución externa.

Mi suposición es que mis funciones dentro de la función doStuff todavía se están ejecutando y es por eso que la pause y el resume funcionan solo una vez.

¿Hay alguna manera de borrar estas funciones después de hacer clic una vez? ¿O estoy tratando de hacer esto de una manera totalmente incorrecta? La ayuda es apreciada. :)


Esto es para extender la respuesta dada por Luis Hijarrubia

.pause { -webkit-animation-play-state: paused !important; -moz-animation-play-state: paused !important; -o-animation-play-state: paused !important; animation-play-state: paused !important; }

En mi página estaba activando el cambio de clase desde el elemento padre. Todo lo que quería hacer era rotar la imagen en el interior. Pero parece que debido a que no estaba usando el vuelo estacionario, la adición de la clase en pausa no cambió el estado de la animación.

El uso de! Important aseguró que estos valores fueran sobrescritos por los nuevos valores de CSS agregados.


Me resulta más fácil hacerlo con una clase CSS. Con él, puede usar prefijos para cada navegador.

.paused{ -webkit-animation-play-state:paused; -moz-animation-play-state:paused; -o-animation-play-state:paused; animation-play-state:paused; }

Luego, solo tiene que agregar o eliminar esta clase a su elemento animado, detener / reanudar la animación.


No lo he probado, pero tal vez algo como esto?

<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> .pic { position: absolute;opacity: 0; } .pic1 { -webkit-animation: pic1 4s infinite linear; } .pic2 { -webkit-animation: pic2 4s infinite linear; } @-webkit-keyframes pic1 { 0% {opacity: 0;} 5% {opacity: 1;} 45% {opacity: 1;} 50% {opacity: 0;} 100% {opacity: 0;} } @-webkit-keyframes pic2 { 0% {opacity: 0;} 50% {opacity: 0;} 55% {opacity: 1;} 95% {opacity: 1;} 100% {opacity: 0;} } </style> <script type="text/javascript"> function doStuff(){ var pic1 = document.getElementById("pic1"); var pic2 = document.getElementById("pic2"); pic1.className="pic paused"; pic2.className="pic paused"; pic1.onclick = function(){ pic1.className="pic pic1"; pic2.className="pic pic2"; } pic2.onclick = function(){ pic1.className="pic pic1"; pic2.className="pic pic2"; } } </script> </head> <body> <img id="pic1" class="pic pic1" src="photo1.jpg" /> <img id="pic2" class="pic pic2" src="photo2.jpg" onclick="doStuff()" /> </body> </html>


var e = document.getElementsById("Your_Id"); e.addEventListener("animationstart", listener, false); e.addEventListener("animationend", listener, false); e.addEventListener("animationiteration", listener, false); function listener(e) { alert("Your POSITION parameter:" + .target.style.position); switch(e.type) { case "animationstart": d = "Started: elapsed time is " + e.elapsedTime; break; case "animationend": d = "Ended: elapsed time is " + e.elapsedTime; break; case "animationiteration": d= "New loop started at time " + e.elapsedTime; alert("pausing for 1 seconddddddd!!!!!!!"); e.target.style.animationPlayState = "paused"; window.setTimeout(function(){e.target.style.animationPlayState = "running";}, 1000); break; } }