Kurs JavaScript i React · Moduł 7: Stylowanie i animacje

Tailwind CSS - Kosmiczna wydajność stylowania

4 min czytania
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 -p

Powyż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 tekst
  • font-bold - pogrubiony tekst
  • py-2 px-4 - padding: 0.5rem górny i dolny, 1rem lewy i prawy
  • rounded - zaokrąglone rogi
  • transition 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

  1. Szybkość rozwoju - Nie musisz przełączać się między plikami CSS i JSX, wszystko jest w jednym miejscu.

  2. Niski przyrost wielkości pakietu - Dzięki PurgeCSS, końcowy plik CSS zawiera tylko używane klasy.

  3. Spójność projektu - Predefiniowane skale kolorów, rozmiarów itp. wymuszają spójność.

  4. Responsywność - Intuicyjny system breakpointów ułatwia tworzenie responsywnych interfejsów.

  5. Ł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:

  1. Nagłówek z logo misji i menu nawigacyjnym
  2. Panel kontrolny z przyciskami i wskaźnikami
  3. Sekcję monitoringu z danymi w formie kart
  4. 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. 1. Która jednostka CSS jest najlepsza do tworzenia responsywnych rozmiarów czcionek?

  2. 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

Przydatne artykuły