【问题标题】:Executing keyframes animation in JS or jQuery在 JS 或 jQuery 中执行关键帧动画
【发布时间】:2022-02-08 20:56:16
【问题描述】:

我知道可以通过 id 在样式表或 DOM 中的 JS 中设置元素的动画。问题是我希望每次用户对特定元素执行单击操作时都执行动画。在 JS 中将动画添加到元素的样式中似乎会永久添加它,因此无法再次执行关键帧动画(仅在窗口完成加载时执行一次)。我还考虑过使用 jQuery 的 .animate() 函数,但是所有文档都指向它通过 CSS 特定样式设置动画,而不是设置/调用动画样式属性,就好像我要使用 CSS 设置它一样。我想知道当用户点击另一个元素并为每次点击持续执行动画时,在一个元素上执行动画的最佳方式。

@keyframes fadeInDown {
  from {
   opacity: 0;
   transform: translate(0, -20%);
 }
 to {
   opacity: 1;
   transform: translate(0, 0);
 }
}

我为元素设置动画的当前方式:

$("#element").css("animation", "fadeInDown 0.5s ease-in 0s 1");

【问题讨论】:

    标签: javascript jquery animation css-animations


    【解决方案1】:

    这是一个使用transition和jquery的切换动画,没有使用.animate()

    $(document).ready(function() {
      $('button').click(function() {
        var box = $('.box')
        box.removeClass("show")
        setTimeout(function(){
            box.addClass("trans").addClass("show")
            setTimeout(function(){
                box.removeClass("trans")
            },100)
        },200)
      });
    });
    .box {
      background: red;
      height: 50px;
      width: 50px;
      position: absolute;
      margin-top: 50px;
      margin-left: 50px;
      opacity: 0;
      transform: translate(0, -20%);
    }
    
    .box.trans {
      transition: all 0.7s;
    }
    
    .box.show {
      opacity: 1;
      transform: translate(0, 0);
    }
    <button>Test</button>
    <div class="box show"></div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

    【讨论】:

    • 这更好,但是,我知道切换类会删除,在这种情况下会隐藏示例中的红色方块,并带有淡出和上滑过渡。但是我并不完全想切换类(或者可能只是想更改过渡动画)。每次单击测试按钮时,红色方块应立即设置不透明度,首先不显示翻译,然后在这样做之后,将show 类添加回元素。我希望这不会让人难以理解。
    • 作为后续,红色方块不应该显示淡出/上滑,它应该始终显示淡入/下滑。
    • 确实很混乱。但我认为这就是你要找的。​​span>
    • 这越来越接近我想要的了。基本上不是切换测试按钮,当您单击测试时,它需要删除显示类,然后立即添加。基本上都在一个流畅的动作中。
    • 让我说清楚。所以最初, .box 将对用户可见。然后单击按钮。框立即消失,并以 slideDown+fadeIn 出现。是这样吗?
    【解决方案2】:

    这是我关于堆栈溢出的第一个答案。 我对动画也有同样的疑问。

    我上次所做的就像 Vivek Patel 的回答,但是我没有切换 css 关键帧,而是创建了一个仅为 css 动画(“animation-fadeInDown”)的单独类,并切换它。

    因为动画名称“fadeInDown”对应于 @keyframes 名称,所以如果将其分开,您可以通过切换动画类将动画应用于其他元素。

    而且,您仍然可以单独对原始框进行 css 装饰,这样可能更易于阅读。

    我希望这与您正在寻找的内容接近。

    $('button').click(() => {
      $('.box').toggleClass('animation-fadeInDown');
    });
    .box {
      width: 50px;
      height: 50px;
      background: black;
    }
    
    .animation-fadeInDown {
      animation: fadeInDown 0.5s ease-in 0s 1
    }
    
    @keyframes fadeInDown {
        from {
          opacity: 0;
          transform: translate(0, -20%);
        }
        to {
          opacity: 1;
          transform: translate(0, 0);
        }
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <div class="box"></div>
    <button>
        Test
    </button>

    【讨论】:

      【解决方案3】:

      基本上,CSS 动画只在页面加载时运行一次。所以不可能再次重新触发它。以下是您的用例的解决方法:从页面中完全删除元素并重新插入。

      试试这个:

      $('button').click(() => {
        var oldDiv = $('#animated-div');
        newDiv = oldDiv.clone(true);
      
       	oldDiv.before(newDiv);
      
      	$("." + oldDiv.attr("class") + ":last").remove();
      });
      @keyframes fadeInDown {
          from {
            opacity: 0;
            transform: translate(0, -20%);
          }
          to {
            opacity: 1;
            transform: translate(0, 0);
          }
      }
      
      .animated-div {
        animation: fadeInDown 0.5s ease-in 0s 1
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
      <div id="animated-div" class="animated-div" style="width: 50px; height: 50px; background: black"></div>
      <button>
      Test
      </button>

      【讨论】:

      • 我知道这会起作用,但是有没有更好的方法来完成这种功能而无需删除和重新插入元素?例如,有没有办法在使用某种类型的侦听器函数执行动画后从 CSS 中删除动画? (同步进行)
      • 我认为这是不可能的。我还尝试删除该类并再次在 setTimeout() 中添加该类,如下所示: $('#animated-div').removeClass("animated-div"); setTimeout(() => { $('#animated-div').addClass("animated-div") });但我认为上述删除/重新插入的方法更好。
      【解决方案4】:

      这是一个简单的例子,它使用 jquery 在 Queue 中进行动画处理,因为它在 @keyframes 中工作。过渡持续时间和动画持续时间可以更好地控制动画角色。

      $(document).ready(function() {
        $('button').click(function() {
          $('.box')
            .css('transition', 'all 0.2s')
            .animate({ opacity: 0 }, {
              duration: 200,
              step: function(now) {
                $(this).css({ opacity: now });
                $(this).css({ transform: 'translate(0, -20%)' });
              }
            })
            .animate({ opacity: 1 }, {
              duration: 600,
              step: function(now) {
                $(this).css({ opacity: now });
                $(this).css({ transform: 'translate(0, 0)' });
              }
            })
        });
      });
      .box {
        background: red;
        height: 50px;
        width: 50px;
        position: absolute;
        margin-top: 50px;
        margin-left: 50px;
      }
      <button>Test</button>
      <div class="box"></div>
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

      【讨论】:

      • 这仅使用过渡。这意味着,如果不使用 jquery 启动它,就不会发生动画。
      • 另外,这个动画在按钮点击时上下跳跃,我只想让元素同时淡入和向下滑动。
      • 你需要按钮来切换还是动画只发生一次?
      • 我对这个问题有点困惑。基本上,我希望每次单击按钮时在元素上执行我在@keyframes 中创建的动画。这意味着每次单击按钮时,正在动画的元素将同时淡入并向下滑动。我之前这样做过,它只在网页加载时工作一次,但不会在按钮单击时再次执行动画。我可以用过渡来代替,但我需要过渡来复制我创建的动画。
      • 就是css中动画的字符。您需要使用过渡来正确控制元素的移动方式。请参阅我的另一个答案。它的代码也更少。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 2012-12-22
      • 2017-05-30
      • 2021-03-21
      • 1970-01-01
      相关资源
      最近更新 更多