В трёхмерных трансформациях в вебе ключевым параметром становится перспектива — свойство, определяющее, насколько глубоко сцена воспринимается зрителем. В контексте Motion One работа с 3D-эффектами строится поверх стандартных возможностей CSS, но с более удобной и управляемой системой анимации.
Перспектива задаётся через perspective и влияет на то,
как элементы, перемещающиеся по оси Z или вращающиеся в пространстве,
будут искажаться относительно точки наблюдения.
.scene {
perspective: 800px;
}
Чем меньше значение, тем сильнее выражен эффект глубины. Большие значения делают сцену «плоской», приближая поведение к 2D.
В Motion One это свойство чаще всего задаётся через стили контейнера, внутри которого происходят трансформации:
import { animate } from "motion"
animate(
".card",
{ rotateY: 180 },
{ duration: 0.8 }
)
Без заданной перспективы вращение будет выглядеть как простое двумерное искажение без ощущения объёма.
CSS предоставляет базовый набор 3D-трансформаций, которые Motion One использует напрямую:
rotateXrotateYrotateZtranslateZКаждая из этих операций воздействует на объект в пространстве, а не на плоскости.
animate(
".box",
{
rotateX: 60,
rotateY: 30,
translateZ: 100
},
{
duration: 1
}
)
Комбинация вращений по нескольким осям создаёт эффект свободного движения объекта в объёме сцены.
Особенно важно учитывать, что translateZ начинает
визуально работать только при наличии перспективы у родительского
контейнера.
Для корректного отображения вложенных 3D-элементов необходимо использовать:
.scene {
transform-style: preserve-3d;
}
Без этого свойства браузер «сплющивает» дочерние элементы в одну плоскость, и любые попытки создать сложные композиции теряют глубину.
Motion One не переопределяет это поведение, поэтому управление остаётся на стороне CSS.
Одним из наиболее выразительных приёмов становится управление осью Z. В отличие от привычных X и Y, эта ось создаёт эффект приближения и удаления объекта.
animate(
".panel",
{
translateZ: [0, 200]
},
{
duration: 1.2,
easing: "ease-in-out"
}
)
При отрицательных значениях элемент уходит «вглубь сцены», уменьшаясь в размере, при положительных — приближается к зрителю.
В сочетании с opacity это позволяет создавать эффекты
появления из глубины:
animate(
".item",
{
translateZ: [-150, 0],
opacity: [0, 1]
},
{ duration: 0.6 }
)
Комбинированные вращения создают наиболее выразительные 3D-анимации. Motion One позволяет задавать значения одновременно для всех осей.
animate(
".cube",
{
rotateX: 360,
rotateY: 360
},
{
duration: 2,
easing: "linear"
}
)
При линейной анимации получается эффект непрерывного вращения объекта в пространстве.
Важно учитывать порядок визуального восприятия: вращение по X создаёт эффект наклона вперёд-назад, по Y — влево-вправо.
Перспектива влияет не только на вращения, но и на масштабирование объектов в пространстве. Элементы, удаляющиеся по оси Z, визуально уменьшаются, создавая эффект глубины сцены.
Контроль перспективы через CSS остаётся базовым способом управления:
.stage {
perspective: 1200px;
perspective-origin: center;
}
Смещение perspective-origin позволяет менять точку
наблюдения, создавая эффект взгляда сбоку или сверху.
Motion One в этом случае анимирует только трансформации, а восприятие глубины полностью зависит от сцены.
При создании многослойных сцен часто комбинируются несколько уровней трансформаций:
preserve-3dПример структуры:
<div class="scene">
<div class="layer">
<div class="object"></div>
</div>
</div>
.scene {
perspective: 900px;
}
.layer {
transform-style: preserve-3d;
}
animate(
".object",
{
rotateY: 45,
translateZ: 80
},
{ duration: 0.7 }
)
Такой подход позволяет строить сцены с несколькими глубинными слоями, где каждый элемент движется в собственном пространстве.
Перспектива может быть анимирована косвенно через изменение CSS-свойств контейнера. Это создаёт эффект «приближения камеры».
animate(
".scene",
{
transform: ["perspective(600px)", "perspective(1400px)"]
},
{
duration: 1
}
)
При уменьшении значения сцена становится более драматичной, при увеличении — более нейтральной и «плоской».
Хотя Motion One работает с transform как строкой, такой подход позволяет эмулировать движение виртуальной камеры.
3D-трансформации являются более ресурсоёмкими, чем 2D-анимации, поэтому важна оптимизация:
will-change: transform.card {
will-change: transform;
}
Motion One использует requestAnimationFrame, что снижает
нагрузку, но сложные сцены всё равно требуют аккуратного подхода.
3D-трансформации часто связываются с курсором или жестами, создавая эффект интерактивной сцены.
animate(
".card",
(progress) => ({
rotateY: progress * 180
}),
{ duration: 1 }
)
При привязке к событиям движения мыши объект может реагировать на положение курсора, усиливая ощущение глубины и физичности сцены.
3D в вебе остаётся визуальной иллюзией, построенной на 2D-рендеринге. Даже при использовании Motion One поведение зависит от браузерного движка.
Основные ограничения:
Несмотря на это, сочетание perspective,
translateZ и вращений позволяет создавать визуально сложные
сцены, которые воспринимаются как полноценное 3D-пространство.