【问题标题】:Transform and Stacking Order变换和堆叠顺序
【发布时间】:2016-11-08 05:44:03
【问题描述】:

我试图了解 CSS 的“3d”世界到底发生了什么。 我做了一个简单的example

尤其是最让我烦恼的代码是:

.back {
    background-color: tomato;
    transform: rotateY(180deg);
    z-index: 1;
}

我不清楚的是为什么当你将鼠标悬停在 .inner 上时,它的背景颜色(金色)不可见?如果从 .back 中删除 transform 属性,或者将 rotateY 设置为 0deg,则 .inner 的金色背景颜色清晰可见。 为什么.back的transform属性会改变堆叠顺序?

从逻辑上讲,子项(.front 和 .back)应该出现在其父项(.inner)的前面。

另外,我想知道当你将 transform-style 设置为 flat 时会发生什么?这是否会使父级及其所有子级折叠成单个“单元”,其中具有最高堆叠顺序的元素具有优先级/可见性?

【问题讨论】:

  • 这个演示更好地解释了它,codepen.io/anon/pen/QErrNm。这次我使用了 translateZ 而不是 z-index。当您将鼠标悬停在 .inner 上时,为什么 .back 会出现在他的父母面前。
  • 你可能期待这个codepen.io/anon/pen/kXopkW
  • 是的,这就是我想要实现的。您能否解释一下为什么在rotateY 之后移动 translateZ 时它的行为会有所不同?另外如何修改它以使用 z-index 而不是 translateZ?谢谢

标签: css z-index css-transforms


【解决方案1】:

在您的代码中:

.outer {
  display: block;
  width: 200px;
  height: 200px;
  border: 2px solid gold;
  perspective: 1000px;
  padding: 10px;
  margin: 0 auto;
}

.inner {
  position: relative;
  height: 100%;
  width: 100%;
  transition: transform 2s linear;
  transform-style: preserve-3d;
  background-color: gold;
  backface-visibility: visible;
  transform: rotateY(50deg);
}

.sides {
  position: absolute;
  width: 100%;
  height: 100%;
  left: 0;
  top: 0;
  color: white;
  backface-visibility: hidden;
}

.front {
  background-color: blue;
  transform: translateZ(20px)
}

.back {
  background-color: tomato;
  transform: rotateY(180deg) translateZ(10px);
}

.inner:hover {
  transform: rotateY(180deg)
}
<div class="outer">
  <div class="inner">
    <div class="sides front">Front Side</div>
    <div class="sides back">Back Side</div>
  </div>
</div>

你正在使用

  transform: rotateY(180deg) translateZ(10px);

变换是从右到左应用的,所以首先它转到前面 10px。但在那之后,它旋转了180度。 (围绕恒定的变换原点)。这使得之前的 10px 朝向后面而不是前面。

如果顺序是相反的

  transform: translateZ(10px) rotateY(180deg);

现在旋转首先完成,因此平移不受它的影响并转到前面。

,抱歉,z-index 不能替代 3-d 变换,如果你想使用 3d 变换,平移是唯一的方法......

在你的第一个例子中,z-index 是没用的,很容易看出

codepen with z-index removed

这有效,因为您正在设置

backface-visibility: hidden;

所以只有朝前的脸才会可见

【讨论】:

  • 谢谢,就是这样。它很清楚,也很有意义。关于 z-index 的还有一件事。在第一个示例中,未使用 translateZ,仅使用 z-index,我想知道为什么当您将鼠标悬停在该元素上时,.back 出现在 .inner 前面?感谢 Vals,我是一个新(bie)用户,所以即使你应得的,我也不能赞成你的回应。
  • 谢谢,但是 .inner 在悬停时会旋转并且它具有背面可见性:可见,为什么旋转时不显示其金色背景?
  • 无论如何,非常感谢您的帮助,答案已标记为已批准。
  • 对不起,我没有注意内部,我只看正面和背面......这种情况下,如果没有进一步的说明,孩子们会在父母之上画。此外,在某些情况下,z-index 仍然可以工作。但是,如果您真的想在 3d 中工作,请尝试坚持使用转换和平移来设置元素的正确可视化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-31
  • 2019-10-22
  • 2015-12-07
相关资源
最近更新 更多