Bootstrap w projekcie
Przez cały kurs będziesz budować ekrany, które mają wyglądać jak prawdziwa strona, a nie jak surowy HTML. Bootstrap załatwia to gotowymi klasami — instalujesz go raz, dziś, i od razu budujesz przyciski, karty i siatkę.
Czego się dziś nauczysz
- Zainstalujesz Bootstrapa poleceniem
npm installi sprawdzisz wpis wpackage.json. - Podłączysz arkusz Bootstrapa w
angular.jsoni wyjaśnisz, dlaczego trzeba zrestartować serwer. - Powiesz, dlaczego Bootstrapa nie podłącza się w stylach jednego komponentu.
- Zbudujesz przyciski w kilku kolorach i rozmiarach.
- Zbudujesz kartę z tytułem, tekstem, odznaką i przyciskiem.
- Ułożysz karty w siatce, która na wąskim ekranie sama ustawia je jedna pod drugą.
- Użyjesz klas pomocniczych do odstępów, kolorów tła i tekstu.
Przygotowanie: lekcje 01–02 — masz działający projekt i wiesz, który plik za co odpowiada. Przewidywany czas: 45 min z zadaniami.
Po co nam gotowy CSS
Możesz napisać własny CSS do każdego ekranu w tym kursie. Tylko że wtedy połowa czasu zajęć zejdzie na obramowania i odstępy, a nie na Angulara.
Bootstrap daje gotowe klasy CSS: btn robi z przycisku przycisk, card rysuje kartę. Dopisujesz je do zwykłego HTML-a i wszystko wygląda spójnie. W dalszych lekcjach będziesz te klasy włączać i wyłączać z kodu — i wtedy zrobi się ciekawie.
Tylko CSS, bez części JavaScript
Bootstrap ma też część w JavaScripcie — rozwijane menu, okna modalne, karuzelę. W tym kursie jej nie używamy: wszystko, co ma reagować na kliknięcie, zrobisz w Angularze. Wystarczy sam arkusz CSS.
Jak biblioteka trafia do projektu
npm install pobiera
Polecenie npm install bootstrap pobiera pliki do folderu node_modules i dopisuje jedną linijkę w package.json. Dzięki tej linijce kolega, który dostanie Twój projekt bez node_modules, odtworzy wszystko jednym poleceniem npm install.
angular.json podłącza
Samo pobranie nic nie zmienia. Angular musi wiedzieć, że ma dołączyć plik CSS do strony. Mówisz mu to, dopisując ścieżkę w tablicy "styles" w pliku angular.json. Kompilator skleja wszystkie pliki z tej tablicy w jeden arkusz i podłącza go do strony.
Dlaczego nie w stylach komponentu
Style komponentu są izolowane — CSS wpisany w jednym komponencie nie działa w innych. To dobra cecha, ale oznacza, że Bootstrap podłączony w jednym komponencie obowiązywałby tylko tam. My chcemy go wszędzie.
| Droga | Ocena | Uwaga |
|---|---|---|
angular.json → "styles" | używana w kursie | typowa dla projektów z CLI; styles.css zostaje na Twój kod |
@import w src/styles.css | równie poprawna | @import "bootstrap/dist/css/bootstrap.min.css"; daje ten sam wynik |
<link> do CDN w index.html | na szybki test | bez internetu strona traci wygląd — na egzaminie ryzykowne |
| style komponentu | nie zadziała | Bootstrap obowiązywałby tylko w tym komponencie |
Restart serwera
angular.json jest czytany tylko przy starcie serwera. Po każdej zmianie w tym pliku zatrzymaj serwer (Ctrl+C) i uruchom go ponownie (npm start). To jedyne miejsce w kursie, gdzie przeładowanie na żywo nie wystarczy.
Klasy, których używamy w kursie
Bootstrap ma setki klas. Do całego kursu wystarczy kilkanaście — reszta jest w dokumentacji, gdy będzie potrzebna. Klasy się uzupełniają: btn nadaje kształt, btn-primary kolor, btn-sm rozmiar — piszesz je razem, oddzielone spacją.
| Klasy | Co robią |
|---|---|
btn + btn-primary, btn-success, btn-danger, btn-secondary | przycisk wypełniony kolorem |
btn-outline-primary (i inne kolory) | przycisk z samym obramowaniem |
btn-sm, btn-lg | mniejszy, większy przycisk |
card, card-body, card-title, card-text | karta: ramka, wnętrze z odstępem, tytuł, tekst |
badge + text-bg-success, text-bg-warning… | odznaka z tłem i dobranym kolorem tekstu |
container → row → col-* | siatka: 12 kolumn w rzędzie |
g-3 | odstęp między kolumnami w row |
p-3, mb-2, mt-3, me-2 | odstęp wewnętrzny (padding), dolny/górny/prawy margines; liczby 0–5 |
bg-dark, bg-light, text-white, text-muted | kolor tła, kolor tekstu |
border-primary, text-center | kolor ramki, wyśrodkowany tekst |
Zainstaluj i podłącz Bootstrapa
Zatrzymaj serwer i wpisz polecenie w terminalu otwartym w folderze projektu.
npm install bootstrap
W angular.json znajdź tablicę "styles" (jest w sekcji "build" → "options") i dopisz ścieżkę przed src/styles.css:
"styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"src/styles.css"
]
Uruchom serwer ponownie: npm start.
package.json: "bootstrap": "^5.3.8" (w sekcji "dependencies")
przeglądarka: czcionka zmienia się na bezszeryfową, znikają domyślne marginesy
Zmiana czcionki to znak, że Bootstrap działa. Pliki z tablicy "styles" są dołączane w kolejności zapisu — dlatego Twój styles.css stoi drugi i może nadpisać styl Bootstrapa.
Zatrzymaj się
Otwórz package.json i znajdź wpis o Bootstrapie. Co by się stało z Twoim projektem na innym komputerze, gdyby tego wpisu zabrakło, a ktoś skopiował projekt bez folderu node_modules?
Przyciski
Bootstrap to zestaw klas CSS. Nie dodajesz żadnego kodu TypeScript — tylko klasy w HTML. Wklej przykład do app.html w miejsce dotychczasowej treści.
<div class="p-3">
<button class="btn btn-primary me-2">Zapisz się</button>
<button class="btn btn-outline-secondary me-2">Anuluj</button>
<button class="btn btn-danger btn-sm">Usuń</button>
</div>
[ Zapisz się ] (niebieski, wypełniony)
[ Anuluj ] (szare obramowanie)
[ Usuń ] (czerwony, mniejszy)
Trzy przyciski różnią się kolorem, wypełnieniem i rozmiarem, choć w kodzie różnią się tylko klasami. p-3 dodaje odstęp wokół całej grupy, me-2 — odstęp z prawej strony przycisku.
Zatrzymaj się
Usuń klasę btn z pierwszego przycisku, zostawiając btn-primary. Co zniknęło, a co zostało? Wniosek: która klasa odpowiada za kształt, a która za kolor?
Karta wydarzenia
Karta to najczęściej używany element w tym kursie. Zapamiętaj jej budowę — wróci w wielu lekcjach.
<div class="card m-3" style="width: 20rem">
<div class="card-body">
<h5 class="card-title">Turniej retro</h5>
<p class="card-text">Piątek, sala 12. Zostały ostatnie miejsca.</p>
<span class="badge text-bg-warning me-2">2 miejsca</span>
<button class="btn btn-primary btn-sm">Zapisz się</button>
</div>
</div>
┌──────────────────────────────┐
│ Turniej retro │
│ Piątek, sala 12. Zostały │
│ ostatnie miejsca. │
│ [2 miejsca] [Zapisz się] │
└──────────────────────────────┘
Ramkę i zaokrąglone rogi daje card, odstęp od krawędzi — card-body. Odznaka text-bg-warning jest żółta z ciemnym tekstem; zmień ją na text-bg-success i zobacz zieloną. style="width: 20rem" to zwykły styl HTML — ogranicza szerokość karty, która inaczej zajęłaby całą stronę.
Zatrzymaj się
Usuń class="card-body" (zostaw sam div). Czego zabrakło w wyglądzie karty?
Trzy karty w siatce
Siatka Bootstrapa dzieli szerokość na 12 kolumn. Element z klasą col-md-4 zajmuje 4 z 12, więc w rzędzie mieszczą się trzy takie.
<div class="container mt-3">
<h1 class="mb-3">Klub gier</h1>
<div class="row g-3">
<div class="col-12 col-md-4">
<div class="card p-3">Turniej retro</div>
</div>
<div class="col-12 col-md-4">
<div class="card p-3">Noc robotów</div>
</div>
<div class="col-12 col-md-4">
<div class="card p-3">Warsztat druku 3D</div>
</div>
</div>
</div>
szeroki ekran: [Turniej retro] [Noc robotów] [Warsztat druku 3D]
wąski ekran: [Turniej retro]
[Noc robotów]
[Warsztat druku 3D]
Zwęź okno przeglądarki — karty ułożą się jedna pod drugą. To zasługa pary klas: col-12 (na małym ekranie cała szerokość) i col-md-4 (od średniej szerokości w górę — jedna trzecia). Hierarchia jest zawsze ta sama: container → row → col-* → treść.
Zatrzymaj się
Jaką klasę wpiszesz zamiast col-md-4, żeby na szerokim ekranie zmieściły się cztery karty w rzędzie? A dwie?
Zestawienie elementów
| Element | Znaczenie | Uwagi |
|---|---|---|
npm install bootstrap | pobranie biblioteki | Dopisuje wpis w package.json. |
"styles" w angular.json | arkusze dołączane do całej aplikacji | Po zmianie restart serwera. |
npm install (bez nazwy) | odtworzenie node_modules | Na podstawie package.json. |
btn + btn-kolor | przycisk | Kształt i kolor to dwie osobne klasy. |
btn-outline-kolor, btn-sm, btn-lg | wariant i rozmiar przycisku | Dopisujesz obok btn. |
card, card-body | karta i jej wnętrze | card-title, card-text dla treści. |
badge text-bg-kolor | odznaka | Kolor tekstu dobiera się sam. |
container, row, col-12, col-md-4 | siatka 12 kolumn | md = od średniej szerokości ekranu. |
g-3 | odstęp między kolumnami | Na elemencie row. |
p-3, m-3, mt-3, mb-2, me-2 | odstępy | p = wewnątrz, m = na zewnątrz; t/b/s/e = góra/dół/start/koniec. |
bg-dark, text-white, text-muted, border-primary | kolory tła, tekstu, ramki | Te same nazwy kolorów co w przyciskach. |
Zanim utkniesz
| Co widzisz | Przyczyna i naprawa |
|---|---|
| Strona wygląda tak samo jak przed instalacją | Serwer nie został uruchomiony ponownie po zmianie angular.json. |
| Przy starcie: Could not resolve „node_modules/bootstrap/…” | Literówka w ścieżce albo npm install bootstrap uruchomione w innym folderze niż projekt. |
Reguła z styles.css nie zmienia wyglądu elementu Bootstrapa | Bootstrap stoi w tablicy "styles" za src/styles.css i nadpisuje Twój styl. Bootstrap ma być pierwszy. |
| Przycisk ma kolor, ale jest szary i kanciasty | Brak klasy btn. Samo btn-primary nie wystarczy. |
| Karty nie stają w rzędzie | Kolumny muszą leżeć bezpośrednio w elemencie row, a ten w container. |
class="btn, btn-primary" nie działa | Klasy oddziela się spacją, nie przecinkiem. |
Dwa atrybuty class w jednym znaczniku | Działa tylko pierwszy. Wszystkie klasy wpisz w jeden atrybut. |
Zadania
W karcie z przykładu 3 zmień odznakę na zieloną z tekstem wolne miejsca, a przycisk na taki z samym obramowaniem.
Kryterium sukcesu: odznaka jest zielona, przycisk ma obramowanie zamiast wypełnienia.
Podpowiedź
Szukaj klas zaczynających się od text-bg- i btn-outline-.
Zbuduj panel czterech przycisków sklepiku szkolnego: duży zielony „Kup”, zwykły niebieski „Do koszyka”, zwykły szary z obramowaniem „Wróć” i mały czerwony „Usuń”. Przyciski mają mieć odstępy między sobą, a cały panel — odstęp od krawędzi strony.
Kryterium sukcesu: cztery przyciski różnią się kolorem i rozmiarem zgodnie z opisem i nie stykają się ze sobą.
Podpowiedź
Rozmiar: btn-lg, btn-sm. Odstępy: me-2 na przyciskach, p-3 na otaczającym div.
Przerób wizytówkę klubu z zadania 2 lekcji 01 na kartę Bootstrapa szerokości 22rem: nazwa klubu jako card-title, dzień i godzina spotkań jako card-text w kolorze text-muted, lista trzech wydarzeń, a na dole niebieski przycisk „Dołącz”. Wyśrodkuj tekst w całej karcie.
Kryterium sukcesu: karta ma ramkę, odstęp wewnętrzny, szary podtytuł, listę i przycisk, a cały tekst jest wyśrodkowany.
Podpowiedź
text-center dopisz do elementu z klasą card-body — obejmie wszystko, co jest w środku.
Dodaj czwartą kartę do siatki z przykładu 4 i ustaw kolumny tak, żeby na szerokim ekranie były po dwie karty w rzędzie, a na wąskim — jedna pod drugą.
Kryterium sukcesu: szeroki ekran: dwa rzędy po dwie karty; wąski: cztery karty jedna pod drugą.
Podpowiedź
Dwie karty w rzędzie to połowa z 12 kolumn.
Zbuduj cennik karnetów do klubu: trzy karty w siatce (na szerokim ekranie w rzędzie, na wąskim jedna pod drugą). Każda karta ma nazwę karnetu (Jednorazowy, Miesięczny, Semestralny), cenę w odznace, dwa zdania opisu i przycisk „Wybieram”. Środkowa karta jest polecana: ma niebieską ramkę, napis „Polecany” nad nazwą i wypełniony przycisk, podczas gdy pozostałe mają przyciski z obramowaniem.
Kryterium sukcesu: trzy karty o tej samej budowie, środkowa wyraźnie wyróżniona, układ zmienia się po zwężeniu okna.
Podpowiedź
Ramkę wyróżnia border-primary dopisane obok card. Napis „Polecany” może być odznaką badge text-bg-primary.
Dodaj nad siatką z przykładu 4 ciemny pasek na całą szerokość ekranu z nazwą szkoły po lewej. Użyj komponentu navbar z dokumentacji Bootstrapa (getbootstrap.com → Docs → Components → Navbar), ale w najprostszej wersji: bez przycisku rozwijania menu i bez części JavaScript. Pod nazwą szkoły w pasku umieść jeden odnośnik „Kontakt” (href="#").
Kryterium sukcesu: pasek jest ciemny, sięga od krawędzi do krawędzi okna, a treść w nim zaczyna się w tej samej linii co karty pod spodem.
Podpowiedź
Szkielet: <nav class="navbar bg-dark" data-bs-theme="dark"><div class="container"><span class="navbar-brand">…</span></div></nav>. Pasek musi stać przed elementem container z kartami, a nie w nim — inaczej nie sięgnie krawędzi. Odnośnik dostaje klasę nav-link.
Co trzeba zapamiętać
- Bibliotekę pobiera
npm install, a podłącza wpis w tablicy"styles"wangular.json. - Po zmianie
angular.jsontrzeba zrestartować serwer. - Bootstrapa nie podłącza się w stylach komponentu, bo te działają tylko w jednym komponencie.
- W kursie używamy tylko CSS Bootstrapa; to, co reaguje na kliknięcia, robi Angular.
btnnadaje kształt,btn-primarykolor — klasy się uzupełniają i oddziela się je spacją.- Karta to
cardzcard-bodyw środku. - Siatka to
container→row→col-*; rząd ma 12 kolumn. - Odstępy:
p-*wewnątrz,m-*na zewnątrz, liczby 0–5.
Sprawdź się: dlaczego po instalacji Bootstrapa trzeba uruchomić serwer ponownie, a po zmianie app.html już nie?
Dokumentacja: getbootstrap.com — Bootstrap 5.3.