Основні види 3D-трансформацій в CSS

Коли з’явилися CSS-трансформації, з елементами стало можливим проводити різні перетворення: їх можна зміщувати, повертати, нахиляти, здавлювати і розтягувати. А за допомогою 3D-перетворень в CSS стали можливими ще більш неймовірні речі. Вони дають можливість розробникам додати новий вимір на свої сайти.

Спочатку тривимірні трансформації можуть здатися трохи приголомшуючими, особливо якщо врахувати, що HTML-полотно (екран монітора) – це 2D-простір. Але якщо ви уявите собі, що ваш сайт має і глибину (вглиб екрану, або виступаючи з екрану), тоді вам простіше буде зрозуміти цю концепцію. У сьогоднішній статті ви знайдете основні види 3D-трансформацій, які покликані прояснити властивості тривимірного перетворення в CSS.

Також рекомендуємо ознайомитись зі статтею про CSS-переходи (transition).

 

 

Трансформація translate3d

Отже, почнемо з однієї з найпоширеніших 3D-трансформацій в CSS, – функції translate3d(). Синтаксис (з префіксами браузерної підтримки) виглядає так:

.content {   -webkit-transform: translate3d(x, y, z);   -moz-transform: translate3d(x, y, z);   -ms-transform: translate3d(x, y, z);   -o-transform: translate3d(x, y, z);   transform: translate3d(x, y, z);  }  

 

Ця функція задає переміщення елемента в 3D-просторі. Рух відбувається по вектору (x, y, z), де x – переміщення уздовж осі X, y – переміщення уздовж осі Y, а z – уздовж осі Z.

Одиниці виміру найчастіше вводяться в пікселях (px), але ви також можете використовувати em, rem і %.

 

 

3D перспектива

Властивість CSS perspective: встановлює позицію елемента в 3D-просторі, впливаючи на відстань між Z-площиною і глядачем.

Числове значення визначає положення. Чим менше значення – тим ближче елемент буде до екрану (при перетворенні в тривимірний простір). Чим більше значення, тим глибше він буде.



Важливо відзначити, що ця властивість буде діяти тільки тоді, коли елемент перетворений з використанням значення 3d-перетворення. Крім того, вона впливає тільки на дочірні елементи. Тобто, щоб властивість вплинула на даний елемент, ви повинні застосувати його до батьківського елементу.

Синтаксис властивості perspective: виглядає наступним чином:

.content {   -webkit-perspective: /* значення */;   -moz-perspective: /* значення */;   -ms-perspective: /* значення */;   -o-perspective: /* значення */;   perspective: /* значення */;  }  

 

Цю властивість не слід плутати з функцією transform: perspective(), яка може бути застосована безпосередньо до перетворюваного елементу. Обидві ці конструкції використовують числове значення. Однак perspective: буде працювати як із зазначенням одиниці виміру, так і без нього (px, em, rem, %). З іншого боку, transform: perspective() повинно мати зазначення одиниці виміру, щоб властивість мала якийсь ефект.

.content {   -webkit-transform: perspective(n);   -moz-transform: perspective(n);   -ms-transform: perspective(n);   -o-transform: perspective(n);   transform: perspective(n);  }  

 

Примітка. Якщо в батьківському елементі не вказане значення перспективи, тривимірне перетворення дочірнього елемента не буде діяти.

 

 

3D поворот

Тепер розглянемо тривимірне обертання. По суті, воно слідує тим же принципам 3D-транформації, що і при використанні CSS властивості transform. Однак при обертанні вздовж однієї осі (наприклад, rotateX()), значення не використовує ніякі інші одиниці, крім градусів (deg). Таким чином, значення повинно бути введено як (ЗНАЧЕННЯdeg).

З іншого боку, при використанні функції rotate3d() це змінюється. Значення градуса вказується для четвертої властивості (angle – кут).

Наприклад, запис:

rotateX (50deg) rotateY (30deg) rotateZ (15deg)  

еквівалентний запису:

rotate3d (1, 0, 0, 50deg) rotate3d (0, 1, 0, 30deg) rotate3d (0, 0, 1, 15deg)  

 

Синтаксис функції rotate3d() виглядає наступним чином:

.content {   -webkit-transform: rotate3d(x,y,z,кут);   -moz-transform: rotate3d(x,y,z,кут);   -ms-transform: rotate3d(x,y,z,кут);   -o-transform: rotate3d(x,y,z,кут);   transform: rotate3d(x,y,z,кут);  }  

 

 

Видимість зворотного боку елемента

CSS властивість backface-visibility: діє, коли елемент повертається так, що його «задня частина» стає видимою. У елемента без перетворення до глядача звернена передня сторона. Властивість має 2 значення: visible (за замовчуванням) або hidden.

Синтаксис властивості виглядає наступним чином:

.content {   -webkit-backface-visibility: hidden; /* Chrome, Safari, Opera */   backface-visibility: hidden;  }  

 

 

3D масштабування

Для масштабування елементів ми можемо використовувати CSS функцію scale3d(). Функція задає тривимірне масштабування по вектору, який описується трьома параметрами. Зверніть увагу, що параметри приймають тільки одне число без будь-яких одиниць (em, rem, px, %). Синтаксис функції scale3d() виглядає наступним чином:

.content {   -webkit-transform: scale3d(x,y,z);   -moz-transform: scale3d(x,y,z);   -ms-transform: scale3d(x,y,z);   -o-transform: scale3d(x,y,z);   transform: scale3d(x,y,z);  }  

 

 

3D скіс

Ми також можемо використовувати CSS-перетворення skew (скіс) в 2D-просторі. Хоча це насправді не 3D-трансформація, ми все одно її розглянемо. Одиниці виміру скосу повинні вказуватися в градусах (deg).

Синтаксис виглядає наступним чином:

.content {   -webkit-transform: skew(x-кут,y-кут);   -moz-transform: skew(x-кут,y-кут);   -ms-transform: skew(x-кут,y-кут);   -o-transform: skew(x-кут,y-кут);   transform: skew(x-кут,y-кут);  }  

 

 

Початкова точка трансформації

Для вказування початкової точки трансформації використовується CSS властивість transform-origin:. Вона встановлює початок перетворення щодо перетворюваного елементу. Важливо відзначити, що значення можна вводити в em, rem, px або %. За замовчуванням браузери встановлюють початкову точку трансформації всіх перетворень на «50% 50%», що є центром перетворюваного елементу.

Синтаксис виглядає наступним чином:

.content{   -webkit-transform-origin: x-вісь y-вісь z-вісь;   -moz-transform-origin: x-вісь y-вісь z-вісь;   -ms-transform-origin: x-вісь y-вісь z-вісь;   -o-transform-origin: x-вісь y-вісь z-вісь;   transform-origin: x-вісь y-вісь z-вісь;  }  

 

 

Множинні трансформації

Множинні CSS-перетворення повинні бути вказані в одній властивості transform. Ви не можете використовувати кілька значень CSS-перетворення для одного елемента в окремих властивостях перетворення.

Це означає, що такий код CSS стилів не матиме ніякого ефекту, оскільки він неправильний:

.content {   transform: translateX(15px);   transform: translateY(15px);  }  

 

Правильно писати так:

.content {   transform: translateX(15px) translateY(15px);  }  

 

Або так:

.content {   transform: translate3d(15px, 15px, 0);  }  

 

 

 

Короткий і довгий запис

Нарешті, давайте розглянемо синтаксис короткого і довгого запису. Як зазначено вище, множинні значення перетворення для одного елемента повинні бути вказані для однієї властивості transform. Тим не менш, є два способи зробити це. Всі CSS-перетворення (обертання, масштабування, трансляція і скіс) можуть бути визначені на окремих осях. Таким чином, довгий формат записи трансформації буде виглядати так:

.content {   transform: translateX(25px) translateY(25px) scaleX(3) scaleZ(4);  }  

 

Однак, якщо ми використовуємо синтаксис тривимірного перетворення (скорочений запис), наведений вище код буде виглядати так:

.content {   transform: translate3d(25px, 25px, 0) scale3d(3, 0, 4);  }  

 

 

 

Поточний рівень підтримки

Модуль 3D-трансформацій в CSS був вперше представлений у 2009 році. Він був створений членами Apple і мав підтримку тільки в браузері Safari. З тих пір всі сучасні браузери також додали підтримку 3D-трансформацій в CSS властивостях. Станом на кінець 2018 року властивості 3D-перетворень в CSS без префікса браузерів мають підтримку 98% браузерів. Якщо ви додасте префікс -webkit-transform, тоді це дозволить вам охопити старі браузери, і ви отримаєте 99% підтримку.