javascript - 使用变换 : scale is not appropriately hiding a div

标签 javascript css reactjs css-animations

我试图在某些 Action 上隐藏带有动画的 div。我对它的初步检查如下所示:

.row {
  height: 50px;
  transition: height 200ms ease-in-out;
  &.hidden {
    height: 0;
  }
}

我的 DOM 结构如下( react ):

<div className={styles.container}>
  <div className={styles.row} />
  <div className={classnames(styles.row, { [styles.hidden]: !this.state.active })}
</div>

虽然这确实有效,但速度非常慢。我听说转换对于 CSS 中的过渡非常有效,所以我决定尝试以下方法。

.row {
  height: 50px;
  transform-origin: top;
  transition: transform 200ms ease-in-out;

  &.hidden {
    transform: scaleY(0);
  }
}

然而,在容器内,第二行仍然显示为一个 50px 的框,但检查员说它的高度为 0。

如何正确应用此转换来隐藏第二个框?

最佳答案

3D 转换非常高效,因为浏览器会将目标元素合成到它们自己的图层中,并将动画卸载到 GPU。 height甚至scaleY()不是 3D 转换,也不会受益于 GPU 加速(CPU 仍在处理它)。

回到你的例子 height ,您可以通过伪造的变换属性(如 transform: translateZ(0);)来强制浏览器使用 GPU 加速。 ( translateZ()translate3d() 的 3D 分量,很像 scaleZ()of scale3d() 的 3D 分量)。

这是一个快速演示:

document.querySelector('button').addEventListener('click', function() {
  document.querySelector('.row').classList.toggle('hidden');
});
.row {
  background-color: green;
  height: 50px;
  overflow: hidden;
  transition: height 200ms ease-in-out;
  transform: translateZ(0); /* or translate3d(0,0,0), rotateZ(360deg), etc. */
}

.row.hidden {
  height: 0;
}

button {
  left: 0;
  position: absolute;
  top: 100px;
}
<div class="row">Some text</div>

<button>Toggle Row Visibility</button>

有了添加的属性,浏览器应该利用 GPU 加速,显着改善动画效果。参见 this question有关转换和 GPU 加速的更多信息。

我会建议先尝试这个,看看它是否足以加快您应用中的动画速度。您也可以尝试添加 will-change 属性,尽管这是工作草案的一部分并且目前是非标准的。

关于javascript - 使用变换 : scale is not appropriately hiding a div,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44050807/

相关文章:

javascript - 基金会不使用 create-react-app

javascript - 跳转到文本区域的下一行,因为我不希望文本到达文本区域的末尾

css - django admin 没有显示一些 css 和表单功能

javascript - 粘性页脚不粘在 AngularJS 中

javascript - 从选定项中添加和删除项目时,如何在 react 选择中捕获添加和删除事件?

node.js - 未找到 Webpack,正在部署到 Heroku

javascript - JQuery .toggle 方法

Javascript 工具提示不随鼠标移动而移动

javascript - 在 jQuery 函数中声明多个 div 选择器

jquery - 将 jquery 验证添加到 ASP.NET MVC 页面中帖子的选择下拉列表