Co robi transform
transform zmienia sposób rysowania elementu: przesunięcie, skalowanie, obrót lub pochylenie. Przerywane kontury poniżej pokazują, gdzie byłoby każde pudełko bez transformacji:
translate(20px, 10px) przesuwa niebieskie pudełko o 20px dalej i 10px w dół. scale(1.3) powiększa zielone o 30% wokół jego środka. rotate(20deg) obraca bursztynowe zgodnie z ruchem wskazówek zegara, a skewX(-20deg) pochyla ciemne. W każdym przypadku przerywane miejsce, czyli przestrzeń, którą element zajmuje w układzie, zostaje dokładnie tam, gdzie było.
Funkcje transformacji
| Funkcja | Robi | Przykład |
|---|---|---|
translate(x, y) | przesuwa | translate(20px, -10px), translate(-50%, -50%) |
translateX(x) / translateY(y) | przesuwa w jednej osi | translateY(-4px) |
scale(s) / scale(x, y) | zmienia rozmiar (1 = oryginał, 0.5 = połowa, ujemna wartość odbija) | scale(1.1), scale(-1, 1) |
scaleX(s) / scaleY(s) | zmienia rozmiar w jednej osi | scaleX(0.5) |
rotate(angle) | obraca zgodnie z ruchem wskazówek zegara (ujemny kąt = przeciwnie) | rotate(45deg), rotate(0.25turn) |
skew(x, y) / skewX(a) / skewY(a) | pochyla | skewX(-15deg) |
matrix(a, b, c, d, e, f) | wszystko powyżej w jednej macierzy, głównie to, co zwraca przeglądarka | |
none | brak transformacji |
Procenty w translate() odnoszą się do własnego rozmiaru elementu, a nie rodzica. Obrót ma własną stronę ze stopniami, obrotami i kręceniem: CSS rotate.
Edytor online transformacji
Przesuwaj suwaki. Pierwsza linijka to zbudowana przez ciebie wartość transform; druga to macierz, którą przeglądarka z niej obliczyła, czyli to, co getComputedStyle zwraca dla każdej transformacji:
Transformacje nie przesuwają układu
Przetransformowany element jest rysowany gdzie indziej, ale strona jest układana tak, jakby transformacji nie było. Jego sąsiedzi zachowują swoje pozycje. Właśnie dlatego transformacje dobrze sprawdzają się w efektach hover i animacjach: nic wokół nie jest przeliczane.
Oba środkowe pudełka wyglądają na 1.5 raza większe. Przeskalowane zachodzi na sąsiadów, a C zostaje na miejscu; to powiększone przez width i height spycha C o 40px dalej.
Wiele transformacji i ich kolejność
Umieść kilka funkcji w jednym transform, oddzielając je spacjami. Kolejność zmienia wynik, bo czytając od lewej do prawej, każda funkcja działa w układzie współrzędnych pozostawionym przez wcześniejsze funkcje:
Niebieskie pudełko przesunęło się o 120px prosto, a potem obróciło się w miejscu. Zielone zostało najpierw obrócone, więc jego "oś x" biegnie po przekątnej, a translateX(120px) przesuwa je wzdłuż tej przekątnej. Te same funkcje, inne miejsce.
Druga pułapka: kolejna deklaracja transform zastępuje pierwszą. Jeśli karta ma transform: rotate(-2deg), a jej reguła hover mówi transform: scale(1.05), obrót znika po najechaniu. Powtórz obie (rotate(-2deg) scale(1.05)) albo użyj osobnych właściwości opisanych niżej.
transform-origin
Skalowanie, obracanie i pochylanie odbywa się wokół stałego punktu, punktu początkowego transformacji, którym domyślnie jest środek. Zmieniasz go słowami kluczowymi, długościami lub procentami:
Wszystkie trzy pudełka obracają się o 25 stopni. Pierwsze obraca się wokół środka, drugie trzyma lewy górny róg przypięty do rogu swojego miejsca, a trzecie prawy dolny róg. Rozwijane menu, które wyrasta ze swojego przycisku, używa transform-origin: top razem ze scale().
Właściwości translate, scale i rotate
Nowoczesne przeglądarki mają też trzy osobne właściwości, które robią to samo co funkcje, ale można je ustawiać i animować niezależnie:
.card {
rotate: -2deg;
transition: scale 0.2s ease-out;
}
.card:hover {
scale: 1.05; /* the rotation stays, because it is a different property */
}
Zawsze łączą się tak, jakby zapisano transform: translate(...) rotate(...) scale(...) przed dowolną wartością transform, bez względu na kolejność, w jakiej je zadeklarujesz. Zwróć uwagę na składnię: translate: 10px 20px i scale: 1.2 przyjmują wartości bez nawiasów funkcji.
Wyśrodkowanie przez translate(-50%, -50%)
Ponieważ procenty w translate() odnoszą się do własnego rozmiaru elementu, top: 50%; left: 50%; transform: translate(-50%, -50%) wyśrodkowuje w rodzicu element pozycjonowany absolutnie o dowolnym rozmiarze. Strona o wyśrodkowaniu diva porównuje to z flexboxem i grid.
Częste błędy
- Dwie deklaracje
transform. Późniejsza wygrywa w całości. Połącz funkcje albo użyj właściwościrotate,scaleitranslate. - Transformowanie elementu liniowego. Zwykły
<span>lub<a>ignorujetransform. Nadaj muinline-block. - Oczekiwanie, że sąsiedzi się przesuną. Transformacje nigdy nie zmieniają układu. Żeby zrobić miejsce, zmień
width,marginalbogap. - Zła kolejność funkcji.
rotate()przedtranslate()przesuwa wzdłuż obróconej osi. - Niespodzianki z dziećmi
position: fixed. Przetransformowany element staje się blokiem zawierającym dla potomków z pozycją fixed, więc stały nagłówek w jego wnętrzu przewija się razem z nim. Tworzy też nowy kontekst nakładania dlaz-index.
Najczęściej zadawane pytania
Co robi transform w CSS?
Zmienia sposób rysowania elementu: przesunięty (translate), zmieniony rozmiar (scale), obrócony (rotate) albo pochylony (skew). Element zachowuje swoje pierwotne miejsce w układzie, więc elementy wokół niego się nie przesuwają.
Jak zastosować kilka transformacji w CSS?
Wypisz je w jednej wartości transform, oddzielając spacjami: transform: translateX(50px) rotate(20deg) scale(1.2);. Druga deklaracja transform zastępuje pierwszą, zamiast się do niej dodawać.
Czy kolejność funkcji transformacji ma znaczenie?
Tak. Czytając od lewej do prawej, każda funkcja działa w osiach pozostawionych przez poprzednie, więc rotate(45deg) translateX(100px) przesuwa element wzdłuż obróconej osi, a translateX(100px) rotate(45deg) przesuwa go prosto, a potem obraca.
Czym jest transform-origin?
To stały punkt, wokół którego odbywa się skalowanie, obracanie i pochylanie. Domyślnie jest to środek (50% 50%). transform-origin: top left sprawia, że element rośnie od swojego lewego górnego rogu albo się wokół niego obraca.
Dlaczego transform nie działa na moim spanie?
Transformacje nie działają na niezastępowanych elementach liniowych, takich jak zwykły <span> czy <a>. Nadaj elementowi display: inline-block albo block, a transformacja zadziała.