Зарегистрируйтесь, чтобы продолжить обучение

3D трансформации. Основы CSS: Transform (трансформация объектов)

Сегодня много способов создать 3D на странице, но CSS позволяет это сделать «нативно», то есть без применения сторонних плагинов. В оставшихся уроках этого курса мы рассмотрим все, что связано с трансформациями в трехмерном пространстве. От создания элементов, до их искажений.

Чем двухмерный объект отличается от трехмерного? Если говорить с точки зрения науки, то появляется новая ось координат. В прошлых уроках мы производили трансформации только по двум осям: x и y. В трехмерном пространстве появляется дополнительная ось z, благодаря которой мы можем добавить глубины объекту.

Координаты x, y, z

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

Перспектива

Перспектива указывается у родительского объекта, внутри которого будут находиться элементы с трансформациями. Обратите внимание на следующий пример. В нем для объектов указаны одинаковые стили и одинаковая анимация с одной разницей: одна из сцен имеет перспективу в 800 пикселей. В этом примере обратите внимание на то, как вращаются элементы по оси x. В сцене с перспективой есть глубина и элемент не просто визуально меняет свои размеры, но и видно именно его поворот, в отличие от соседней сцены. В двухмерной сцене такое вращение достигается путем сжимания и разжимания элемента, а не непосредственного его вращения, так как отсутствует дополнительная ось z.

.scene-perspective {
  perspective: 800px;
}

Перспектива в CSS

Управлять перспективой в CSS можно используя свойство perspective. Оно может принимать любое значение, которыми можно определить размер: px, em, rem и так далее. Свойство показывает, на каком расстоянии по оси z располагается элемент.


Важно: чем больше значение, тем дальше элемент находится от зрителя. Это означает, что его трансформации будут менее заметны, чем у объекта, который находится ближе. Но за этим стоит и проблема: малое значение перспективы может деформировать элемент не так, как мы это ожидаем.


.scene-perspective-200 {
  perspective: 200px;
}

.scene-perspective-800 {
  perspective: 800px;
}

.scene-perspective-5000 {
  perspective: 5000px;
}

В этом примере можно заметить, что чем меньше перспектива, тем ближе к нам происходит вращение. При значении в 200 пикселей возникает ощущение, что блок проворачивают прям перед нашими глазами, а значит объект искажается. При перспективе в 5000 пикселей эффект не такой заметный, так как объект очень далеко от нас. Если увеличить значение до размеров в 20000 пикселей, то вращение будет похоже на то, что происходит в двухмерном пространстве.

Точка зрения

Здесь мы говорим не о мыслях, а о действительной точке зрения на объект, то есть о том, в какой позиции мы находимся: слева, справа, сверху, снизу, немного сбоку и так далее. Изменение точки зрения сильно влияет на то, как объект будет трансформироваться. Чтобы в этом убедиться, вы можете взять любой объект в руку и начать его вращать. Постепенно меняйте положение своей головы или объекта и обратите внимание на то, как вы будете видеть то же вращение, но под другим углом.

Точка зрения при использовании перспективы в CSS

Для определения точки зрения используется свойство 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
  • Воспроизведите примеры в реальном мире. Используя подручные предметы вращайте их и меняйте расстояние до объекта и точку зрения

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»
Изображение Тото

Задавайте вопросы, если хотите обсудить теорию или упражнения. Команда поддержки Хекслета и опытные участники сообщества помогут найти ответы и решить задачу