Przejdź do treści
School IT / Przestrzeń do nauki

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

Angular 22 Bootstrap 5.3 npm install angular.json btn card siatka 45 min
CEL LEKCJI

Czego się dziś nauczysz

  • Zainstalujesz Bootstrapa poleceniem npm install i sprawdzisz wpis w package.json.
  • Podłączysz arkusz Bootstrapa w angular.json i 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.

TEORIA

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.

TEORIA

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.

DrogaOcenaUwaga
angular.json → "styles"używana w kursietypowa dla projektów z CLI; styles.css zostaje na Twój kod
@import w src/styles.cssrównie poprawna@import "bootstrap/dist/css/bootstrap.min.css"; daje ten sam wynik
<link> do CDN w index.htmlna szybki testbez internetu strona traci wygląd — na egzaminie ryzykowne
style komponentunie zadziałaBootstrap 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.

TEORIA

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

KlasyCo robią
btn + btn-primary, btn-success, btn-danger, btn-secondaryprzycisk wypełniony kolorem
btn-outline-primary (i inne kolory)przycisk z samym obramowaniem
btn-sm, btn-lgmniejszy, większy przycisk
card, card-body, card-title, card-textkarta: 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-3odstęp między kolumnami w row
p-3, mb-2, mt-3, me-2odstęp wewnętrzny (padding), dolny/górny/prawy margines; liczby 0–5
bg-dark, bg-light, text-white, text-mutedkolor tła, kolor tekstu
border-primary, text-centerkolor ramki, wyśrodkowany tekst
PRZYKŁAD 1

Zainstaluj i podłącz Bootstrapa

Zatrzymaj serwer i wpisz polecenie w terminalu otwartym w folderze projektu.

terminal — w folderze klub-gier
npm install bootstrap

W angular.json znajdź tablicę "styles" (jest w sekcji "build" → "options") i dopisz ścieżkę przed src/styles.css:

angular.json — fragment, tablica „styles”
"styles": [
  "node_modules/bootstrap/dist/css/bootstrap.min.css",
  "src/styles.css"
]

Uruchom serwer ponownie: npm start.

wynik
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?

PRZYKŁAD 2

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.

src/app/app.html — pełny plik
<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>
wynik w przeglądarce
[ 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?

PRZYKŁAD 3

Karta wydarzenia

Karta to najczęściej używany element w tym kursie. Zapamiętaj jej budowę — wróci w wielu lekcjach.

src/app/app.html — pełny plik
<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>
wynik w przeglądarce
┌──────────────────────────────┐
│ 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?

PRZYKŁAD 4

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.

src/app/app.html — pełny plik
<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>
wynik w przeglądarce
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?

ELEMENTY WBUDOWANE

Zestawienie elementów

ElementZnaczenieUwagi
npm install bootstrappobranie bibliotekiDopisuje wpis w package.json.
"styles" w angular.jsonarkusze dołączane do całej aplikacjiPo zmianie restart serwera.
npm install (bez nazwy)odtworzenie node_modulesNa podstawie package.json.
btn + btn-kolorprzyciskKształt i kolor to dwie osobne klasy.
btn-outline-kolor, btn-sm, btn-lgwariant i rozmiar przyciskuDopisujesz obok btn.
card, card-bodykarta i jej wnętrzecard-title, card-text dla treści.
badge text-bg-kolorodznakaKolor tekstu dobiera się sam.
container, row, col-12, col-md-4siatka 12 kolumnmd = od średniej szerokości ekranu.
g-3odstęp między kolumnamiNa elemencie row.
p-3, m-3, mt-3, mb-2, me-2odstępyp = wewnątrz, m = na zewnątrz; t/b/s/e = góra/dół/start/koniec.
bg-dark, text-white, text-muted, border-primarykolory tła, tekstu, ramkiTe same nazwy kolorów co w przyciskach.
CZĘSTE BŁĘDY

Zanim utkniesz

Co widziszPrzyczyna 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 BootstrapaBootstrap stoi w tablicy "styles" za src/styles.css i nadpisuje Twój styl. Bootstrap ma być pierwszy.
Przycisk ma kolor, ale jest szary i kanciastyBrak klasy btn. Samo btn-primary nie wystarczy.
Karty nie stają w rzędzieKolumny muszą leżeć bezpośrednio w elemencie row, a ten w container.
class="btn, btn-primary" nie działaKlasy oddziela się spacją, nie przecinkiem.
Dwa atrybuty class w jednym znacznikuDziała tylko pierwszy. Wszystkie klasy wpisz w jeden atrybut.
ZADANIA

Zadania

ZAD 1Zmień kolory karty★☆☆

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

ZAD 2Panel przycisków★☆☆

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.

ZAD 3Wizytówka jako karta★★☆

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.

ZAD 4Cztery karty, po dwie w rzędzie★★☆

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.

ZAD 5Cennik karnetów★★★

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.

ZAD 6Pasek nagłówka bez JavaScriptu★★★

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.

PODSUMOWANIE

Co trzeba zapamiętać

  • Bibliotekę pobiera npm install, a podłącza wpis w tablicy "styles" w angular.json.
  • Po zmianie angular.json trzeba 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.
  • btn nadaje kształt, btn-primary kolor — klasy się uzupełniają i oddziela się je spacją.
  • Karta to card z card-body w ś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.

Postęp zapisuje się w tej przeglądarce.