我发现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>
答案 0 :(得分:3)
在两种情况下,您都应先设置perspective
。如果您在末尾添加它,则将首先进行翻译而无需考虑视角。
如果我们参考specification,我们可以看到如何计算转换矩阵:
根据变换和 转换来源属性如下:
从单位矩阵开始。
通过计算的变换原点的X和Y进行翻译
分别乘以转换属性中的每个转换函数 从左到右
通过求反的转换原点X和Y值进行转换
在步骤(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也可用于该元素时,这一点更加明显。确实有区别。