Search code examples
htmlcsscss-transforms

Why z-axis doesn't work in transform-origin property?


As I think, the point, which x-axis coordinate is 100% and y-axis coordinate is 0 should move along z-axis by 60px. Why didn't it happen?

So, this is my code. Thank you in advance.

.block {
  margin: 50px;
  display: inline-block;
  width: 200px;
  height: 200px;
  background: pink;
  outline: 1px solid black;
  transform-origin: 100% 0 60px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.block:hover {
  transform: rotate(15deg);
}
<div class="block">Hello!</div>


Solution

  • You will see no effect without perspective.

    Below an example with and without persepctive to see the difference:

    .block {
      margin: 20px;
      display: inline-flex;
      width: 100px;
      height: 100px;
      background: pink;
      outline: 1px solid black;
      transform-origin: 100% 0 60px;
      justify-content: center;
      align-items: center;
    }
    
    .block:hover {
      transform:perspective(var(--p,0px)) rotate(15deg);
    }
    <div class="block">Hello!</div>
    
    <div class="block" style="--p:100px">Hello!</div>

    And if your remove the z-axis value the perspective will also have no effect:

    .block {
      margin: 20px;
      display: inline-flex;
      width: 100px;
      height: 100px;
      background: pink;
      outline: 1px solid black;
      transform-origin: 100% 0 0;
      justify-content: center;
      align-items: center;
    }
    
    .block:hover {
      transform:perspective(var(--p,0px)) rotate(15deg);
    }
    <div class="block">Hello!</div>
    
    <div class="block" style="--p:100px">Hello!</div>

    specifies a perspective projection matrix. This matrix scales points in X and Y based on their Z value, scaling points with positive Z values away from the origin, and those with negative Z values towards the origin. Points on the z=0 plane are unchanged. The parameter represents the distance of the z=0 plane from the viewer. Lower values give a more flattened pyramid and therefore a more pronounced perspective effect. ref

    From the above, you can consider the use of perspective and the z-axis of transform-origin to simulate translateZ()

    .block {
      margin: 20px;
      display: inline-flex;
      width: 100px;
      height: 100px;
      background: pink;
      outline: 1px solid black;
      justify-content: center;
      align-items: center;
    }
    <div style="display:inline-block;perspective:200px;">
    <div class="block" style="
      transform:translateZ(-50px);
    ">Hello!</div>
    </div>
    
    
    <div class="block" style="
      transform-origin: 50% 50% 50px;
      transform:perspective(200px);
    ">Hello!</div>