Is there a feasible way to trigger CSS keyframe animation using JS?

前端 未结 3 1534
谎友^
谎友^ 2021-01-18 07:58

Naturally, we can create a CSS animation using keyframes, and control it from there.

However, ideally, I would like to trigger this animation from a button click - s

相关标签:
3条回答
  • 2021-01-18 08:03

    see here jsfiddle

    if you want your animation to work every time you press the button use this code :

    $('button').click(function() {
        $(".fademe").addClass('animated');
        setTimeout(function() {
          $(".fademe").removeClass('animated');
        }, 1500);
    });
    

    where 1500 is the animation-duration in this case, 1.5s

    $('button').click(function() {
      $(".fademe").addClass('animated');
      setTimeout(function() {
        $(".fademe").removeClass('animated');
      }, 1500);
    });
    .fademe {
      width: 100px;
      height: 100px;
      background: red;
    }
    
    .fademe.animated {
      animation: fade-in 1.5s ease;
    }
    
    
    @keyframes fade-in {
      0% {
        opacity: 0;
      }
    
      100% {
        opacity: 1;
      }
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="fademe">
    
    </div>
    
    <button>CLICK ME</button>

    EXPLANATION :

    1. on click on the button add class animated ( or any other class ) to the element you want to apply the animation to , .fademe
    2. make a setTimeout(function() to delay the removeClass for the duration of the animation 1.5s or 1500ms
    3. write in CSS the declaration of the animation , @keyframes, and add it to the element with the class added by the JQ .fademe.animated
    0 讨论(0)
  • 2021-01-18 08:22

    If you want to make the animation happen and always end before allowing the event listener to trigger it again, I would suggest to control the behaviour like this:

    // Add this to your event listener
    if (!element.classList.contains("myClass")) {
        element.className = "myClass";
        setTimeout(function() {
            element.classList.remove("myClass");
        }, 1000); //At least the time the animation lasts
    }
    
    0 讨论(0)
  • 2021-01-18 08:23

    $("#move-button").on("click", function(){
      $("#ship").removeClass("moving");
      $("#ship")[0].offsetWidth = $("#ship")[0].offsetWidth;
      $("#ship").addClass("moving");
    });//
    #ship
    {
      background: green;
      color: #fff;
      height: 60px;
      line-height: 60px;
      text-align: center;
      width: 100px;
    }
    
    #move-button
    {
      margin-top: 20px;
    }
    
    #ship.moving
    {
      animation: moving 2s ease;
    }
    
    @keyframes moving
    {
      0%{ transform: translate(0px);}
      50%{ transform: translate(20px);}
      100%{ transform: translate(0px);}
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <div id="ship">Ship</div>
    <button id="move-button">Push</button>

    0 讨论(0)
提交回复
热议问题