Kurs JavaScript i React · Moduł 7: Stylowanie i animacje
Tailwind CSS - Kosmiczna wydajność stylowania
W tej lekcji9
W naszej kosmicznej podróży przez galaktykę React, docieramy do jednej z najbardziej rewolucyjnych technologii ostatnich lat - Tailwind CSS. To jak odkrycie zaawansowanej, wysokowydajnej technologii obcych cywilizacji, która całkowicie zmienia sposób, w jaki budujemy interfejsy użytkownika.
Czym jest Tailwind CSS?
Tailwind CSS to framework CSS oparty na podejściu utility-first, które polega na komponowaniu interfejsów poprzez zastosowanie klas użytkowych bezpośrednio w kodzie HTML/JSX. Zamiast pisać własne style CSS, używasz gotowych klas, które reprezentują pojedyncze właściwości CSS.
Wyobraź sobie, że każda klasa Tailwind to jak mały komponent statku kosmicznego - niezależny, specjalizowany i gotowy do natychmiastowego użycia. Połączone razem tworzą pełnoprawny, spersonalizowany statek kosmiczny (interfejs) dokładnie taki, jakiego potrzebujesz.
Instalacja i konfiguracja Tailwind CSS w projekcie React
Aby rozpocząć przygodę z Tailwind CSS w projekcie React, należy wykonać kilka kroków:
1# Instalacja Tailwind CSS i jego zależności
2npm install -D tailwindcss postcss autoprefixer
3npx tailwindcss init -pPowyższe komendy instalują Tailwind CSS wraz z niezbędnymi zależnościami oraz tworzą podstawowe pliki konfiguracyjne: tailwind.config.js i postcss.config.js.
Następnie, edytujemy plik tailwind.config.js:
1/** @type {import('tailwindcss').Config} */
2module.exports = {
3 content: [
4 "./src/**/*.{js,jsx,ts,tsx}",
5 ],
6 theme: {
7 extend: {},
8 },
9 plugins: [],
10}Na koniec, dodajemy dyrektywy Tailwind do naszego głównego pliku CSS:
1/* index.css */
2@tailwind base;
3@tailwind components;
4@tailwind utilities;Podstawy korzystania z Tailwind CSS
Stylowanie komponentów z użyciem Tailwind CSS jest jak budowanie z klocków. Każda klasa reprezentuje jedną konkretną właściwość CSS. Przyjrzyjmy się, jak stworzyć przycisk:
1function SpaceButton() {
2 return (
3 <button className="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded transition duration-300">
4 Aktywuj napęd nadświetlny
5 </button>
6 );
7}W powyższym przykładzie:
bg-blue-500- tło w kolorze niebieskim (skala 500)hover:bg-blue-700- kolor tła po najechaniu myszkątext-white- biały tekstfont-bold- pogrubiony tekstpy-2 px-4- padding: 0.5rem górny i dolny, 1rem lewy i prawyrounded- zaokrąglone rogitransition duration-300- płynna animacja trwająca 300ms
Responsywność z Tailwind CSS
Tailwind oferuje intuicyjny system modyfikatorów dla różnych breakpointów. Wyobraź sobie, że twój interfejs kosmiczny musi dostosowywać się do różnych urządzeń wyświetlających - od małych paneli kontrolnych po ogromne ekrany centrum dowodzenia.
1<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
2 <div className="bg-gray-100 p-4 rounded">Panel 1</div>
3 <div className="bg-gray-100 p-4 rounded">Panel 2</div>
4 <div className="bg-gray-100 p-4 rounded">Panel 3</div>
5</div>W tym przykładzie:
- Na małych ekranach mamy 1 kolumnę
- Na średnich (
md:) mamy 2 kolumny - Na dużych (
lg:) mamy 3 kolumny
Własne style i komponowanie klas
Rozszerzanie motywu
Możesz dostosować kolory, czcionki, breakpointy i inne aspekty Tailwind do swojego projektu, edytując plik tailwind.config.js:
1module.exports = {
2 theme: {
3 extend: {
4 colors: {
5 'space-blue': '#1a2b3c',
6 'cosmic-purple': '#7209b7',
7 'stellar-red': '#f72585',
8 },
9 fontFamily: {
10 'futuristic': ['Space Grotesk', 'sans-serif'],
11 },
12 spacing: {
13 '128': '32rem',
14 },
15 },
16 },
17 // ...pozostała konfiguracja
18}Komponowanie klas z @apply
Dla powtarzających się kombinacji klas, Tailwind oferuje dyrektywę @apply, która pozwala na tworzenie własnych klas złożonych:
1/* index.css */
2@tailwind base;
3@tailwind components;
4
5@layer components {
6 .space-button {
7 @apply bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded transition duration-300;
8 }
9
10 .planet-card {
11 @apply bg-gray-800 text-white p-6 rounded-lg shadow-lg hover:shadow-xl transition-shadow;
12 }
13}
14
15@tailwind utilities;Teraz możesz używać tych klas w swoich komponentach:
1<button className="space-button">Rozpocznij misję</button>
2<div className="planet-card">
3 <h3>Mars</h3>
4 <p>Czerwona planeta</p>
5</div>Zalety Tailwind CSS
Szybkość rozwoju - Nie musisz przełączać się między plikami CSS i JSX, wszystko jest w jednym miejscu.
Niski przyrost wielkości pakietu - Dzięki PurgeCSS, końcowy plik CSS zawiera tylko używane klasy.
Spójność projektu - Predefiniowane skale kolorów, rozmiarów itp. wymuszają spójność.
Responsywność - Intuicyjny system breakpointów ułatwia tworzenie responsywnych interfejsów.
Łatwość współpracy - Deweloperzy pracują w tym samym systemie, co prowadzi do bardziej spójnego kodu.
Kiedy używać Tailwind CSS?
Tailwind jest idealny dla:
- Projektów, gdzie cenimy szybkość rozwoju
- Aplikacji, które potrzebują spójnego systemu designu
- Zespołów, które chcą uniknąć konfliktów w CSS
- Sytuacji, gdy chcemy uniknąć wymyślania nazw klas
Integracja z innymi narzędziami i frameworkami
Tailwind świetnie integruje się z innymi narzędziami i bibliotekami. Możesz używać go razem z:
- Styled Components - poprzez plugin tailwind-styled-components
- Material UI lub Chakra UI - jako uzupełnienie dla bardziej specyficznych stylów
- Framer Motion - dodając animacje do elementów stylizowanych za pomocą Tailwind
Zadanie praktyczne: Stwórz interfejs kosmicznego kokpitu
Wykorzystaj Tailwind CSS, aby stworzyć responsywny interfejs kokpitu kosmicznego zawierający:
- Nagłówek z logo misji i menu nawigacyjnym
- Panel kontrolny z przyciskami i wskaźnikami
- Sekcję monitoringu z danymi w formie kart
- Stopkę z informacjami o misji
Pamiętaj o responsywności i zastosowaniu różnych komponentów Tailwind, takich jak flex, grid, kart, przycisków itp.
To zadanie pozwoli ci eksplorować kosmiczny świat utility-first CSS i zrozumieć, jak Tailwind CSS może przyspieszyć twoją podróż przez galaktykę frontendowego rozwoju.
Kod do tej lekcji: App.jsx
1import React, { useState } from 'react';
2import './styles.css';
3
4// Symulacja Tailwind CSS przy użyciu standardowych klas
5// W prawdziwym projekcie użyłbyś pełnego Tailwind CSS
6
7function SpaceDashboard() {
8 const [selectedPlanet, setSelectedPlanet] = useState(null);
9
10 const planets = [
11 { id: 1, name: 'Mars', distance: '225 mln km', temp: '-60°C', moons: 2 },
12 { id: 2, name: 'Jowisz', distance: '778 mln km', temp: '-110°C', moons: 79 },
13 { id: 3, name: 'Saturn', distance: '1.4 mld km', temp: '-140°C', moons: 82 },
14 { id: 4, name: 'Uran', distance: '2.9 mld km', temp: '-195°C', moons: 27 },
15 ];
16
17 return (
18 <div className="min-h-screen bg-gradient-to-br from-gray-900 via-purple-900 to-gray-900 p-6">
19 {/* Header */}
20 <header className="text-center mb-12">
21 <h1 className="text-4xl font-bold text-cyan-400 mb-2">
22 System Słoneczny Explorer
23 </h1>
24 <p className="text-gray-400">
25 Utility-First CSS z klasami Tailwind
26 </p>
27 </header>
28
29 {/* Grid z planetami */}
30 <div className="max-w-6xl mx-auto grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
31 {planets.map(planet => (
32 <div
33 key={planet.id}
34 onClick={() => setSelectedPlanet(planet)}
35 className={`
36 bg-white/5 backdrop-blur-sm rounded-xl p-6
37 border border-white/10 cursor-pointer
38 transition-all duration-300 hover:scale-105
39 hover:border-cyan-500/50 hover:shadow-lg hover:shadow-cyan-500/20
40 ${selectedPlanet?.id === planet.id ? 'ring-2 ring-cyan-400' : ''}
41 `}
42 >
43 <h3 className="text-xl font-bold text-yellow-400 mb-4">
44 {planet.name}
45 </h3>
46
47 <div className="space-y-2 text-sm">
48 <div className="flex justify-between">
49 <span className="text-gray-400">Odległość:</span>
50 <span className="text-white">{planet.distance}</span>
51 </div>
52 <div className="flex justify-between">
53 <span className="text-gray-400">Temperatura:</span>
54 <span className="text-cyan-300">{planet.temp}</span>
55 </div>
56 <div className="flex justify-between">
57 <span className="text-gray-400">Księżyce:</span>
58 <span className="text-white">{planet.moons}</span>
59 </div>
60 </div>
61 </div>
62 ))}
63 </div>
64
65 {/* Panel szczegółów */}
66 {selectedPlanet && (
67 <div className="max-w-2xl mx-auto bg-white/5 backdrop-blur-sm rounded-xl p-8 border border-cyan-500/30">
68 <h2 className="text-2xl font-bold text-cyan-400 mb-4">
69 Szczegóły: {selectedPlanet.name}
70 </h2>
71
72 <div className="grid grid-cols-2 gap-4 mb-6">
73 <div className="bg-white/5 rounded-lg p-4">
74 <p className="text-gray-400 text-sm">Odległość od Słońca</p>
75 <p className="text-2xl font-bold text-white">{selectedPlanet.distance}</p>
76 </div>
77 <div className="bg-white/5 rounded-lg p-4">
78 <p className="text-gray-400 text-sm">Średnia temperatura</p>
79 <p className="text-2xl font-bold text-cyan-300">{selectedPlanet.temp}</p>
80 </div>
81 </div>
82
83 <div className="flex gap-4">
84 <button className="flex-1 bg-cyan-500 hover:bg-cyan-600 text-black font-bold py-3 px-6 rounded-lg transition-colors">
85 Zaplanuj misję
86 </button>
87 <button className="flex-1 bg-transparent border-2 border-yellow-500 text-yellow-500 hover:bg-yellow-500/10 font-bold py-3 px-6 rounded-lg transition-colors">
88 Więcej informacji
89 </button>
90 </div>
91 </div>
92 )}
93
94 {/* Stopka */}
95 <footer className="text-center mt-12 text-gray-500 text-sm">
96 <p>Tailwind CSS pozwala budować interfejsy używając klas utility</p>
97 <p className="mt-1">bez pisania własnego CSS</p>
98 </footer>
99 </div>
100 );
101}
102
103export default SpaceDashboard;Widzisz błąd w tej lekcji?
Sprawdź się
Odpowiedz na pytania z tej lekcji. Wybierz odpowiedź, a od razu zobaczysz, czy jest poprawna.
1. Która jednostka CSS jest najlepsza do tworzenia responsywnych rozmiarów czcionek?
2. Które podejście do breakpointów jest zalecane w responsive design?
To 2 z 3 pytań do tej lekcji. Pozostałe rozwiążesz w grze.
Zadania praktyczne w grze
- Edytor kodu
Responsive design z SCSS