Kurs HTML i CSS · Moduł 6: Animacje CSS
CSS Transitions - płynne przejścia między stanami
W tej lekcji11
Witaj w Dolinie Królów Animacji! Podobnie jak egipskie hieroglify mogły zmieniać się z jednej formy w drugą pod wpływem światła słonecznego, tak w CSS możemy tworzyć płynne transitions - przejścia między stanami elementu. To najprostszy i najczęściej używany sposób na dodanie animacji do strony!
Czym są Transitions?
Transitions pozwalają na płynną zmianę właściwości CSS od jednej wartości do drugiej w określonym czasie.
Bez transition:
- Zmiana jest natychmiastowa (0ms)
- Efekt "skoku"
Z transition:
- Zmiana jest stopniowa
- Płynny, profesjonalny efekt
1/* Bez transition */
2.button {
3 background: blue;
4}
5
6.button:hover {
7 background: red; /* Natychmiastowa zmiana */
8}
9
10/* Z transition */
11.button {
12 background: blue;
13 transition: background 0.3s; /* Płynna zmiana przez 0.3s */
14}
15
16.button:hover {
17 background: red; /* Teraz zmiana jest płynna! */
18}Analogia egipska: To jak płynne przejście słońca od wschodu do zachodu nad piramidami - nie skacze natychmiast, ale przesuwa się stopniowo.
Składnia Transitions
Podstawowa składnia
1/* transition: property duration timing-function delay; */
2
3.element {
4 transition: background-color 0.3s ease 0s;
5}
6
7/* Lub osobno */
8.element {
9 transition-property: background-color;
10 transition-duration: 0.3s;
11 transition-timing-function: ease;
12 transition-delay: 0s;
13}Komponenty transition:
- transition-property - która właściwość ma być animowana
- transition-duration - jak długo trwa animacja
- transition-timing-function - jak szybkość zmienia się w czasie
- transition-delay - opóźnienie przed startem
Transition-property - co animować?
1/* Jedna właściwość */
2.button {
3 transition-property: background-color;
4}
5
6/* Wiele właściwości */
7.button {
8 transition-property: background-color, color, transform;
9}
10
11/* Wszystkie właściwości (użyj ostrożnie!) */
12.button {
13 transition-property: all;
14}Właściwości, które można animować:
- Kolory: color, background-color, border-color
- Wymiary: width, height, padding, margin
- Pozycja: top, left, right, bottom
- Transform: transform
- Opacity: opacity
- Box-shadow, border-radius, font-size, line-height
- I wiele innych...
Właściwości, których NIE można animować:
- display (nie ma wartości pośrednich)
- position (static, relative, absolute)
- font-family (nie ma wartości pośrednich)
Transition-duration - jak długo?
1/* W sekundach */
2.element {
3 transition-duration: 0.3s; /* 300ms - standardowa wartość */
4}
5
6/* W milisekundach */
7.element {
8 transition-duration: 300ms;
9}
10
11/* Różne czasy dla różnych właściwości */
12.element {
13 transition-property: background-color, transform;
14 transition-duration: 0.3s, 0.5s;
15 /* background-color: 0.3s, transform: 0.5s */
16}Rekomendowane czasy:
- 0.15s-0.2s - szybkie, responsywne (hover na linkach)
- 0.3s-0.4s - standardowe (przyciski, karty)
- 0.5s-0.8s - wolniejsze, bardziej dramatyczne (duże zmiany)
- 1s+ - bardzo wolne (tylko dla specjalnych efektów)
Transition-timing-function - krzywa czasowa
Timing function określa jak szybkość animacji zmienia się w czasie:
1.element {
2 /* Liniowa - stała szybkość */
3 transition-timing-function: linear;
4
5 /* Ease - wolny start, szybko, wolny koniec (default) */
6 transition-timing-function: ease;
7
8 /* Ease-in - wolny start, szybki koniec */
9 transition-timing-function: ease-in;
10
11 /* Ease-out - szybki start, wolny koniec */
12 transition-timing-function: ease-out;
13
14 /* Ease-in-out - wolny start i koniec */
15 transition-timing-function: ease-in-out;
16
17 /* Cubic-bezier - własna krzywa */
18 transition-timing-function: cubic-bezier(0.68, -0.55, 0.265, 1.55);
19
20 /* Steps - krokowa (nie płynna) */
21 transition-timing-function: steps(4);
22}Wizualizacja timing functions:
- linear: --------- (stała prędkość)
- ease: _/‾‾‾_ (wolny start i koniec)
- ease-in: __/‾‾ (wolny start)
- ease-out: ‾‾__ (wolny koniec)
- ease-in-out: _/‾_ (najbardziej naturalny)
Narzędzie online: https://cubic-bezier.com/
Transition-delay - opóźnienie
1.element {
2 transition-delay: 0.2s; /* Zacznij po 0.2s */
3}
4
5/* Różne opóźnienia dla różnych właściwości */
6.element {
7 transition-property: opacity, transform;
8 transition-duration: 0.3s, 0.3s;
9 transition-delay: 0s, 0.1s;
10 /* opacity natychmiast, transform po 0.1s */
11}Praktyczne przykłady
1. Button hover effect
1<button class="btn">Kliknij mnie</button>1.btn {
2 background: #3498db;
3 color: white;
4 padding: 12px 24px;
5 border: none;
6 border-radius: 4px;
7 cursor: pointer;
8 font-size: 16px;
9
10 /* Transition na wielu właściwościach */
11 transition: background-color 0.3s ease,
12 transform 0.2s ease,
13 box-shadow 0.3s ease;
14}
15
16.btn:hover {
17 background: #2980b9;
18 transform: translateY(-2px);
19 box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
20}
21
22.btn:active {
23 transform: translateY(0);
24 box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
25}2. Card hover - reveal
1<div class="card">
2 <img src="pyramid.jpg" alt="Piramida">
3 <div class="card-overlay">
4 <h3>Wielka Piramida</h3>
5 <p>Jedna z Siedmiu Cudów Świata</p>
6 </div>
7</div>1.card {
2 position: relative;
3 width: 300px;
4 height: 400px;
5 overflow: hidden;
6 border-radius: 8px;
7}
8
9.card img {
10 width: 100%;
11 height: 100%;
12 object-fit: cover;
13 transition: transform 0.5s ease;
14}
15
16.card-overlay {
17 position: absolute;
18 bottom: 0;
19 left: 0;
20 right: 0;
21 background: linear-gradient(to top, rgba(0,0,0,0.8), transparent);
22 padding: 20px;
23 color: white;
24
25 /* Overlay zaczyna poniżej karty */
26 transform: translateY(100%);
27 transition: transform 0.4s ease;
28}
29
30.card:hover img {
31 transform: scale(1.1); /* Zoom na obrazku */
32}
33
34.card:hover .card-overlay {
35 transform: translateY(0); /* Overlay wjeżdża */
36}3. Navigation link underline
1<nav>
2 <a href="#" class="nav-link">Home</a>
3 <a href="#" class="nav-link">About</a>
4 <a href="#" class="nav-link">Contact</a>
5</nav>1.nav-link {
2 position: relative;
3 color: #2c3e50;
4 text-decoration: none;
5 padding: 10px 0;
6 display: inline-block;
7}
8
9/* Underline jako ::after pseudo-element */
10.nav-link::after {
11 content: '';
12 position: absolute;
13 bottom: 0;
14 left: 0;
15 width: 0; /* Zaczyna od 0 */
16 height: 2px;
17 background: goldenrod;
18
19 /* Animuj szerokość */
20 transition: width 0.3s ease;
21}
22
23.nav-link:hover::after {
24 width: 100%; /* Rozszerz do pełnej szerokości */
25}4. Modal fade-in
1<div class="modal" id="myModal">
2 <div class="modal-content">
3 <h2>Tytuł Modal</h2>
4 <p>Treść modala...</p>
5 <button class="close">Zamknij</button>
6 </div>
7</div>1.modal {
2 position: fixed;
3 top: 0;
4 left: 0;
5 width: 100%;
6 height: 100%;
7 background: rgba(0, 0, 0, 0.8);
8 display: flex;
9 align-items: center;
10 justify-content: center;
11
12 /* Zaczyna niewidoczny */
13 opacity: 0;
14 pointer-events: none;
15
16 /* Animuj opacity i backdrop */
17 transition: opacity 0.3s ease;
18}
19
20.modal.active {
21 opacity: 1;
22 pointer-events: auto;
23}
24
25.modal-content {
26 background: white;
27 padding: 30px;
28 border-radius: 8px;
29 max-width: 500px;
30
31 /* Zaczyna poniżej */
32 transform: translateY(50px);
33 transition: transform 0.3s ease 0.1s; /* Opóźnienie 0.1s */
34}
35
36.modal.active .modal-content {
37 transform: translateY(0);
38}5. Loading skeleton
1<div class="skeleton">
2 <div class="skeleton-line"></div>
3 <div class="skeleton-line"></div>
4 <div class="skeleton-line short"></div>
5</div>1.skeleton-line {
2 height: 16px;
3 background: linear-gradient(
4 90deg,
5 #f0f0f0 0%,
6 #e0e0e0 50%,
7 #f0f0f0 100%
8 );
9 background-size: 200% 100%;
10 border-radius: 4px;
11 margin-bottom: 10px;
12
13 /* Animuj position gradient */
14 animation: skeleton-loading 1.5s ease-in-out infinite;
15}
16
17.skeleton-line.short {
18 width: 60%;
19}
20
21@keyframes skeleton-loading {
22 0% {
23 background-position: 200% 0;
24 }
25 100% {
26 background-position: -200% 0;
27 }
28}Transitions vs Animations
Używaj Transitions kiedy:
- Potrzebujesz prostej zmiany między dwoma stanami
- Animacja jest wywołana przez interakcję użytkownika (hover, focus, click)
- Chcesz animować powrót do stanu początkowego
- Prostsza implementacja
Używaj Animations (@keyframes) kiedy:
- Potrzebujesz więcej niż 2 stanów (keyframes)
- Animacja powinna działać automatycznie (bez interakcji)
- Potrzebujesz pętli (infinite)
- Potrzebujesz precyzyjnej kontroli nad timing
Multiple Transitions
1/* Shorthand - wszystkie na raz */
2.element {
3 transition: background 0.3s ease,
4 color 0.3s ease,
5 transform 0.5s ease-out 0.1s,
6 box-shadow 0.4s ease;
7}
8
9/* Lub jeszcze krócej (dla tych samych wartości) */
10.element {
11 transition: all 0.3s ease;
12}Uwaga z all: Może animować niechciane właściwości i wpływać na performance. Lepiej wymienić konkretne właściwości.
Performance Transitions
Szybkie właściwości (GPU-accelerated):
transform(translate, scale, rotate)opacity
Wolne właściwości:
width,height(powodują reflow)margin,padding(powodują reflow)top,left(wolniejsze niż transform)
1/* Wolne */
2.element {
3 transition: width 0.3s, left 0.3s;
4}
5
6.element:hover {
7 width: 200px;
8 left: 100px;
9}
10
11/* Szybkie */
12.element {
13 transition: transform 0.3s, opacity 0.3s;
14}
15
16.element:hover {
17 transform: translateX(100px) scaleX(2);
18 opacity: 0.8;
19}Podsumowanie
CSS Transitions:
- Płynne przejścia między dwoma stanami
- Wywoływane przez zmianę CSS (hover, focus, class)
- Składnia:
transition: property duration timing-function delay - Najpopularniejsze: opacity, transform
- Rekomendowany czas: 0.2s-0.4s
- Timing function: ease-in-out dla naturalności
Best Practices:
- Animuj transform i opacity dla performance
- Używaj ease-in-out dla naturalności
- 0.2s-0.4s dla większości interakcji
- Testuj na urządz eniach mobilnych
- Dodawaj transitions do stanu bazowego, nie :hover
Kod do tej lekcji: style.css
1* {
2 margin: 0;
3 padding: 0;
4 box-sizing: border-box;
5}
6
7body {
8 font-family: 'Segoe UI', sans-serif;
9 background: linear-gradient(135deg, #8d6e2e, #c9a84c);
10 min-height: 100vh;
11 display: flex;
12 justify-content: center;
13 align-items: center;
14 color: #3d2914;
15}
16
17.scene {
18 text-align: center;
19 padding: 20px;
20}
21
22h2 {
23 margin-bottom: 30px;
24 color: #3d2914;
25}
26
27.scroll-container {
28 display: flex;
29 justify-content: center;
30 margin: 20px 0;
31}
32
33.papyrus {
34 width: 300px;
35 background: linear-gradient(180deg, #f5deb3, #deb887, #d2b48c);
36 border-radius: 8px;
37 padding: 25px;
38 border: 3px solid #8d6e2e;
39 cursor: pointer;
40 overflow: hidden;
41 transform-origin: left center;
42 /* Dodaj transition tutaj */
43 /* transition: transform 0.6s ease-in-out, box-shadow 0.6s ease; */
44 transform: scaleX(0.3);
45}
46
47/* Dodaj efekt :hover dla .papyrus */
48/* .papyrus:hover { */
49/* transform: scaleX(1); */
50/* box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); */
51/* } */
52
53.papyrus-content {
54 font-family: serif;
55 font-size: 16px;
56 line-height: 1.8;
57 color: #3d2914;
58}
59
60.hint {
61 margin-top: 30px;
62 color: #5a3d1a;
63 font-style: italic;
64}Pamiętaj: Transitions to jak płynny ruch słońca nad egipskimi piramidami - nie skoki, ale stopniowe, naturalne przejścia!
Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Jaka jest różnica między animation a transition w CSS?
2. Jak zastosować transition do wszystkich właściwości CSS?
To 2 z 3 pytań do tej lekcji. Pozostałe rozwiążesz w grze.
Zadania praktyczne w grze
- Edytor kodu
Użyj transition wraz z :hover aby stworzyć efekt powiększania i zmiany koloru klejnotów jak błyszczące skarby w grobowcu.
- Układanie w poziomie
Ułóż skróconą deklarację transition w poprawnej kolejności:
- Klikanie w kolejności
Ułóż właściwości transition w kolejności shorthand:
- Układanie w pionie
Ułóż proces tworzenia hover efektu z transition:
- Układanie w pionie
Ułóż regułę CSS dla efektu hover z transformacją:
- Klikanie w kolejności
Ułóż składnię CSS transition w prawidłowej kolejności skrótu
- Układanie w pionie
Ułóż kroki implementacji CSS transition od początku do końca: