Повернуть дочерний div перпендикулярно родительскому div в трехмерном пространстве

html {
  font-size: 0.7rem;
}
div div {
  top: 5rem;
  background-color: #444;
  transform-origin: top center;
}

.rotate_x {
  animation-name: rotate_x;
}
@keyframes rotate_x {
  0% {
    transform: rotateX( 0deg );
  }
  100% {
    transform: rotateX( 360deg );
  }
}

.rotate_y {
  animation-name: rotate_y;
}
@keyframes rotate_y {
  0% {
    transform: rotateY( 0deg );
  }
  100% {
    transform: rotateY( 180deg );
  }
}
<style>
  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    animation-duration: 5s;
    animation-iteration-count: infinite;
    animation-timing-function: linear;
  }
  html, body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    width: 100%;
  }
  body {
    perspective: 5rem;
  }
  div {
    position: relative;
    top: -1.5rem;
    width: 5rem;
    height: 5rem;
    background-color: #222;
    border-radius: 0.5rem;
  }
</style>

<div class='rotate_y'>
  <div class='rotate_x'>
  </div>
</div>

Серый нижний div, не вращается перпендикулярно к черному верхнему div, как это было задумано. Вместо этого нижний серый div, сжимается, пока не приобретет отрицательное значение и не станет инвертированным.

Желаемый результат - нижний серый блок div должен вращаться вверх, как на шарнире. Представьте L-образную форму в трехмерном пространстве, прежде чем она поднимется полностью и перевернется, чтобы сделать то же самое с другой стороны, поскольку родительский div вращается на 360 градусов.

Как я могу заставить нижний div создать L-образную форму, поскольку он соединяется с его родительским div?

Свободный перевод вопроса Rotate child div perpendicular to parent div in 3D space от участника @dev sandbox.


Ответы (1 шт):

Автор решения: Alexandr_TT

Вам нужно установить transform-style и немного увеличить перспективу:

html {
  font-size: 0.7rem;
}
div div {
  top: 5rem;
  background-color: #444;
  transform-origin: top center;
}

.rotate_x {
  animation-name: rotate_x;
}
@keyframes rotate_x {
  0% {
    transform: rotateX( 0deg );
  }
  100% {
    transform: rotateX( 360deg );
  }
}

.rotate_y {
  animation-name: rotate_y;
  transform-style:preserve-3d; /* HERE */
}
@keyframes rotate_y {
  0% {
    transform: rotateY( 0deg );
  }
  100% {
    transform: rotateY( 180deg );
  }
}
<style>
  * {
    box-sizing: border-box;
    margin: 0;
    padding: 0;
    animation-duration: 5s;
    animation-iteration-count: infinite;
    animation-timing-function: linear;
  }
  html, body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100%;
    width: 100%;
  }
  body {
    perspective: 15rem;
  }
  div {
    position: relative;
    top: -1.5rem;
    width: 5rem;
    height: 5rem;
    background-color: #222;
    border-radius: 0.5rem;
  }
</style>

<div class='rotate_y'>
  <div class='rotate_x'>
  </div>
</div>

Свободный перевод ответа от участника @Temani Afif.

→ Ссылка