【问题标题】:How to end CSS transition prematurely (based on time from the start)如何过早结束 CSS 过渡(基于从开始的时间)
【发布时间】:2017-12-23 22:57:32
【问题描述】:

是否可以提前结束 CSS 动画,基于从开始的毫秒数,并且仍然触发 transitionend 事件?

小提琴开始

https://jsfiddle.net/Slava_B/4vLwtyxx/

编辑:过渡持续时间和提前停止前的持续时间是在过渡开始之前在 JS 中计算的。同样在现实生活中,通过使用 JS 应用内联样式来触发转换。不知道有没有帮助。

var animateEl = document.querySelector('.animate'),
    resultEl = document.querySelector('.result');

animateEl.addEventListener('transitionstart', function(e){
  window.animationStartTime = performance.now();
  resultEl.innerHTML = '';
})
animateEl.addEventListener('transitionend', function(e){
  resultEl.innerHTML = 'Animation took: '+ Math.round(performance.now()-window.animationStartTime) +'ms';
});
.parent{
  height:300px;
  box-shadow:0 -100px 0 0 rgb(255,150,150) inset, 0 -200px 0 0 rgb(150,255,150) inset;
}
.animate{
  height:100px;
  background-color:rgba(0,100,200,0.6);
  transition:height 2000ms cubic-bezier(0.645,0.045,0.355,1);
}
.animate:hover{
  height:300px;
}
<div class="parent">
  <div class="animate">
    We want to launch the animation for the duration of 2000ms, but prematurely end it for example after 1000ms. So it doesn't reach red zone.
  </div>
</div>
<p class="result"></p>

【问题讨论】:

  • 您可以使用动画 CSS 属性,然后在关键帧内以您希望它停止/停止的完成百分比来定义所需的 CSS 样式。但您实际上是在保留一个状态,而不是实际停止动画。
  • @Highdef 感谢您的评论,我已经进行了编辑,该评论应该澄清现实世界的用途。如果直到动画开始之前 % 才知道,您认为关键帧是否仍会在解决方案中发挥作用?还有多个元素同时动画,定义关键帧不会破坏其他元素的过渡吗?如果没有,你能做一个小提琴来展示它的样子吗?
  • 好吧,就像你说的,如果在持续时间之前不知道 % 时间,那么关键帧将没有任何用处,因为这需要是动态的,然后唯一的解决方案就是转向到 javascript。
  • jsfiddle.net/nesohv7n(动画在 1ms 处停止,直到悬停才恢复)和jsfiddle.net/xw7wcw54(动画停止并返回初始位置)就 CSS 能力而言。

标签: javascript css dom-events css-animations


【解决方案1】:

Highdef's comments 建议您仅使用 CSS 就可以做到最好,尽管我不了解用例。为什么有一个总是中途停止的动画,而你可以定义一个只运行一半的动画并让它运行一半时间?

使用 JavaScript 至少可以停止/启动动画并获得它们的进度,但您可能会遇到浏览器兼容性和复杂性的问题。您可以轻松地disable transitions and animations,并且您可以使用CSSOM 来确定动画的进度并相应地进行调整。 CSS Trick 有一篇很棒的文章,“Controlling CSS Animations and Transitions with JavaScript.” 在我看来,这是很多工作却没有多少收获。

【讨论】:

  • 用例是将元素动画到新位置并在其着陆时显示对话框。调整动画持续时间和计时功能,以向用户提供平滑的视觉反馈,即元素正在下降到某个位置,即使它位于视口之外。现在,如果放置位置远离视口,用户看不到动画的最大部分,只需等待几秒钟,对话框就会出现。为了防止这种情况,我们希望在元素离开视口后立即结束动画,但保持当前飞出效果的时间。
  • @Alph.Dev 如果我理解正确,您是否看过 IntersectionObserver* 如果您需要更好的浏览器支持,还有轻量级且有效的 Polyfills^。在任何情况下,您都可以检测到视图何时完全在视口之外,显示对话框并取消动画(或者因为它对用户不可见,所以让它完成)。 * developer.mozilla.org/en-US/docs/Web/API/… ^ github.com/w3c/IntersectionObserver
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 2013-05-19
  • 2021-08-18
  • 2019-05-24
相关资源
最近更新 更多