如果在属性的末尾设置了透视图,则CSS 3d转换将不起作用

时间:2018-08-17 08:30:15

标签: css css3 css-transforms

我发现transform属性取决于perspective()的位置

为什么会这样? transform的其他任何规则/限制?

尽管对我来说很奇怪,但这似乎不是一个错误,因为我能够在Chrome / FF中复制它

box:nth-child(1):hover {
  transform: perspective(1000px) translate3d(0, 0, -100px);
}

box:nth-child(2):hover {
  transform: translate3d(0, 0, 100px) perspective(1000px);
}

box {
  padding: 20px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: monospace;
  transition: transform .4s;
  background: rgba(255, 0, 0, 0.3);
  margin: 20px;
  font-size: 12px;
  perspective: 1000px;
  cursor: pointer;
}

box:nth-child(2) {
  background: rgba(0, 0, 255, 0.3);
}
<box>
  transform: perspective(1000px) translate3d(0,0,100px);
</box>
<box>
  transform: translate3d(0,0,100px) perspective(1000px);
</box>

2 个答案:

答案 0 :(得分:3)

在两种情况下,您都应先设置perspective。如果您在末尾添加它,则将首先进行翻译而无需考虑视角。

如果我们参考specification,我们可以看到如何计算转换矩阵:

  

根据变换和   转换来源属性如下:

     
      
  1. 从单位矩阵开始。

  2.   
  3. 通过计算的变换原点的X和Y进行翻译

  4.   
  5. 分别乘以转换属性中的每个转换函数   从左到右

  6.   
  7. 通过求反的转换原点X和Y值进行转换

  8.   

在步骤(3)中可以看到,它是从从左到右(这是另一个问题,您可以在其中获取更多信息并了解订单为何重要:Simulating transform-origin using translate

在要转换的元素内使用perspective属性也没用。

box:nth-child(1):hover {
  transform: perspective(1000px) translate3d(0, 0, -100px);
}

box:nth-child(2):hover {
  transform: perspective(1000px) translate3d(0, 0, 100px);
}

box {
  padding: 20px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: monospace;
  transition: transform .4s;
  background: rgba(255, 0, 0, 0.3);
  margin: 20px;
  /*perspective: 1000px;*/
  font-size: 12px;
  cursor: pointer;
}

box:nth-child(2) {
  background: rgba(0, 0, 255, 0.3);
}
<box>
  transform: perspective(1000px) translate3d(0,0,100px);
</box>
<box>
  transform:  perspective(1000px) translate3d(0,0,100px);
</box>

为避免与订单混淆,您可以在父元素中声明可透视的对象,但您需要注意原点,因为它不会相同:

box:nth-child(1):hover {
  transform:translate3d(0, 0, -100px);
}

box:nth-child(2):hover {
  transform:translate3d(0, 0, 100px);
}
body {
  perspective:1000px;
}
box {
  padding: 20px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: monospace;
  transition: transform .4s;
  background: rgba(255, 0, 0, 0.3);
  margin: 20px;
  font-size: 12px;
  cursor: pointer;
}

box:nth-child(2) {
  background: rgba(0, 0, 255, 0.3);
}
<box>
  transform: perspective(1000px) translate3d(0,0,100px);
</box>
<box>
  transform:  perspective(1000px) translate3d(0,0,100px);
</box>

答案 1 :(得分:1)

尽管另一个答案已经非常清楚地说明了perspective()的工作方式。但是我想让我更具体些。

box:nth-child(1):hover {
  transform: perspective(1000px) translate3d(0, 0, 100px);
}

box:nth-child(2):hover {
  transform: translate3d(0, 0, 100px) perspective(1000px);
}

box:nth-child(3):hover {
  transform: rotate3d(1, 0, 0, 45deg) perspective(1000px) translate3d(0, 0, 100px);
}

box:nth-child(4):hover {
  transform: rotate3d(1, 0, 0, 45deg) translate3d(0, 0, 100px) perspective(1000px);
}

box:nth-child(5):hover {
  transform: rotate3d(1, 0, 0, 45deg) translate3d(0, 0, 100px);
}

box:nth-child(6):hover {
  transform: translate3d(0, 0, 100px) rotate3d(1, 0, 0, 45deg);
}

box:nth-child(7):hover {
  transform: perspective(1000px) rotate3d(1, 0, 0, 45deg) translate3d(0, 0, 100px);
}

box:nth-child(8):hover {
  transform: perspective(1000px) translate3d(0, 0, 100px) rotate3d(1, 0, 0, 45deg);
}

box {
  padding: 20px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-family: monospace;
  transition: transform .4s;
  background: rgba(255, 0, 0, 0.3);
  margin: 20px;
  font-size: 12px;
  perspective: 1000px;
  cursor: pointer;
}

box:nth-child(even) {
  background: rgba(0, 0, 255, 0.3);
}
<box>
  1. transform: perspective(1000px) translate3d(0,0,100px);
</box>
<box>
  2. transform: translate3d(0,0,100px) perspective(1000px);
</box>
<box>
  3. transform: rotate3d(1,0,0,45deg) perspective(1000px) translate3d(0, 0, 100px);
</box>
<box>
  4. transform: rotate3d(1,0,0,45deg) translate3d(0, 0, 100px) perspective(1000px);
</box>
<box>
  5. transform: rotate3d(1,0,0,45deg) translate3d(0, 0, 100px);
</box>
<box>
  6. transform: translate3d(0, 0, 100px) rotate3d(1,0,0,45deg);
</box>
<box>
  7. perspective(1000px) rotate3d(1,0,0,45deg) translate3d(0, 0, 100px);
</box>
<box>
  8. perspective(1000px) translate3d(0, 0, 100px) rotate3d(1,0,0,45deg);
</box>

首先,例如1和2。很明显,显示了perspective()translate3d的工作方式。

但这是否意味着没有perspective()translate3d是没有用的?

不。正如我在第一个命令中提到的那样。

  

不告诉浏览器元素的z位置,如何进行3维平移?


但是,二维怎么样?

看看示例3和5。它们的行为完全不同。

为什么?因为在旋转之后,其z维度不再是窗口的z维度。区块向上移动为100 * cos(45)= 50px

因此,5和6的工作原理完全不同, rotate3d(1,0,0,45deg)translate3d(0, 0, 100px)之间的顺序确实有所不同。

对于7和8,当z-index也可用于该元素时,这一点更加明显。确实有区别。