Witaj ponownie w Dolinie Królów! Podobnie jak starożytni Egipcjanie potrafili przekształcać prosty kamień w majestatyczne rzeźby bogów, tak w CSS możemy transformować elementy - przesuwać, obracać, skalować i pochylać je w przestrzeni 2D i 3D. Transform to klucz do tworzenia nowoczesnych, dynamicznych interfejsów!
Transform pozwala na geometryczne przekształcenia elementu bez wpływu na layout innych elementów. Element zostaje przekształcony wizualnie, ale jego oryginalna przestrzeń w dokumencie pozostaje niezmieniona.
Kluczowa zaleta: Transform jest GPU-accelerated, co oznacza niezwykle wysoką wydajność!
1.element {
2 /* Element przesuwa się, ale nie wpływa na inne elementy */
3 transform: translateX(100px);
4}Analogia egipska: To jak cień piramidy - piramida pozostaje na swoim miejscu, ale jej cień porusza się w zależności od słońca.
1/* Przesuń w poziomie */
2.element {
3 transform: translateX(100px); /* W prawo o 100px */
4 transform: translateX(-50px); /* W lewo o 50px */
5}
6
7/* Przesuń w pionie */
8.element {
9 transform: translateY(50px); /* W dół o 50px */
10 transform: translateY(-30px); /* W górę o 30px */
11}
12
13/* Przesuń w obu kierunkach */
14.element {
15 transform: translate(100px, 50px); /* X, Y */
16}
17
18/* Procenty relatywne do rozmiaru elementu */
19.element {
20 transform: translate(50%, -100%);
21 /* 50% swojej szerokości w prawo */
22 /* 100% swojej wysokości w górę */
23}Praktyczne użycie - centrowanie:
1.center {
2 position: absolute;
3 top: 50%;
4 left: 50%;
5 transform: translate(-50%, -50%); /* Perfect center! */
6}1/* Powiększ 2x */
2.element {
3 transform: scale(2); /* 200% rozmiaru */
4}
5
6/* Pomniejsz do połowy */
7.element {
8 transform: scale(0.5); /* 50% rozmiaru */
9}
10
11/* Różne skale w X i Y */
12.element {
13 transform: scale(2, 0.5); /* 2x szerokość, 0.5x wysokość */
14}
15
16/* Tylko X lub tylko Y */
17.element {
18 transform: scaleX(1.5); /* Rozciągnij w poziomie */
19 transform: scaleY(0.8); /* Ściśnij w pionie */
20}
21
22/* Odbicie lustrzane */
23.element {
24 transform: scaleX(-1); /* Flip horizontal */
25 transform: scaleY(-1); /* Flip vertical */
26 transform: scale(-1, -1); /* Flip both */
27}Praktyczny przykład - zoom on hover:
1.card {
2 transition: transform 0.3s ease;
3}
4
5.card:hover {
6 transform: scale(1.05); /* Subtelny zoom */
7}1/* Obrót w stopniach */
2.element {
3 transform: rotate(45deg); /* 45° w prawo */
4 transform: rotate(-90deg); /* 90° w lewo */
5 transform: rotate(180deg); /* Obrót o 180° */
6}
7
8/* Obrót w radianach */
9.element {
10 transform: rotate(1.57rad); /* ~90° */
11}
12
13/* Obrót w turns (pełne obroty) */
14.element {
15 transform: rotate(0.5turn); /* Pół obrotu (180°) */
16 transform: rotate(2turn); /* 2 pełne obroty (720°) */
17}Praktyczny przykład - loading spinner:
1.spinner {
2 width: 40px;
3 height: 40px;
4 border: 4px solid #f3f3f3;
5 border-top: 4px solid goldenrod;
6 border-radius: 50%;
7 animation: spin 1s linear infinite;
8}
9
10@keyframes spin {
11 from {
12 transform: rotate(0deg);
13 }
14 to {
15 transform: rotate(360deg);
16 }
17}1/* Pochyl w poziomie */
2.element {
3 transform: skewX(15deg); /* Pochyl w prawo */
4 transform: skewX(-15deg); /* Pochyl w lewo */
5}
6
7/* Pochyl w pionie */
8.element {
9 transform: skewY(10deg);
10}
11
12/* Pochyl w obu kierunkach */
13.element {
14 transform: skew(15deg, 10deg); /* X, Y */
15}Praktyczny przykład - parallelogram button:
1.skew-button {
2 transform: skewX(-10deg);
3 background: goldenrod;
4 padding: 12px 30px;
5 color: white;
6 border: none;
7 font-weight: bold;
8}
9
10.skew-button span {
11 display: inline-block;
12 transform: skewX(10deg); /* Odskew tekstu */
13}Możesz łączyć wiele transformacji w jednej deklaracji:
1.element {
2 /* Kolejność ma znaczenie! */
3 transform: translate(100px, 50px) rotate(45deg) scale(1.5);
4
5 /* To nie to samo co: */
6 transform: rotate(45deg) translate(100px, 50px) scale(1.5);
7}Ważne: Transformacje są wykonywane od prawej do lewej (od końca do początku)!
Praktyczny przykład - kompleksowa animacja:
1.card {
2 transition: transform 0.5s ease;
3}
4
5.card:hover {
6 transform: translateY(-10px) /* Najpierw w górę */
7 rotate(2deg) /* Potem lekki obrót */
8 scale(1.05); /* Na końcu zoom */
9}Transform-origin określa punkt, wokół którego następują transformacje:
1/* Default */
2.element {
3 transform-origin: 50% 50%; /* Środek (center center) */
4}
5
6/* Różne punkty */
7.element {
8 transform-origin: top left; /* Lewy górny róg */
9 transform-origin: bottom right; /* Prawy dolny róg */
10 transform-origin: center; /* Środek */
11 transform-origin: 0 0; /* Lewy górny (px) */
12 transform-origin: 100% 0; /* Prawy górny */
13}Przykład - obrót wokół różnych punktów:
1.door-left {
2 transform-origin: left center;
3 transition: transform 0.5s;
4}
5
6.door-left:hover {
7 transform: rotateY(90deg); /* Obrót wokół lewej krawędzi */
8}
9
10.door-right {
11 transform-origin: right center;
12 transition: transform 0.5s;
13}
14
15.door-right:hover {
16 transform: rotateY(-90deg); /* Obrót wokół prawej krawędzi */
17}3D transformacje dodają głębię i perspektywę:
Perspektywa musi być ustawiona na rodzicu elementów 3D:
1.container {
2 perspective: 1000px; /* Im większa wartość, tym mniejsza perspektywa */
3}
4
5.child {
6 transform: rotateY(45deg); /* Teraz widać efekt 3D */
7}Lub na samym elemencie:
1.element {
2 transform: perspective(1000px) rotateY(45deg);
3}1/* Obrót wokół osi X (przód-tył) */
2.element {
3 transform: rotateX(45deg);
4}
5
6/* Obrót wokół osi Y (lewo-prawo) */
7.element {
8 transform: rotateY(45deg);
9}
10
11/* Obrót wokół osi Z (normalny obrót 2D) */
12.element {
13 transform: rotateZ(45deg); /* To samo co rotate(45deg) */
14}
15
16/* Obrót wokół własnej osi 3D */
17.element {
18 transform: rotate3d(1, 1, 0, 45deg); /* x, y, z, angle */
19}1/* Przesuń w głąb/przed */
2.element {
3 transform: translateZ(100px); /* Przód */
4 transform: translateZ(-100px); /* Tył */
5}
6
7/* 3D translate */
8.element {
9 transform: translate3d(100px, 50px, 200px); /* X, Y, Z */
10}1.container {
2 /* Zachowaj 3D dla dzieci */
3 transform-style: preserve-3d;
4
5 /* Lub spłaszcz do 2D */
6 transform-style: flat;
7}
8
9.card {
10 /* Ukryj tylną stronę elementu */
11 backface-visibility: hidden;
12
13 /* Lub pokaż */
14 backface-visibility: visible;
15}1<div class="flip-card">
2 <div class="flip-card-inner">
3 <div class="flip-card-front">
4 <h3>Przód</h3>
5 </div>
6 <div class="flip-card-back">
7 <h3>Tył</h3>
8 </div>
9 </div>
10</div>1.flip-card {
2 width: 300px;
3 height: 400px;
4 perspective: 1000px;
5}
6
7.flip-card-inner {
8 width: 100%;
9 height: 100%;
10 transition: transform 0.6s;
11 transform-style: preserve-3d;
12 position: relative;
13}
14
15.flip-card:hover .flip-card-inner {
16 transform: rotateY(180deg);
17}
18
19.flip-card-front,
20.flip-card-back {
21 position: absolute;
22 width: 100%;
23 height: 100%;
24 backface-visibility: hidden;
25 display: flex;
26 align-items: center;
27 justify-content: center;
28 border-radius: 10px;
29}
30
31.flip-card-front {
32 background: #3498db;
33 color: white;
34}
35
36.flip-card-back {
37 background: goldenrod;
38 color: white;
39 transform: rotateY(180deg);
40}1<div class="cube-container">
2 <div class="cube">
3 <div class="cube-face front">Front</div>
4 <div class="cube-face back">Back</div>
5 <div class="cube-face right">Right</div>
6 <div class="cube-face left">Left</div>
7 <div class="cube-face top">Top</div>
8 <div class="cube-face bottom">Bottom</div>
9 </div>
10</div>1.cube-container {
2 width: 200px;
3 height: 200px;
4 perspective: 800px;
5}
6
7.cube {
8 width: 100%;
9 height: 100%;
10 position: relative;
11 transform-style: preserve-3d;
12 transition: transform 1s;
13 animation: rotate-cube 10s infinite linear;
14}
15
16.cube-face {
17 position: absolute;
18 width: 200px;
19 height: 200px;
20 display: flex;
21 align-items: center;
22 justify-content: center;
23 font-size: 24px;
24 font-weight: bold;
25 color: white;
26 opacity: 0.9;
27}
28
29.front { background: #3498db; transform: translateZ(100px); }
30.back { background: #e74c3c; transform: translateZ(-100px) rotateY(180deg); }
31.right { background: #2ecc71; transform: rotateY(90deg) translateZ(100px); }
32.left { background: #f39c12; transform: rotateY(-90deg) translateZ(100px); }
33.top { background: #9b59b6; transform: rotateX(90deg) translateZ(100px); }
34.bottom { background: #1abc9c; transform: rotateX(-90deg) translateZ(100px); }
35
36@keyframes rotate-cube {
37 from {
38 transform: rotateX(0deg) rotateY(0deg);
39 }
40 to {
41 transform: rotateX(360deg) rotateY(360deg);
42 }
43}1.button-3d {
2 background: goldenrod;
3 color: white;
4 padding: 15px 30px;
5 border: none;
6 font-size: 18px;
7 font-weight: bold;
8 cursor: pointer;
9 transform: translateZ(0);
10 transition: transform 0.1s;
11 box-shadow: 0 6px 0 #d4920a;
12}
13
14.button-3d:hover {
15 transform: translateY(-2px);
16 box-shadow: 0 8px 0 #d4920a;
17}
18
19.button-3d:active {
20 transform: translateY(4px);
21 box-shadow: 0 2px 0 #d4920a;
22}GPU-accelerated (SZYBKIE):
CPU-bound (WOLNE):
Best Practices:
1/* ❌ Wolne - powoduje reflow */
2.element:hover {
3 width: 300px;
4 left: 100px;
5}
6
7/* ✅ Szybkie - GPU-accelerated */
8.element:hover {
9 transform: translateX(100px) scaleX(1.5);
10}
11
12/* Force GPU acceleration */
13.element {
14 transform: translateZ(0); /* Trick dla GPU */
15 /* lub */
16 will-change: transform; /* Poinformuj przeglądarkę */
17}Transform 2D:
Transform 3D:
Kluczowe zasady:
Pamiętaj: Transform to jak magiczne zaklęcia egipskich kapłanów - potrafią przekształcać rzeczywistość bez zmiany jej istoty!