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

#html #css #3d #css-animations #css-transforms

#HTML #css #3D #css-анимация #css-преобразования

Вопрос:

 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» в 3D-пространстве
, прежде чем он полностью поднимется и перевернется, чтобы сделать то же самое с другой стороны. Поскольку родительский div поворачивается на 360 градусов.

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

Ответ №1:

Вам нужно установить 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>