当前位置: 首页 > 面试题库 >

反向使用CSS动画(通过重置状态?)

晋俊贤
2023-03-14
问题内容

我在CSS中使用了两个关键帧动画。一个从左到右移动,另一个使用完全相同的值-但取反。

@keyframes moveLeft
{
    from {transform: translate3d(50px, 0, 0);}
    to   {transform: translate3d(0px, 0, 0);}
}


@keyframes moveRight
{
    from {transform: translate3d(0px, 0, 0);}
    to   {transform: translate3d(50px, 0, 0);}
}

但是,我想知道是否可能仅使用一个关键帧动画。但是一旦添加animation-direction: reverse,动画就只播放一次。它可能会保存以前使用过的信息。因此:我可以通过某种方式重置此信息吗?还是有可能在不同方向上两次使用一个动画?(不使用JS)


问题答案:

不,没有办法单独使用CSS重新启动动画。您必须使用JavaScript从元素中删除动画,然后将其重新应用到元素(经过延迟)以重新启动。

以下是[W3C的CSS3动画规范说的(在不同的上下文中,但这一点也应适用于这种情况):

还要注意,更改“ animation- name”的值不一定会重新启动动画(例如,如果应用了一个动画列表,并且从列表中删除了一个动画,则仅该动画将停止;其他动画将继续)。 为了重新启动动画,必须将其删除然后重新应用。

重点是我的

注意:**
本文引用了Oli的涉猎内容,该文章声称更改持续时间,迭代计数等属性会使其在Webkit上重新启动,但由于它们已不再在Chrome上运行,因此似乎已经过时了)。

摘要:

尽管您已经谈到以下内容,但为了完整性起见,我将再次重申:

  • 将动画应用于元素后,它将保留在元素上,直到将其删除。
  • UA会跟踪元素上的动画以及动画是否完成。
  • 当您将相同的动画应用于:checked(尽管方向不同)时,UA不会执行任何操作,因为该动画已经存在于元素上。
  • 单击复选框时位置(瞬时)的切换是因为transform:checked选择器中应用了。动画的存在没有区别。

解决方案

从下面的代码片段中可以看出,即使使用JavaScript,使用单个动画实现此操作也非常复杂。

var input = document.getElementsByClassName("my-checkbox")[0];



input.addEventListener('click', function() {

  if (this.checked) {

    this.classList.remove('my-checkbox');

    window.setTimeout(function() {

      input.classList.add('anim');

      input.classList.add('checked');

    }, 10);

  } else {

    this.classList.remove('anim');

    window.setTimeout(function() {

      input.classList.remove('checked');

      input.classList.add('my-checkbox');

    }, 10);

  }

});


input {

  transform: translate3d(50px, 0, 0);

}

.my-checkbox {

  animation: moveLeft 1s;

  animation-direction: reverse;

}

.checked {

  transform: translate3d(0px, 0, 0);

}

.anim{

  animation: moveLeft 1s;

}

@keyframes moveLeft {

  from {

    transform: translate3d(50px, 0, 0);

  }

  to {

    transform: translate3d(0px, 0, 0);

  }

}


<script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>

<input type="checkbox" class="my-checkbox">

因此, 最好的选择 (如果要坚持使用CSS动画)是 使用两种不同的动画

或者,您也可以查看Marcelo的评论。如果实际用例恰好是小提琴中提供的用例,那么transition就足够了,animation并且不是必需的。过渡本质上可以在正向和反向两个方向上起作用,因此将是一个更安全的选择。



 类似资料:
  • 问题内容: 因此,我有以下规则: 还有一些CSS定义了我的一些动画规则: 我可以在这样的: 但是我以后不能再动摇了。 这只会摇晃盒子一次: 如何在不使用超时或多个动画的情况下通过JavaScript重新触发CSS动画? 问题答案: 我在CSS3转换测试github页面上根据源代码和示例找到了答案。 基本上,CSS动画具有一个在动画完成时触发的事件。 对于Webkit浏览器,此事件称为“”。因此,为

  • 问题内容: 我试图通过使用CSS过渡来更改悬停元素的背景颜色。我想通过使其从底部向上滚动来做到这一点。我可以使用此功能淡化背景,但我希望它向上滑动: 另一个想法是,将背景应用到一个单独的元素上会更好吗? 问题答案: 为了 向上滑动背景色, 您需要使用背景图片或某种渐变,同时逐步调整:

  • 问题内容: 我正在使用CSS着色器+动画。我的着色器类定义如下: 我正在尝试使用jQuery通过和动态设置/取消设置样式(shader + animation) 但是,奇怪的是,当我重置类时(例如,在removeClass之后调用addClass),仅重新应用了着色器,而没有应用动画(我已钩住AnimationStart事件以查看动画何时开始)。有人知道为什么会这样吗,我该如何解决? 编辑:我在这

  • 问题内容: 因此,我了解了如何同时执行CSS3过渡和动画。我用谷歌搜索的不清楚是什么时候使用它。 例如,如果我想使球弹跳,很明显,动画是必经之路。我可以提供关键帧,而浏览器将做中间帧,并且我将获得一个不错的动画。 然而,在某些情况下,无论哪种方式都可以达到上述效果。一个简单而常见的示例是实现Facebook风格的滑动抽屉菜单: 可以通过以下过渡来实现此效果: 或者,通过类似这样的动画: 使用HTM

  • 环境 OS:Redhat 7 ReverseProxy:Apache(仅限) 通过:Docker 部署 ====================================================================================================================== 问题: 是否可以在Apache反向代理中进行更改,以便通过

  • 我正在动画一个或多个div滚动到视图中。我是通过将动画css拆分成几个类(见下文)来做到这一点的。 动画div最初将具有类'.mpact-animated'和'.mpact-animated-pause'。div还将具有以下类之一'.mpact-shake'、'.mpact-heartbeat'或'.mpact-bounce'。这些动画类是由用户选择的,所以我不知道哪一个是要实现的。 当页面滚动时