0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В уроках посвящённых трансформации двухмерных объектов мы научились использовать несколько видов трансформации:</p>
1
<p>В уроках посвящённых трансформации двухмерных объектов мы научились использовать несколько видов трансформации:</p>
2
<ul><li>Перемещение. За это отвечает функция translate()</li>
2
<ul><li>Перемещение. За это отвечает функция translate()</li>
3
<li>Вращение. Для этого использовалась функция rotate()</li>
3
<li>Вращение. Для этого использовалась функция rotate()</li>
4
<li>Масштабирование с использованием функции scale()</li>
4
<li>Масштабирование с использованием функции scale()</li>
5
</ul><p>Трансформации трехмерных объектов не отличаются по своему функционалу. Мы так же можем использовать только эти типы, но для них существует специальный синтаксис. Чтобы браузеру было легче, при трансформации трехмерных объектов к названию функции дописывается 3d. Таким образом мы получаем 3 функции для трехмерных элементов:</p>
5
</ul><p>Трансформации трехмерных объектов не отличаются по своему функционалу. Мы так же можем использовать только эти типы, но для них существует специальный синтаксис. Чтобы браузеру было легче, при трансформации трехмерных объектов к названию функции дописывается 3d. Таким образом мы получаем 3 функции для трехмерных элементов:</p>
6
<ul><li>translate3d() - перемещение</li>
6
<ul><li>translate3d() - перемещение</li>
7
<li>rotate3d() - вращение</li>
7
<li>rotate3d() - вращение</li>
8
<li>scale3d() - масштабирование</li>
8
<li>scale3d() - масштабирование</li>
9
</ul><p>Единственная трансформация, которая отсутствует для оси<em>z</em>- skew()</p>
9
</ul><p>Единственная трансформация, которая отсутствует для оси<em>z</em>- skew()</p>
10
<h2>transform-style</h2>
10
<h2>transform-style</h2>
11
<p>Для корректной демонстрации всех этих трансформаций необходимо иметь настоящий трехмерный объект, а не только ось<em>z</em>. В качестве каноничного примера используют куб. Для его создания понадобится воспользоваться новым свойством, а именно transform-style, которое принимает одно из двух значений:</p>
11
<p>Для корректной демонстрации всех этих трансформаций необходимо иметь настоящий трехмерный объект, а не только ось<em>z</em>. В качестве каноничного примера используют куб. Для его создания понадобится воспользоваться новым свойством, а именно transform-style, которое принимает одно из двух значений:</p>
12
<ul><li>flat. Значение по умолчанию. Оно говорит о том, что элемент находится в той же плоскости, что и его родитель. Именно так мы видим элементы в большинстве случаев и в предыдущих уроках в частности</li>
12
<ul><li>flat. Значение по умолчанию. Оно говорит о том, что элемент находится в той же плоскости, что и его родитель. Именно так мы видим элементы в большинстве случаев и в предыдущих уроках в частности</li>
13
<li>preserve-3d - элемент как бы находится в своём трехмерном пространстве, а не в пространстве своего родителя. Это означает, что элементы будут независимы друг друга. Например, они могут проходить сквозь друг друга</li>
13
<li>preserve-3d - элемент как бы находится в своём трехмерном пространстве, а не в пространстве своего родителя. Это означает, что элементы будут независимы друг друга. Например, они могут проходить сквозь друг друга</li>
14
</ul><p>Вначале это может немного запутать, но проще всего взглянуть на оба значения в контексте примера:</p>
14
</ul><p>Вначале это может немного запутать, но проще всего взглянуть на оба значения в контексте примера:</p>
15
<p><a>https://codepen.io/hexlet/pen/abwPYMr</a></p>
15
<p><a>https://codepen.io/hexlet/pen/abwPYMr</a></p>
16
<p>В левом примере зелёный блок находится выше красного, это объясняется тем, что элементы находятся в одном двухмерном пространстве и зависят друг от друга. Как бы вы не трансформировали зелёный блок он никак не сможет взаимодействовать с красным блоком, так как находится перед ним.</p>
16
<p>В левом примере зелёный блок находится выше красного, это объясняется тем, что элементы находятся в одном двухмерном пространстве и зависят друг от друга. Как бы вы не трансформировали зелёный блок он никак не сможет взаимодействовать с красным блоком, так как находится перед ним.</p>
17
<p>В правом примере значение preserve-3d для красного блока создает собственный контекст объёмного пространства. Все дочерние элементы не просто существуют рядом друг с другом, а находятся в едином трехмерном пространстве, что позволяет элементам проходить друг через друга и перемещаться относительно общих осей.</p>
17
<p>В правом примере значение preserve-3d для красного блока создает собственный контекст объёмного пространства. Все дочерние элементы не просто существуют рядом друг с другом, а находятся в едином трехмерном пространстве, что позволяет элементам проходить друг через друга и перемещаться относительно общих осей.</p>
18
<p>Проще всего думать об этом так, что flat создает единое двухмерное пространство, а preserve-3d трехмерное. Это добавляет новые возможности по расположению элементов друг с другом.</p>
18
<p>Проще всего думать об этом так, что flat создает единое двухмерное пространство, а preserve-3d трехмерное. Это добавляет новые возможности по расположению элементов друг с другом.</p>
19
<p><strong>Важно:</strong>свойство transform-style устанавливается единожды для<em>родительского</em>элемента. Так как свойство отвечает за создание пространства, то нет смысла в установке свойства дочерним элементам. В примере выше таким блоком стал красный элемент. Так же важно помнить, что речь идёт о прямых потомках. Если добавить новый элемент внутрь зелёного блока, то для него пространство будет определяться значением flat</p>
19
<p><strong>Важно:</strong>свойство transform-style устанавливается единожды для<em>родительского</em>элемента. Так как свойство отвечает за создание пространства, то нет смысла в установке свойства дочерним элементам. В примере выше таким блоком стал красный элемент. Так же важно помнить, что речь идёт о прямых потомках. Если добавить новый элемент внутрь зелёного блока, то для него пространство будет определяться значением flat</p>
20
<p>Теперь настало время узнать, как работают уже знакомые трансформации, но в трехмерном пространстве. В качестве примера возьмём самый примитивный трехмерный объект - куб. Все его грани сделаны полупрозрачными, чтобы легче было ориентироваться как он выглядит в пространстве. Сейчас же мы смотрим ровно в его центральную точку передней грани. Это будет начальной позицией при любой трансформации, которую мы сделаем ниже. Вы же можете менять начальную точку используя свойство perspective-origin - это будет давать чуть другой эффект, так как взгляд будет немного под другим углом, в прямом смысле этого слова.</p>
20
<p>Теперь настало время узнать, как работают уже знакомые трансформации, но в трехмерном пространстве. В качестве примера возьмём самый примитивный трехмерный объект - куб. Все его грани сделаны полупрозрачными, чтобы легче было ориентироваться как он выглядит в пространстве. Сейчас же мы смотрим ровно в его центральную точку передней грани. Это будет начальной позицией при любой трансформации, которую мы сделаем ниже. Вы же можете менять начальную точку используя свойство perspective-origin - это будет давать чуть другой эффект, так как взгляд будет немного под другим углом, в прямом смысле этого слова.</p>
21
<p><a>https://codepen.io/hexlet/pen/mdwYxEL</a></p>
21
<p><a>https://codepen.io/hexlet/pen/mdwYxEL</a></p>
22
<h2>Перемещение</h2>
22
<h2>Перемещение</h2>
23
<p>Для перемещения трехмерных объектов используются функции:</p>
23
<p>Для перемещения трехмерных объектов используются функции:</p>
24
<ul><li>translateX()</li>
24
<ul><li>translateX()</li>
25
<li>translateY()</li>
25
<li>translateY()</li>
26
<li>translateZ()</li>
26
<li>translateZ()</li>
27
</ul><p>и их "старший брат" - translate3d(x, y, z). Оно просто объединяет все три функции для удобства написания. Следующие две записи равнозначны:</p>
27
</ul><p>и их "старший брат" - translate3d(x, y, z). Оно просто объединяет все три функции для удобства написания. Следующие две записи равнозначны:</p>
28
<p>Перемещение по координатам<em>x</em>и<em>y</em>достаточно очевидны. А как происходит перемещение по оси<em>z</em>? Браузер, при изменении положения по оси<em>z</em>перемещает элемент ближе или дальше от начального месторасположения. При этом, если элемент перемещается дальше, то он уменьшается, а если перемещается ближе, то увеличивается. Такой эффект можно рассмотреть на самом кубе. Передняя и задняя стенка куба располагаются с использованием функции translateZ(). В примере ниже были убраны все грани кроме фронтальной и задней, а также куб был немного развернут.</p>
28
<p>Перемещение по координатам<em>x</em>и<em>y</em>достаточно очевидны. А как происходит перемещение по оси<em>z</em>? Браузер, при изменении положения по оси<em>z</em>перемещает элемент ближе или дальше от начального месторасположения. При этом, если элемент перемещается дальше, то он уменьшается, а если перемещается ближе, то увеличивается. Такой эффект можно рассмотреть на самом кубе. Передняя и задняя стенка куба располагаются с использованием функции translateZ(). В примере ниже были убраны все грани кроме фронтальной и задней, а также куб был немного развернут.</p>
29
<p><a>https://codepen.io/hexlet/pen/QWgRZKQ</a></p>
29
<p><a>https://codepen.io/hexlet/pen/QWgRZKQ</a></p>
30
<p>Грани имеют следующие свойства:</p>
30
<p>Грани имеют следующие свойства:</p>
31
<p>Для достижения эффекта куба фронтальная грань была перемещена по оси<em>z</em>на 150 пикселей ближе к пользователю. Это привело к побочному эффекту: грань теперь имеет размер не 300x300 пикселей, как указано, а 382x382 пикселя. Как можно понять, такие трансформации преобразуют именно размеры элементов, что важно учитывать при встраивании трансформированных объектов в уже готовые шаблоны страниц.</p>
31
<p>Для достижения эффекта куба фронтальная грань была перемещена по оси<em>z</em>на 150 пикселей ближе к пользователю. Это привело к побочному эффекту: грань теперь имеет размер не 300x300 пикселей, как указано, а 382x382 пикселя. Как можно понять, такие трансформации преобразуют именно размеры элементов, что важно учитывать при встраивании трансформированных объектов в уже готовые шаблоны страниц.</p>
32
<p>Задняя грань претерпела похожие трансформации: она была отдалена на 150 пикселей назад относительно своего начального месторасположения. Это изменило и изначальный размер самого квадрата. Теперь он имеет размер 250x250 пикселей.</p>
32
<p>Задняя грань претерпела похожие трансформации: она была отдалена на 150 пикселей назад относительно своего начального месторасположения. Это изменило и изначальный размер самого квадрата. Теперь он имеет размер 250x250 пикселей.</p>
33
<p><strong>Важно:</strong>обратите внимание, что трансформация по одной оси и на одинаковое количество пикселей не привело к тому, что элементы увеличились и уменьшились на одинаковое количество пикселей. Здесь прямая связь от свойства, изначальных размеров, положительности или отрицательности значения, а также значения перспективы. Более полно, со всеми формулами и матрицами описание приведено в официальной спецификации.</p>
33
<p><strong>Важно:</strong>обратите внимание, что трансформация по одной оси и на одинаковое количество пикселей не привело к тому, что элементы увеличились и уменьшились на одинаковое количество пикселей. Здесь прямая связь от свойства, изначальных размеров, положительности или отрицательности значения, а также значения перспективы. Более полно, со всеми формулами и матрицами описание приведено в официальной спецификации.</p>
34
<p>Если вы не собираетесь делать свои мультфильмы на CSS, то полностью разбираться в этом не нужно. Главное уловить суть того, как свойства влияют на элементы.</p>
34
<p>Если вы не собираетесь делать свои мультфильмы на CSS, то полностью разбираться в этом не нужно. Главное уловить суть того, как свойства влияют на элементы.</p>
35
<h2>Вращение</h2>
35
<h2>Вращение</h2>
36
<p>Функции, предоставляемые спецификацией CSS повторяют аналогичные функции для перемещения. Вращение элемента осуществляется с помощью следующих функций:</p>
36
<p>Функции, предоставляемые спецификацией CSS повторяют аналогичные функции для перемещения. Вращение элемента осуществляется с помощью следующих функций:</p>
37
<ul><li>rotateX() - вращение по оси<em>x</em></li>
37
<ul><li>rotateX() - вращение по оси<em>x</em></li>
38
<li>rotateY() - вращение по оси<em>y</em></li>
38
<li>rotateY() - вращение по оси<em>y</em></li>
39
<li>rotateZ() - вращение по оси<em>z</em></li>
39
<li>rotateZ() - вращение по оси<em>z</em></li>
40
<li>rotate3d(x, y, z) - вращение по осям<em>x</em>,<em>y</em>и<em>z</em></li>
40
<li>rotate3d(x, y, z) - вращение по осям<em>x</em>,<em>y</em>и<em>z</em></li>
41
</ul><p>Проще всего увидеть вращение элементов на примере анимации куба. Для каждой оси вынесен отдельный пример</p>
41
</ul><p>Проще всего увидеть вращение элементов на примере анимации куба. Для каждой оси вынесен отдельный пример</p>
42
<p><a>https://codepen.io/hexlet/pen/MWodPdM</a></p>
42
<p><a>https://codepen.io/hexlet/pen/MWodPdM</a></p>
43
<p><strong>Важно:</strong>обратите внимание на то, как элементы выстроены изначально. В примере используется три куба друг под другом и мы их видим так, как это было бы в жизни: у верхнего куба видна нижняя грань, так как он находится выше нашего взгляда, а у нижнего куба мы видим его верхнюю грань. Это происходит из-за того, что перспектива в примере выставлена у общего для всех этих кубов блока. В данном случае перспектива установлена у тега <body>, поэтому объекты располагаются в единой области относительно друг друга, но на разной высоте</p>
43
<p><strong>Важно:</strong>обратите внимание на то, как элементы выстроены изначально. В примере используется три куба друг под другом и мы их видим так, как это было бы в жизни: у верхнего куба видна нижняя грань, так как он находится выше нашего взгляда, а у нижнего куба мы видим его верхнюю грань. Это происходит из-за того, что перспектива в примере выставлена у общего для всех этих кубов блока. В данном случае перспектива установлена у тега <body>, поэтому объекты располагаются в единой области относительно друг друга, но на разной высоте</p>
44
<h2>Масштабирование</h2>
44
<h2>Масштабирование</h2>
45
<p>Нет ничего удивительного, что для масштабирования элемента в трехмерном пространстве используются такие же по замыслу функции, как и в прошлых примерах:</p>
45
<p>Нет ничего удивительного, что для масштабирования элемента в трехмерном пространстве используются такие же по замыслу функции, как и в прошлых примерах:</p>
46
<ul><li>scaleX() - масштабирование по оси<em>x</em></li>
46
<ul><li>scaleX() - масштабирование по оси<em>x</em></li>
47
<li>scaleY() - масштабирование по оси<em>y</em></li>
47
<li>scaleY() - масштабирование по оси<em>y</em></li>
48
<li>scaleZ() - масштабирование по оси<em>z</em></li>
48
<li>scaleZ() - масштабирование по оси<em>z</em></li>
49
<li>scale3d(x, y, z) - масштабирование по осям<em>x</em>,<em>y</em>и<em>z</em></li>
49
<li>scale3d(x, y, z) - масштабирование по осям<em>x</em>,<em>y</em>и<em>z</em></li>
50
</ul><p>Диапазон значений не отличается от двухмерного пространства - значения от 0 до 1 уменьшают элемент, значения выше 1 увеличивают элемент по одной из оси. Отрицательные значения обеспечат эффект "отзеркаливания" элемента.</p>
50
</ul><p>Диапазон значений не отличается от двухмерного пространства - значения от 0 до 1 уменьшают элемент, значения выше 1 увеличивают элемент по одной из оси. Отрицательные значения обеспечат эффект "отзеркаливания" элемента.</p>
51
<p><a>https://codepen.io/hexlet/pen/abwrQqW</a></p>
51
<p><a>https://codepen.io/hexlet/pen/abwrQqW</a></p>