IE11 伪元素动画效果不正常

IE11 Pseudo-element animation is not working properly

在构建加载程序图标时,我注意到 IE11 中的行为与 Chrome 相比有一些奇怪的行为,使用此动画:

@keyframes loader-2 {
  0% {
    transform: translateX(0);
  }

  50% {
    transform: translateX(-1.6rem);
  }

  100% {
    transform: translateX(0);
  }
}

该元素首先正确地平移到侧面,但在平移回来之前移动得非常远。这仅在 IE11 中以这种方式运行(在 Chrome/Firefox 中运行良好),并且仅在伪元素 (::after) 上运行。

有关示例,请参阅 this fiddle(或下面的代码片段)。顶部的点是一个 span,工作正常,底部的点是一个 ::after 元素,它的行为很奇怪。

html {
  font-size: 62.5%;
}

.splash {
  align-items: center;
  display: flex;
  height: 100vh;
  justify-content: center;
  width: 100vw;
}

@keyframes loader-2 {
  0% {
    transform: translateX(0);
  }
  50% {
    transform: translateX(-1.6rem);
  }
  100% {
    transform: translateX(0);
  }
}

.loader {
  display: inline-block;
  height: 3.2rem;
  padding: 4rem 0;
  position: relative;
  width: 3.2rem;
  border: 1px solid red;
}

.loader span {
  animation: loader-2 1.5s ease infinite;
  background: #024;
  border-radius: 50%;
  bottom: 0;
  display: block;
  height: 1.6rem;
  left: 0;
  margin: auto;
  position: absolute;
  right: 0;
  top: 0;
  width: 1.6rem;
}

.loader div::after {
  animation: loader-2 1.5s ease infinite;
  background: #024;
  border-radius: 50%;
  bottom: 0;
  content: '';
  display: block;
  height: 1.6rem;
  left: 0;
  margin: auto;
  position: absolute;
  right: 0;
  top: 3.2rem;
  width: 1.6rem;
}
<div class="splash">
  <div class="loader">
    <span></span>
    <div></div>
  </div>
</div>

我当然可以通过不使用伪元素来解决这个问题,但我仍然想知道导致这个问题的原因。

IE11 不支持伪元素的动画和过渡,请查看此处:

https://caniuse.com/#feat=mdn-css_selectors_after_animation_and_transition_support

要解决此问题,您可以尝试为 div 使用 ID 并为其编写 CSS 并避免使用伪。

修改后的代码:

html {
  font-size: 62.5%;
}

.splash {
  align-items: center;
  display: flex;
  height: 100vh;
  justify-content: center;
  width: 100vw;
}

@keyframes loader-2 {
  0% {
    transform: translateX(0);
  }
  50% {
    transform: translateX(-1.6rem);
  }
  100% {
    transform: translateX(0);
  }
}

.loader {
  display: inline-block;
  height: 3.2rem;
  padding: 4rem 0;
  position: relative;
  width: 3.2rem;
  border: 1px solid red;
}

.loader span {
  animation: loader-2 1.5s ease infinite;
  background: #024;
  border-radius: 50%;
  bottom: 0;
  display: block;
  height: 1.6rem;
  left: 0;
  margin: auto;
  position: absolute;
  right: 0;
  top: 0;
  width: 1.6rem;
}

.loader #abc {
  animation: loader-2 1.5s ease infinite;
  background: #024;
  border-radius: 50%;
  bottom: 0;
  content: '';
  display: block;
  height: 1.6rem;
  left: 0;
  margin: auto;
  position: absolute;
  right: 0;
  top: 3.2rem;
  width: 1.6rem;
}
<div class="splash">
  <div class="loader">
    <span></span>
    <div id="abc"></div>
   
  </div>
</div>

在 IE 11 浏览器中的输出: