【问题标题】:Chrome CSS bug: "translate3d" inside a rotated element does not obey "overflow: hidden"Chrome CSS 错误:旋转元素内的“translate3d”不遵守“溢出:隐藏”
【发布时间】:2015-09-01 05:10:49
【问题描述】:

看看这个CodePen,看看我的意思:

.perspective-container {
  margin: 50px 0;
  perspective: 1000px;
  perspective-origin: 0 50%;
}
.card {
  border: 10px solid blue;
  width: 300px;
  height: 300px;
  overflow: hidden;
  transform: rotateY(-45deg);
}
.card-inner {
  width: 300px;
  height: 300px;
  overflow: hidden;
}
.scroller {
  transform: translate(0, -100px);
}
.scroller-3d {
  transform: translate3d(0, -100px, 0);
}
.will-change {
  will-change: transform;
}
<h1>Incorrect (uses will-change):</h1>
<div class="perspective-container">
  <div class="card"><div class="card-inner">
    <div class="scroll-container">
      <div class="scroller will-change">
        <img src="https://images2.pixlis.com/background-image-horizontal-lines-and-stripes-seamless-tileable-grey-black-22hnju.png" />
      </div>
    </div>
  </div></div>
</div>
<h1>Incorrect (uses translate3d):</h1>
<div class="perspective-container">
  <div class="card">
    <div class="scroll-container">
      <div class="scroller-3d">
        <img src="https://images2.pixlis.com/background-image-horizontal-lines-and-stripes-seamless-tileable-grey-black-22hnju.png" />
      </div>
    </div>
  </div>
</div>
<h1>Correct (uses neither translate3d or will-change):</h1>
<div class="perspective-container">
  <div class="card">
    <div class="scroll-container">
      <div class="scroller">
        <img src="https://images2.pixlis.com/background-image-horizontal-lines-and-stripes-seamless-tileable-grey-black-22hnju.png" />
      </div>
    </div>
  </div>
</div>

我有一个应用了透视的旋转元素,其中我有一个垂直转换的“滚动”div(想象一下杂志翻页体验,每个页面内都有滚动 div)。我在内部 div 中添加了 will-change: transform,这破坏了外部容器 overflow: hidden。这似乎是 Chrome 合成器的一个错误。

有人知道任何解决方法吗?我想保留 will-change 属性,因为它显着加快了移动 Chrome 上的动画速度。

编辑: 看起来这不是特定于 will-change 属性,而是任何使内部 div 成为自己的合成层的属性。当我删除 will-change 属性但将转换更改为 translate3d 时,这同样可以提高性能并显示错误。内部 div 上唯一允许旋转的父对象正确渲染 overflow: hidden 的类是添加 2D 变换的类。

【问题讨论】:

  • 为了让事情变得更复杂,我尝试了transform: translateZ(0); 而不是translate3d,它掩盖了图形的顶部而不是底部!

标签: css google-chrome css-transforms will-change


【解决方案1】:

试试这样的CodePen:

.container {
  margin: 75px 0;
}

.card {
  border: 10px solid blue;
  width: 300px;
  height: 300px;
  overflow: hidden;
  -webkit-transform: perspective(1000px) rotateY(-45deg);
  transform: perspective(1000px) rotateY(-45deg);
  -webkit-transform-origin: 0 50%;
  transform-origin: 0 50%;
}

.scroller {
  -webkit-transform: translate(0, -100px);
  transform: translate(0, -100px);
}

.scroller-3d {
  -webkit-transform: translate3d(0, -100px, 0);
  transform: translate3d(0, -100px, 0);
}

.will-change {
  will-change: transform;
}
<h1>Uses will-change:</h1>
<div class="container">
  <div class="card">
    <div class="scroll-container">
      <div class="scroller will-change">
        <img src="https://images2.pixlis.com/background-image-horizontal-lines-and-stripes-seamless-tileable-grey-black-22hnju.png" />
      </div>
    </div>
  </div>
</div>

<h1>Uses translate3d:</h1>
<div class="container">
  <div class="card">
    <div class="scroll-container">
      <div class="scroller-3d">
        <img src="https://images2.pixlis.com/background-image-horizontal-lines-and-stripes-seamless-tileable-grey-black-22hnju.png" />
      </div>
    </div>
  </div>
</div>

<h1>Uses neither translate3d or will-change:</h1>
<div class="container">
  <div class="card">
    <div class="scroll-container">
      <div class="scroller">
        <img src="https://images2.pixlis.com/background-image-horizontal-lines-and-stripes-seamless-tileable-grey-black-22hnju.png" />
      </div>
    </div>
  </div>
</div>

您可以使用 perspective()transform-origin 值。

【讨论】:

  • 谢谢谢尔盖!所以解决方法是在卡片元素的变换中使用透视图,而不是容器上的透视图属性。我对为什么会解决它很感兴趣,我会研究这两种方法之间的区别,但这完美地解决了我的问题。再次感谢!
猜你喜欢
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 2015-04-16
  • 1970-01-01
  • 2015-09-07
  • 2017-08-30
  • 1970-01-01
  • 2020-03-02
相关资源
最近更新 更多