Сегодня много способов создать 3D на странице, но CSS позволяет это сделать «нативно», то есть без применения сторонних плагинов. В оставшихся уроках этого курса мы рассмотрим все, что связано с трансформациями в трехмерном пространстве. От создания элементов, до их искажений.
Чем двухмерный объект отличается от трехмерного? Если говорить с точки зрения науки, то появляется новая ось координат. В прошлых уроках мы производили трансформации только по двум осям: x и y. В трехмерном пространстве появляется дополнительная ось z, благодаря которой мы можем добавить глубины объекту.
В процессе прохождения второй части курса мы научимся работать с осью z, и для того, чтобы увидеть основные изменения в стилях вводится понятие перспективы, то есть расстояние между экраном и расположением элемента в глубине по оси z. Именно перспектива является тем, на что опирается мозг для определения трехмерности объекта.
Перспектива
Перспектива указывается у родительского объекта, внутри которого будут находиться элементы с трансформациями. Обратите внимание на следующий пример. В нем для объектов указаны одинаковые стили и одинаковая анимация с одной разницей: одна из сцен имеет перспективу в 800 пикселей. В этом примере обратите внимание на то, как вращаются элементы по оси x. В сцене с перспективой есть глубина и элемент не просто визуально меняет свои размеры, но и видно именно его поворот, в отличие от соседней сцены. В двухмерной сцене такое вращение достигается путем сжимания и разжимания элемента, а не непосредственного его вращения, так как отсутствует дополнительная ось z.
.scene-perspective {
perspective: 800px;
}
Управлять перспективой в CSS можно используя свойство perspective
. Оно может принимать любое значение, которыми можно определить размер: px
, em
, rem
и так далее. Свойство показывает, на каком расстоянии по оси z располагается элемент.
Важно: чем больше значение, тем дальше элемент находится от зрителя. Это означает, что его трансформации будут менее заметны, чем у объекта, который находится ближе. Но за этим стоит и проблема: малое значение перспективы может деформировать элемент не так, как мы это ожидаем.
.scene-perspective-200 {
perspective: 200px;
}
.scene-perspective-800 {
perspective: 800px;
}
.scene-perspective-5000 {
perspective: 5000px;
}
В этом примере можно заметить, что чем меньше перспектива, тем ближе к нам происходит вращение. При значении в 200 пикселей возникает ощущение, что блок проворачивают прям перед нашими глазами, а значит объект искажается. При перспективе в 5000 пикселей эффект не такой заметный, так как объект очень далеко от нас. Если увеличить значение до размеров в 20000 пикселей, то вращение будет похоже на то, что происходит в двухмерном пространстве.
Точка зрения
Здесь мы говорим не о мыслях, а о действительной точке зрения на объект, то есть о том, в какой позиции мы находимся: слева, справа, сверху, снизу, немного сбоку и так далее. Изменение точки зрения сильно влияет на то, как объект будет трансформироваться. Чтобы в этом убедиться, вы можете взять любой объект в руку и начать его вращать. Постепенно меняйте положение своей головы или объекта и обратите внимание на то, как вы будете видеть то же вращение, но под другим углом.
Для определения точки зрения используется свойство perspective-origin
. По своим значением оно схоже со свойством transform-origin
, только теперь определяется не точка трансформации, а точка, с которой мы наблюдаем трансформацию. По умолчанию такой точкой является центр объекта, которое записывается так:
.object {
perspective-origin: 50% 50%;
}
В примере выше для каждого блока использовано только одно из трех значений. Обратите внимание на то, как меняется восприятие от вращения объекта при разных точках зрения.
.scene-perspective {
perspective: 800px;
}
.perspective-left {
perspective-origin: left;
}
.perspective-center {
perspective-origin: center;
}
.perspective-right {
perspective-origin: right;
}
Важно: свойство perspective-origin
используется для контейнера, внутри которого находятся трансформируемые элементы. Если для разных элементов вам нужны разные точки зрения, то используйте несколько контейнеров. В примерах выше свойства perspective
и perspective-origin
не будут работать, если указать значения у селектора .box
Самостоятельная работа
- Скопируйте все примеры из текущего урока и изменяйте значения свойств
perspective
иperspective-origin
- Воспроизведите примеры в реальном мире. Используя подручные предметы вращайте их и меняйте расстояние до объекта и точку зрения
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.