Istnieją 4 główne funkcje, które możemy przekazać do transform (translate, rotate, scale oraz skew) + ich odpowiedniki dla konkretnych osi X i Y (a nawet osi Z czyli z-index). Korzystanie z transform jest bardzo dobre pod względem wydajności animacji, zaś korzystanie z właściwości pokroju width, height i tym podobne jest całkowitą przeciwnością i czymś, czego warto unikać (plus może powodować nieoczekiwane zdarzenia).
Przypomnijmy sobie dwuwymiarowe transformacje. Na początek stworzymy 4 wycentrowane kwadraty w naszym pliku HTML:
<div class="squares">
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
<div class="square"></div>
</div>
Teraz czyścimy style, używamy flexboxa na body (trzema mu ustawić wysokość na 100vh) do wycentrowania kontenera, centrujemy też flexboxem nasze kwadraty i tworzymy je:
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
body {
height: 100vh;
background-color: rgb(58, 87, 112);
display: flex;
justify-content: center;
align-items: center;
}
.squares {
display: flex;
}
.square {
width: 200px;
height: 200px;
background-color: tomato;
margin-inline: 10px;
transition: all .5s;
}
Nadaliśmy już transition na animowanym elemencie (na klasie square) a zatem możemy przechodzić do wypróbowania naszych animacji.
Na początek wypróbujemy translate, czyli przemieszczenie elementu (na osi X, Y lub obu) o jakąś wartość (dodatnią lub ujemną). Wykorzystamy nth-of-type, aby inaczej animować każdy kwadrat i zobaczyć różne konfiguracje:
.square:nth-of-type(1):hover {
transform: translate(-50px, -50px);
// 50px w lewo, 50px do góry
}
.square:nth-of-type(2):hover {
transform: translate(50px, 50px);
//50px w prawo, 50px w dół
}
.square:nth-of-type(3):hover {
transform: translateX(50px);
//50px w prawo
}
.square:nth-of-type(4):hover {
transform: translateY(-50px);
//50px do góry
}
Jednostek możemy oczywiście użyć dowolnych. Teraz pobawmy się za pomocą scale, czyli zmniejszania/zwiększania elementu:
.square:nth-of-type(1):hover {
transform: scale(0.5);
//dwa razy mniejszy
}
.square:nth-of-type(2):hover {
transform: scale(2);
//dwa razy większy
}
.square:nth-of-type(3):hover {
transform: scaleX(2);
//dwa razy szerszy
}
.square:nth-of-type(4):hover {
transform: scaleY(2);
//dwa razy dłuższy
}
Teraz pora na rotate i skew:
.square:nth-of-type(1):hover {
transform: rotate(45deg);
//45 stopni zgodnie z kierunkiem zegara (w prawo)
}
.square:nth-of-type(2):hover {
transform: rotate(-45deg);
//45 stopni przeciwnie do kierunku zegara (w lewo)
}
.square:nth-of-type(3):hover {
transform: skew(30deg);
//"wygnij" 30 stopni w lewo
}
.square:nth-of-type(4):hover {
transform: skew(-30deg);
//wykrzyw 30 stopni w prawo
}
Szczególnie rotate okazuje się bardzo przydatne i warto to sobie opanować.
Wspomnę jeszcze o jednym – nigdy nie nadpisujmy wartości transform. Jeżeli chcemy mieć kilka transformacji, określamy je w jednej linijce, w jednym transform:
.square:nth-of-type(1):hover {
/* ŹLE */
transform: rotate(45deg);
transform: scale(2);
transform: translateY(-50px);
/* TYLKO OSTATNIA ZADZIAŁA */
}
.square:nth-of-type(2):hover {
/* DOBRZE */
transform: rotate(45deg) scale(2) translateY(-50px);
/* WSZYSTKIE ZADZIAŁAJĄ */
}