HTML Diff
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>обратите внимание на то, как элементы выстроены изначально. В примере используется три куба друг под другом и мы их видим так, как это было бы в жизни: у верхнего куба видна нижняя грань, так как он находится выше нашего взгляда, а у нижнего куба мы видим его верхнюю грань. Это происходит из-за того, что перспектива в примере выставлена у общего для всех этих кубов блока. В данном случае перспектива установлена у тега &lt;body&gt;, поэтому объекты располагаются в единой области относительно друг друга, но на разной высоте</p>
43 <p><strong>Важно:</strong>обратите внимание на то, как элементы выстроены изначально. В примере используется три куба друг под другом и мы их видим так, как это было бы в жизни: у верхнего куба видна нижняя грань, так как он находится выше нашего взгляда, а у нижнего куба мы видим его верхнюю грань. Это происходит из-за того, что перспектива в примере выставлена у общего для всех этих кубов блока. В данном случае перспектива установлена у тега &lt;body&gt;, поэтому объекты располагаются в единой области относительно друг друга, но на разной высоте</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>