You should make the perspective
first in both cases. If you add it at the end the translation will be first made without considering the perspective.
If we refer to the specification we can see how the transformation matrix is computed:
The transformation matrix is computed from the transform and
transform-origin properties as follows:
Start with the identity matrix.
Translate by the computed X and Y of transform-origin
Multiply by each of the transform functions in transform property from
left to rightTranslate by the negated computed X and Y values of transform-origin
As you can see in the step (3), it’s from left to right (here is another question where you can get more information and see why order is important: Simulating transform-origin using translate)
It also useless to use the perspective property within the element you want to transform.
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>
To avoid any confusion with order you can declare the persepective within a parent element BUT you need to pay attention to the origin as it won’t be the same:
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>