Animación CSS al hacer clic

5 minutos de lectura

avatar de usuario de tekknolagi
teknolagi

¿Cómo puedo hacer que una animación CSS se reproduzca con un onClick de JavaScript? actualmente tengo:

.classname {
  -webkit-animation-name: cssAnimation;
  -webkit-animation-duration:3s;
  -webkit-animation-iteration-count: 1;
  -webkit-animation-timing-function: ease;
  -webkit-animation-fill-mode: forwards;
}
@-webkit-keyframes cssAnimation {
  from {
    -webkit-transform: rotate(0deg) scale(1) skew(0deg) translate(100px);
  }
  to {
    -webkit-transform: rotate(0deg) scale(2) skew(0deg) translate(100px);
  }
}

¿Cómo puedo aplicar un onClick?

Avatar de usuario de Shisoft
Shisoft

¿Está seguro de que solo muestra su página en webkit? Aquí está el código, pasado en safari. La imagen (id='img') rotará después de hacer clic en el botón.

function ani() {
  document.getElementById('img').className="classname";
}
.classname {
  -webkit-animation-name: cssAnimation;
  -webkit-animation-duration: 3s;
  -webkit-animation-iteration-count: 1;
  -webkit-animation-timing-function: ease;
  -webkit-animation-fill-mode: forwards;
}

@-webkit-keyframes cssAnimation {
  from {
    -webkit-transform: rotate(0deg) scale(1) skew(0deg) translate(100px);
  }
  to {
    -webkit-transform: rotate(0deg) scale(2) skew(0deg) translate(100px);
  }
}
<input name="" type="button" onclick="ani()" value="Click">
<img id="img" src="https://i.stack.imgur.com/vghKS.png" width="328" height="328" />

  • Solo tenga en cuenta que usar .className eliminará todas sus otras clases en el elemento dado. Si no lo desea, utilice document.getElementById('img').classList.add('classname');

    – Drew Kennedy

    1 de noviembre de 2016 a las 21:05

  • Esto se anima solo la primera vez que haces clic. Los clics posteriores no hacen nada. Utilizar sad comrade siguiente método para habilitar varios clics.

    –Max S.

    23/03/2022 a las 22:55


solo usas el :active pseudo-clase. Esto se establece al hacer clic en cualquier elemento.

.classname:active {
    /* animation css */
}

  • Ah, entendí mal tu pregunta. yo pensar La respuesta de Ravi funcionará para usted en ese caso.

    –Paul Fisher

    31 de enero de 2011 a las 7:10

  • Esto fue muy útil para mí. Ejecutó la animación solo mientras el usuario mantenía presionado el botón del mouse, que era exactamente lo que necesitaba.

    – anuncio

    10 de agosto de 2016 a las 5:25

  • Esto es lo que necesitaba también.

    – b_d_m_p

    25 de diciembre de 2019 a las 5:10

  • Gracias por esta respuesta, que era exactamente lo que estaba buscando.

    – Asela Priyadarshana

    18 de agosto de 2021 a las 4:59

Solución encontrada en css-trucos

const element = document.getElementById('img')

element.classList.remove('classname'); // reset animation
void element.offsetWidth; // trigger reflow
element.classList.add('classname'); // start animation

  • Activar el reflujo en la línea media es un truco ingenioso. justo lo que necesitaba

    – he77kat_

    18 de abril de 2020 a las 14:25

  • ¿Cómo funciona la activación del reflujo?

    – vania

    29 de julio de 2022 a las 12:24

  • @ he77kat_ Ni siquiera sé qué significa reflujo, ni puedo encontrar una buena explicación. ¿Te importa obligar?

    – ptrcao

    2 de enero a las 1:19

  • @ptrcao reflow es el nombre del proceso del navegador web para volver a calcular las posiciones y geometrías de los elementos en el documento HTML, con el fin de volver a representar parte o la totalidad del documento. Ciertas API del navegador o propiedades de documentos hacen que este proceso se reinicie y elem.offsetWidth es uno de ellos

    – he77kat_

    2 ene a las 18:08


Puede lograr esto vinculando un oyente onclick y luego agregando la clase animada de esta manera:

$('#button').onClick(function(){
    $('#target_element').addClass('animate_class_name');
});

Solución CSS SOLAMENTE que funciona con cada clic y reproduce la animación hasta el final:

Todo lo que tienes que hacer es añadir la animación a la :focus pseudo clase y configúrelo en ninguno en :active pseudoclase.

Si su elemento no es enfocable, agregue tabindex="0" atributo al elemento html:

@keyframes beat {
  0% {
    -webkit-transform: scale(1, 1);
            transform: scale(1, 1);
  }
  100% {
    -webkit-transform: scale(0.8,0.8);
            transform: scale(0.8, 0.8);
  }
}
.className {
  background-color:#07d;  
  color: #fff;
  font-family: sans-serif;
  font-size: 20px;
  padding: 20px;
  margin:5px;
  -webkit-transform: scale(1, 1);
          transform: scale(1, 1);
}
.className:focus {
  -webkit-animation: beat 1s ease-in-out backwards;
          animation: beat 1s ease-in-out backwards;
}
.className:active {
  -webkit-animation: none;
          animation: none;
}
body {
  text-align: center;
} 
<h3>Any element with tabindex="0", like a div:</h3>
<div tabindex="0" class="className"> Click me many times!</div>
<h3>Any focusable element like a button:</h3>
<button class="className"> Click me many times!</button>

  • el único problema que veo con esto: si hago clic en cualquiera de los controles de demostración, luego cambio de pestaña, luego vuelvo a cambiar, la animación se reproduce sin hacer clic.

    – Will

    9 de noviembre de 2021 a las 22:14

Avatar de usuario de RK Roy
rk roy

var  abox = document.getElementsByClassName("box")[0];
function allmove(){
        abox.classList.remove("move-ltr");
        abox.classList.remove("move-ttb");
       abox.classList.toggle("move");
}
function ltr(){
        abox.classList.remove("move");
        abox.classList.remove("move-ttb");
       abox.classList.toggle("move-ltr");
}
function ttb(){
       abox.classList.remove("move-ltr");
       abox.classList.remove("move");
       abox.classList.toggle("move-ttb");
}
.box {
  width: 100px;
  height: 100px;
  background: red;
  position: relative;
}
.move{
  -webkit-animation: moveall 5s;
  animation: moveall 5s;
}
.move-ltr{
   -webkit-animation: moveltr 5s;
  animation: moveltr 5s;
}
.move-ttb{
    -webkit-animation: movettb 5s;
  animation: movettb 5s;
}
@keyframes moveall {
  0%   {left: 0px; top: 0px;}
  25%  {left: 200px; top: 0px;}
  50%  {left: 200px; top: 200px;}
  75%  {left: 0px; top: 200px;}
  100% {left: 0px; top: 0px;}
}
@keyframes moveltr {
  0%   { left: 0px; top: 0px;}
  50%  {left: 200px; top: 0px;}
  100% {left: 0px; top: 0px;}
}
@keyframes movettb {
  0%   {left: 0px; top: 0px;}
  50%  {top: 200px;left: 0px;}
  100% {left: 0px; top: 0px;}
}
<div class="box"></div>
<button onclick="allmove()">click</button>
<button onclick="ltr()">click</button>
<button onclick="ttb()">click</button>

  • el único problema que veo con esto: si hago clic en cualquiera de los controles de demostración, luego cambio de pestaña, luego vuelvo a cambiar, la animación se reproduce sin hacer clic.

    – Will

    9 de noviembre de 2021 a las 22:14

Avatar de usuario de Marin Atanasov
marin atanasov

Agrega un

-webkit-animation-play-state: paused;

a su archivo CSS, luego puede controlar si la animación se está ejecutando o no usando esta línea JS:

document.getElementById("myDIV").style.WebkitAnimationPlayState = "running";

si desea que la animación se ejecute una vez, cada vez que haga clic. Recuerde configurar

-webkit-animation-iteration-count: 1;

¿Ha sido útil esta solución?