15.6. Punkt transformacji: transform-origin
Co to jest punkt transformacji?
W poprzednich lekcjach widzieliśmy, jak funkcje scale(), rotate() i skew() modyfikują element. Domyślnie te transformacje odbywają się względem **środka elementu**. Właściwość transform-origin pozwala nam **zmienić ten punkt odniesienia**, czyli punkt, wokół którego lub od którego transformacja jest stosowana.
Zmiana transform-origin może drastycznie zmienić wizualny efekt transformacji, nawet jeśli sama funkcja transformacji pozostaje taka sama.
Składnia transform-origin
Właściwość transform-origin przyjmuje jedną, dwie lub trzy wartości, które definiują położenie punktu transformacji na osiach X, Y i Z.
Wartości 2D (X, Y)
Najczęściej używa się dwóch wartości do zdefiniowania punktu w płaszczyźnie 2D:
transform-origin: [wartość-X] [wartość-Y];
wartość-X: Określa pozycję w poziomie. Może to być:- Słowo kluczowe:
left,center(domyślne),right. - Wartość długości: np.
50px,2em(od lewej krawędzi). - Wartość procentowa: np.
25%,100%(od lewej krawędzi,50%to środek).
- Słowo kluczowe:
wartość-Y: Określa pozycję w pionie. Może to być:- Słowo kluczowe:
top,center(domyślne),bottom. - Wartość długości: np.
10px(od górnej krawędzi). - Wartość procentowa: np.
0%(góra),75%(od górnej krawędzi).
- Słowo kluczowe:
Skrócone zapisy:
- Jedna wartość: Jeśli podasz tylko jedną wartość, będzie ona traktowana jako
wartość-X, awartość-Yprzyjmie domyślniecenter. Wyjątkiem są słowa kluczowetopibottom, które zostaną potraktowane jakowartość-Y, awartość-Xbędziecenter. - Domyślna wartość: Jeśli nie podasz
transform-origin, domyślną wartością jestcenter center(lub50% 50%).
Przykłady 2D:
.element1 {
/* Domyślnie - środek */
transform-origin: center center; /* lub 50% 50% */
transform: rotate(45deg);
}
.element2 {
/* Lewy górny róg */
transform-origin: left top; /* lub 0% 0% */
transform: rotate(45deg);
}
.element3 {
/* Środek dolnej krawędzi */
transform-origin: bottom; /* lub center bottom lub 50% 100% */
transform: scaleY(1.5);
}
.element4 {
/* Punkt 75% od lewej, 20px od góry */
transform-origin: 75% 20px;
transform: scale(0.8);
}
Wartości 3D (X, Y, Z)
Można również podać trzecią wartość, aby zdefiniować pozycję punktu transformacji na osi Z. Jest to istotne przy transformacjach 3D.
transform-origin: [wartość-X] [wartość-Y] [wartość-Z];
wartość-Z: Określa pozycję wzdłuż osi Z. Jest to wartość długości (np.px,em). Wartość domyślna to0. Ujemne wartości przesuwają punkt "dalej" od obserwatora, dodatnie "bliżej".
Przykład 3D:
.parent {
perspective: 600px;
}
.element {
/* Punkt transformacji przesunięty o 100px "do przodu" */
transform-origin: center center -100px;
transform: rotateY(60deg);
}
W tym przykładzie element będzie się obracał wokół osi Y, ale punkt obrotu będzie znajdował się 100px "za" elementem (dalej od widza), co wpłynie na efekt perspektywy.
Wpływ transform-origin na różne transformacje
rotate(): Określa punkt, wokół którego odbywa się obrót.scale(): Określa punkt, który pozostaje nieruchomy podczas skalowania; element rozszerza się lub kurczy względem tego punktu.skew(): Określa punkt, który pozostaje nieruchomy podczas pochylania.translate(): Właściwośćtransform-origin**nie ma wpływu** na działanie funkcjitranslate(). Przesunięcie jest zawsze względne do pierwotnej pozycji elementu, niezależnie od punktu transformacji.
FAQ - Najczęściej zadawane pytania
Jakie są domyślne wartości transform-origin?
Domyślną wartością jest center center 0, co odpowiada 50% 50% 0. Oznacza to środek elementu w płaszczyźnie 2D, bez przesunięcia w osi Z.
Czy mogę animować transform-origin?
Tak, właściwość transform-origin może być animowana za pomocą transition lub @keyframes. Animowanie punktu transformacji w połączeniu z samą transformacją może tworzyć ciekawe i złożone efekty wizualne.
Czy wartości procentowe dla transform-origin odnoszą się do rodzica?
Nie, podobnie jak w przypadku translate(), wartości procentowe dla transform-origin odnoszą się do **wymiarów samego transformowanego elementu**. transform-origin: 100% 0; oznacza prawy górny róg samego elementu.
Kiedy zmiana transform-origin jest najbardziej zauważalna?
Zmiana transform-origin ma największy wpływ na transformacje rotate() i scale(). Przy rotate() zmienia oś obrotu, a przy scale() punkt, od którego element się rozszerza/kurczy. Wpływ na skew() jest subtelniejszy, a na translate() nie ma wpływu.