Kurs HTML

15.6. Punkt transformacji: transform-origin

Strona główna > Kurs CSS > Rozdział 15: Transformacje CSS > 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).
  • 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).

Skrócone zapisy:

  • Jedna wartość: Jeśli podasz tylko jedną wartość, będzie ona traktowana jako wartość-X, a wartość-Y przyjmie domyślnie center. Wyjątkiem są słowa kluczowe top i bottom, które zostaną potraktowane jako wartość-Y, a wartość-X będzie center.
  • Domyślna wartość: Jeśli nie podasz transform-origin, domyślną wartością jest center center (lub 50% 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 to 0. 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 funkcji translate(). 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.