Почему не работает 3d трансформация?

Эксперементировал с трансформациями, но почему-то 3d не работает. Что не так?

HTML:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="style.css">
</head>

<!-- https://fls.guru/transform.html -->

<body>

    <div class="block"></div>
    <div class="block2"></div>

</body>

</html>

СSS:

/* https://fls.guru/transform.html */

.block {
    display: block;
    margin: 250px auto 0;
    width: 200px;
    height: 200px;
    background-color: black;

    /* transform: rotate(90deg); */
    /* transform: scale(0.2, 2); */
    /* transform: skew(10deg, 10deg); */
    /* transform: matrix(1.2, 0, 0, 1.2, 0, 0); */

    /* transform-origin: 0 0;
    transform: rotate(45deg); */

    perspective: 400px;
}

/* .block:hover {

} */


/* .block2 {
    display: block;
    margin: 0 auto;
    width: 200px;
    height: 200px;
    background-color: rgba(0, 0, 0, 0.319);
    margin-top: -200px;
} */

Заранее Спасибо за помощь


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

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

Дело в том, что perspective нужно применять к родительскому элементу, в данном случае к body. Но лучше создать отдельный элемент-обертку.

Свойство perspective как бы задает расстояние между плоскостью, к которому применено свойство, и пользователем, и все потомки этого элемента будут отталкиваться от этого расстояния для трансформации.

Ниже небольшая дэмка с объяснениями для понимания.

Есть 2 блока с классами perspective-high и perspective-low с потомками block.

У этих классов заданы разные значения perspective, 400px и 100px соответственно. Повесим на каждый block функции трансформации, translateZ().

.perspective-high > .block:hover {
  transform: translateZ(100px);
}
.perspective-low > .block:hover {
  transform: translateZ(50px);
}

Теперь при наведении на каждый из элементов block можно заметить, что блок к которому было применен небольшой сдвиг, всего 40px, приближается намного ближе, т.к точка perspective изначально ближе к плоскости.

 --- perspective 400px
  |
  |                              
  |                               
  |
  |
 --- translateZ(100px)          --- perspective 100px
  |                              |
  |                             --- translateZ(50px)
  |                              |
 --- translateZ(0px) плоскость  ---------------------------

/* https://fls.guru/transform.html */

body {
  margin: 0;
}

.perspective-high, .perspective-low {
  margin: 0;
  position: fixed;
  width: 50vw;
  height: 100vh;
  perspective-origin: 30% 30%; /*сдвиг точки*/
}

.perspective-high {
  z-index: 1;
  perspective: 400px;
  left: 0;
  border-right: 2px solid black; 
}
.perspective-low {
  z-index: 0;
  right: 0;
  perspective: 100px;
}


.block {
  display: block;
  position: absolute;
  width: 200px;
  height: 200px;
  transform-style: preserve-3d;
  transition: .3s ease;
  inset: 10%;
}

.perspective-high > .block {
  background-color: black;
}

.perspective-low > .block {
  background-color: rgba(0, 0, 0, 0.319);
}

.perspective-high > .block:hover {
  transform: translateZ(100px);
}
.perspective-low > .block:hover {
  transform: translateZ(50px);
}
<html lang="en">

  <head>
      <meta charset="UTF-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
      <link rel="stylesheet" href="style.css">
  </head>

  <!-- https://fls.guru/transform.html -->

  <body>
    <div class="perspective-high">
      <div class="block"></div>
    </div>
    <div class="perspective-low">
      <div class="block"></div>
    </div>
  </body>
</html>

Так что ваша ошибка лишь в том, что вы применяете perspective непосредственно к block, а не к его родителю.

→ Ссылка