删除 class 不会停止 IE11 中的关键帧动画

Removing class does not stop keyframe animation in IE11

下面的代码片段显示了我在 Internet Explorer 11 中发现的 css 动画问题的简化示例。

  1. 旋转按钮将“.spin”class 添加到 div,这会更改横幅的颜色并开始旋转。
  2. 停止按钮从 div 中删除了“.spin”class,这意味着它应该恢复到原来的颜色并停止旋转。

在 IE11 中,第 2 步不起作用 - 它会更改颜色但不会停止动画。奇怪的是,如果您使用开发人员工具 运行 进行尝试,它会按预期工作。

我是不是做错了什么或者这是一个已知的错误?尽管我的 google-fu 可能缺少它,但我一直无法找到任何参考资料。

var banner = document.getElementById('banner');
var spinButton = document.getElementById("spin-button");
var stopButton = document.getElementById("stop-button");

spinButton.addEventListener("click", function(){
  banner.classList.add("spin");
})

stopButton.addEventListener("click", function(){
  banner.classList.remove("spin");
})
.spin {
  background: #FF0000;
  color: #FFF;
  -webkit-animation: spin 1.5s infinite linear;
  animation: spin 1.5s infinite linear;
}

@keyframes spin {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
<div>
  <div id="banner">
    <p>
      Hello World
    </p>
  </div>
  <button id="spin-button">Spin</button>
  <button id="stop-button">Stop</button>
</div>

我用IE 11.1.18362.0版本做了测试。在我的测试中,我发现在尝试 运行 Whosebug 代码片段中的示例时会产生问题。我尝试 运行 来自 HTML 文件的代码,发现你的代码工作正常。即使未打开控制台,它也能正常工作。

测试代码:

<!doctype html>
<html>
<head>
<style>
.spin {
  background: #FF0000;
  color: #FFF;
  -webkit-animation: spin 1.5s infinite linear;
  animation: spin 1.5s infinite linear;
}

@keyframes spin {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
</style>

</head>
<body>
<div>
  <div id="banner">
    <p>
      Hello World
    </p>
  </div>
  <button id="spin-button">Spin</button>
  <button id="stop-button">Stop</button>
</div>
<script>
var banner = document.getElementById('banner');
var spinButton = document.getElementById("spin-button");
var stopButton = document.getElementById("stop-button");

spinButton.addEventListener("click", function(){
  banner.classList.add("spin");
})

stopButton.addEventListener("click", function(){
  banner.classList.remove("spin");
})
</script>
</body>
</html>

在 IE 11 中的输出:

我建议您使用 HTML 文件尝试 运行 上面的代码示例,以检查它是否有助于使其正常工作。

IE 不是智能浏览器,您必须全面定义以防您希望它以您想要的方式工作。您通常可以通过在 js 代码顶部添加 'use strict' 或使用 polyfill 来解决此问题,但这些并不是真正的解决方案。在IE中同样的情况,我们面临bubble up事件,那么你需要一个声明,如果点击发生了然后继续做。查看此 link 了解更多信息。

正如 epascarello 在评论中指出的那样,这是一个 IE11 错误,解决方案是强制浏览器重绘受影响的元素。在上面的示例中,只需更新元素 style.display 属性 就足以停止动画:

stopButton.addEventListener("click", function(){
   banner.classList.remove("spin");
   banner.style.display = "block";
})

在我的现实世界问题中,我使用的是 jQuery,因此在删除 class 后在我的元素上调用 .show() 就足够了。