【问题标题】:CSS Animations how to transition from animation to a resting stateCSS Animations 如何从动画过渡到静止状态
【发布时间】:2020-01-07 17:01:00
【问题描述】:

这是我的代码:

https://jsbin.com/hibiviwuki/1/edit?html,css,js,output

card
  background red
  border 1px solid black
  width 40px
  height 40px
  margin 20px
  display block
  transition 2s
  filter drop-shadow(2px 2px 1px rgba(0, 0, 0, .4)) drop-shadow(0 -1px 2px green)
  transform scale(1) rotate(0)

  &.active
    animation randanims 2s
    animation-iteration-count infinite
    animation-direction alternate


@keyframes randanims
  0%
    transform scale(2) rotate(180deg)
    filter drop-shadow(1rem 1rem 1px rgba(0, 0, 0, .4)) drop-shadow(0 -5px 12px green)

  50%
    transform translate(20px) scale(.5) rotate(0deg)
    filter drop-shadow(1rem 1rem 1px rgba(0, 0, 0, .4)) drop-shadow(0 -5px 12px green)

  100%
    transform scale(2) rotate(-180deg)
    filter drop-shadow(1rem 1rem 1px rgba(0, 0, 0, .4)) drop-shadow(0 -5px 12px green)

我正试图让它在 2 秒内顺利过渡到静止位置。现在它从动画状态跳转到没有动画的状态。

如果不控制 JS 中的动画,这可能吗?

【问题讨论】:

    标签: javascript css css-animations


    【解决方案1】:

    如果我理解正确:

    $( document ).ready(function() {
        $('card').click(function () {
          // Add animation class
          $(this).toggleClass('active');
          
          // Listen to animation end event
          $(this).one("animationend webkitAnimationEnd oAnimationEnd MSAnimationEnd", function(){
            
            // Remove the class
            $(this).toggleClass('active');
          });
        });
    });
    /* https://jsbin.com/yujacagero/1/edit?html,css,js,output */
    
    card {
      background: #f00;
      border: 1px solid #000;
      width: 40px;
      height: 40px;
      margin: 20px;
      display: block;
      transition: all 2s ease;
      filter: drop-shadow(2px 2px 1px rgba(0,0,0,0.4)) drop-shadow(0 -1px 2px #008000);
      transform: scale(1) rotate(0);
    }
    card.active {
      animation: randanims 2s;
      animation-iteration-count: 1;
      animation-direction: alternate;
    }
    @-moz-keyframes randanims {
      0% {
        transform: scale(1) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      25% {
        transform: scale(2) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      50% {
        transform: translate(20px) scale(0.5) rotate(0deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      75% {
        transform: scale(2) rotate(-180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      100% {
        transform: scale(1) rotate(0deg);
        filter: drop-shadow(2px 2px 1px rgba(0,0,0,0.4)) drop-shadow(0 -1px 2px #008000);
      }
    }
    @-webkit-keyframes randanims {
      0% {
        transform: scale(1) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      25% {
        transform: scale(2) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      50% {
        transform: translate(20px) scale(0.5) rotate(0deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      75% {
        transform: scale(2) rotate(-180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      100% {
        transform: scale(1) rotate(0deg);
        filter: drop-shadow(2px 2px 1px rgba(0,0,0,0.4)) drop-shadow(0 -1px 2px #008000);
      }
    }
    @-o-keyframes randanims {
      0% {
        transform: scale(1) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      25% {
        transform: scale(2) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      50% {
        transform: translate(20px) scale(0.5) rotate(0deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      75% {
        transform: scale(2) rotate(-180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      100% {
        transform: scale(1) rotate(0deg);
        filter: drop-shadow(2px 2px 1px rgba(0,0,0,0.4)) drop-shadow(0 -1px 2px #008000);
      }
    }
    @keyframes randanims {
      0% {
        transform: scale(1) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      25% {
        transform: scale(2) rotate(180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      50% {
        transform: translate(20px) scale(0.5) rotate(0deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      75% {
        transform: scale(2) rotate(-180deg);
        filter: drop-shadow(1rem 1rem 1px rgba(0,0,0,0.4)) drop-shadow(0 -5px 12px #008000);
      }
      100% {
        transform: scale(1) rotate(0deg);
        filter: drop-shadow(2px 2px 1px rgba(0,0,0,0.4)) drop-shadow(0 -1px 2px #008000);
      }
    }
    <!DOCTYPE html>
    <html>
    
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>JS Bin</title>
      <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    </head>
    
    <body>
      <card></card>
      <card class="active"></card>
    </body>
    
    </html>

    Updated JSBin 使用触控笔

    【讨论】:

    • 谢谢,虽然这回答了这个问题,但对我来说有点困难,因为动画不知道结束状态。试图将一堆不同的组件连接在一起。
    • 在动画结束时,您可以添加下一个动画类。如果您可以提供额外的 HTML/动画,有人可能会有更好的解决方案
    猜你喜欢
    • 2018-09-19
    • 2012-11-15
    • 1970-01-01
    • 2012-04-16
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多