【问题标题】:How to detect state of CSS transition via JS and skip it如何通过 JS 检测 CSS 转换的状态并跳过它
【发布时间】:2021-01-17 18:52:04
【问题描述】:

考虑这样的div:

<div id="someid"></div>

它的风格:

#someid {
  transition: background-color 10s ease;
  background-color: #FF0000;
  height: 100px;
  width: 100px;
}

#someid:hover {
  background-color: #FFFFFF;
}

如果可能的话,我希望有可能通过 JS 和/或结束动画来检测 #someid 的状态(当前是否动画)。我尝试了this answer 的一个东西:

document.querySelector("#someid").style.transition = "none";

但它不适用于当前的动画元素。

关键是我需要检测元素现在是否正在动画,如果是,则等待动画结束或立即结束,否则什么都不做

我已经foundtransitionend 事件,但使用它我无法检测元素是否正在动画。

【问题讨论】:

  • 我可能错了,但我认为这不可能在运行时获得当前状态? stackoverflow.com/questions/51045403/…
  • @Crocsx 好的,但是是否可以删除过渡属性以便动画结束?
  • @fas 看看我的代码,它会在结束后立即删除转换,之后您将不再看到它。
  • @DipenShah 一结束就删除过渡我需要删除正在进行的过渡
  • 您可以在使用 AnimationPlayState 运行时暂停,或者您可以将过渡设置为特定的 css 选择器,当您想强制停止动画时,您可以从 div 中删除该选择器。但是您在答案的评论中还有其他选择。但基本上用CSS你控制它,他不会为你更新^^

标签: javascript css css-transitions


【解决方案1】:

您可以收听转换事件并根据需要将其删除:

const el = document.getElementById('transition');
let isAnimating = false;

el.addEventListener('transitionstart', function() {
  isAnimating = true;
});

el.addEventListener('transitionend', () => {
  isAnimating = false;
});

el.addEventListener('transitioncancel', () => {
  isAnimating = false;
});

function removeTransition(checkIfRunning) {
  if (checkIfRunning && !isAnimating) {
    return;
  }

  el.style.transition = "none";
}
#transition {
  width: 100px;
  height: 100px;
  background: rgba(255, 0, 0, 1);
  transition-property: transform background;
  transition-duration: 2s;
  transition-delay: 1s;
}

#transition:hover {
  transform: rotate(90deg);
  background: rgba(255, 0, 0, 0);
}
<div id="transition">Hello World</div>
<br />
<button onclick="removeTransition(false)">Remove Transition</button>
<br />
<br />
<button onclick="removeTransition(true)">Remove Transition on if running</button>

【讨论】:

  • 这可能是一个误解,但我需要检测元素现在是否正在动画,如果是,则等待动画结束或立即结束,否则什么都不做。更新的问题。
  • 所以在我的代码中,我在最后删除了过渡,但您可以修改它以在开始和结束之间随时触发取消过渡事件,并且它应该取消它。让我更新一下我的代码。
  • @fas 只要transitionstart 事件已触发,您就可以假设它当前正在转换直到transitionend。如果更适合您的用例,您可以设置一个外部变量isAnimating
  • 看看我的更新,我添加了移除转换按钮以在任何时候移除点击转换。
  • 由于这些事件会冒泡,您甚至可以建立一个更加不可知的列表:jsfiddle.net/pbzqw1f5
猜你喜欢
  • 2013-12-21
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2019-09-02
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
相关资源
最近更新 更多