Chrome CSS错误:旋转元素中的"translate3d"不遵循"overflow:hidden"

Dua*_*low 14 css google-chrome css3 css-transforms will-change

看看这个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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

我有一个带有透视的旋转元素,在其中我有一个'滚动'div,它是垂直变换的(想象一下杂志翻页体验,每页内有滚动的div).我添加will-change: transform到内部div,打破了外部容器overflow: hidden.这似乎是Chrome合成器的一个错误.

有谁知道任何变通方法?我想保留该will-change属性,因为它可以显着提高移动Chrome上的动画效果.

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

Ser*_*sov 3

尝试像这样的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;
}
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

你可以玩弄perspective()transform-origin价值观。

  • 谢谢谢尔盖!因此,解决方法是在卡片元素的变换中使用透视,而不是容器上的透视属性。我对为什么可以解决这个问题感兴趣,我将研究两种方法之间的区别,但这完美地解决了我的问题。再次感谢! (2认同)