【问题标题】:CSS transition stutters after being applied to element with CSS animation应用到带有 CSS 动画的元素后,CSS 过渡会卡住
【发布时间】:2014-06-29 03:35:45
【问题描述】:

我正在构建一个 AngularJS 应用程序,它通过转换元素的不透明度来显示和隐藏元素。该元素也通过应用 CSS 关键帧动画进行旋转。我遇到的问题是过渡或动画卡顿。

当元素的不透明度为 1 并且过渡将其淡出为 0 时,该元素似乎向后退了几帧。这在 GIF 中得到了更好的展示。您可以看到它在不透明度更改之前跳回。

这是我的 CSS。

.square {
  width: 100px;
  height: 100px;
  margin: 50px;
  background: black;
}

.appear.ng-hide-add {
   -webkit-transition: opacity 300ms linear;
  opacity: 1;
}

.appear.ng-hide-add.ng-hide-add-active {
  opacity: 0;
}

.appear.ng-hide-remove {
  -webkit-transition: opacity 300ms linear;
  opacity: 0;
}

.appear.ng-hide-remove.ng-hide-remove-active {
  opacity: 1;
}

@-webkit-keyframes rotate {
  from {
    -webkit-transform: rotate(0deg);
  }

  to {
    -webkit-transform: rotate(360deg);
  }
}

.rotate {
  -webkit-animation: rotate 1.5s infinite linear;  
}

这是我的 HTML。

<div ng-app="app" ng-init="show = true">
  <p>Toggle the opacity of the square. Sometimes the rotation is interrupted when the opacity transitions from 1 to 0.</p>
  <button ng-click="show =!show">Toggle</button>
  <div class="square appear rotate" ng-show="show"></div>
</div>

你可以在这个codepen 中玩所有的东西。希望有人能指出我正确的方向。

【问题讨论】:

标签: css angularjs transform transition


【解决方案1】:

这里还有另一种解决方法,只是为了好玩。比我建议的第一个要丑一些。更改框背景颜色不透明度:http://codepen.io/anon/pen/DpuEh

HTML:

<div ng-app="app" ng-init="show = true">
  <button ng-click="show = !show">Toggle</button>
  <div class="square appear rotate" ng-class="{'hidden': !show}"></div>
</div>

CSS:

.square {
  width: 100px;
  height: 100px;
  margin: 50px;
   -webkit-transition: background 300ms linear;
  background: black;
}

.square.hidden {
  background: rgba(0, 0, 0, 0);
}

我使用rgba 来设置背景不透明度。在这种简单的情况下,只需将背景设置为 white 也可以。

【讨论】:

  • 谢谢亨利克。将此更改为该问题的公认答案,因为它是 100% CSS 解决方案。如果您可以利用 jQuery,您可能需要考虑包装 .animate。第一次更平滑,之后完全平滑。见gist.github.com/tatey/3f1933d2d6d8b4dbe801
【解决方案2】:

这显然是一个 WebKit 错误。这显然不是 CSS 的行为方式,如果您删除供应商前缀,它在 Firefox 中的行为确实符合预期。您会注意到,当应用额外的动画/过渡时,动画会重置。这类似于最近修复的一个已知错误,在该错误中,在不同时间应用多个 CSS 过渡会导致布局闪烁。我建议将错误报告给 WebKit 团队以便修复。

【讨论】:

  • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。您也可以add a bounty 引起更多关注。
  • @ccjmne 这不是解决办法,但我试图按照他的要求为他指明正确的方向。这显然是一个浏览器错误,应该报告给 WebKit 团队。
  • 我不是在批评他的问题或要求澄清,我是在告诉他他没有做错任何事情,这显然是一个错误,类似于过去已知的错误,应该报告。如果不清楚,我已经澄清了我的答案。
  • 我将在 webkit 项目中提出一个错误并从这里链接回它。感谢您的建议。
【解决方案3】:

丑陋的解决方法可能适合也可能不适合,具体取决于您的情况:您可以在其顶部淡入背景色元素,而不是隐藏元素 (shows the bug) 或容器 (also shows the bug) .

HTML:

<div ng-app="app" ng-init="show = false">
  <button ng-click="show =!show">Toggle</button>
  <div class="appear" ng-show="show"></div>
  <div class="square rotate"></div>
</div>

CSS:

.appear {
  background: white;
  width: 200px;
  height: 200px;
  position: absolute;
  top: 30px;
  left: 0;
  z-index: 2;
}

显然,您可能需要更复杂的 CSS 来实现更复杂的布局,但希望您能理解。

代码笔:http://codepen.io/anon/pen/IwBHj

【讨论】:

  • 丑陋,但天才。幸运的是,它目前包含在一个模板中。如果需要重用它,我会考虑将其包装在指令中。谢谢!
【解决方案4】:

我会考虑在变换上使用 translate3D 来强制硬件加速。

    -webkit-transform: translate3d(0,0,0);

这使用硬件加速 (GPU) 进行 CSS 过渡。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-14
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2018-04-20
    • 2016-02-23
    相关资源
    最近更新 更多