Spis treści
Strony internetowe zbudowane są z trzech warstw: HTML nadaje treści strukturę i znaczenie, CSS odpowiada za wygląd i układ, a JavaScript za zachowanie. Ten kurs obejmuje dwie pierwsze warstwy oraz framework Bootstrap. W egzaminie pojawiają się zarówno pytania o znaczniki, selektory i właściwości, jak i zadania, w których trzeba samodzielnie wykonać stronę według projektu graficznego.
Każda lekcja kończy się krótkimi pytaniami „Sprawdź się” ze schowaną odpowiedzią, a każda część – zadaniem praktycznym. Kod z lekcji warto przepisywać do własnych plików i sprawdzać w przeglądarce, bo najwięcej uczy samodzielne eksperymentowanie.
Część A
HTML: struktura, tekst, multimedia i formularze
Budowa dokumentu HTML5, elementy semantyczne, listy, odnośniki, obrazy, tabele i formularze z walidacją po stronie przeglądarki.
Część A, lekcja 1
Struktura dokumentu HTML5 i elementy semantyczne
HTML (HyperText Markup Language) to język znaczników opisujący strukturę i znaczenie treści strony. Wygląd zapewnia CSS, a zachowanie JavaScript. Przeglądarka pobiera plik HTML, buduje z niego drzewo DOM i dopiero wtedy wyświetla stronę.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Moja pierwsza strona</title>
<link rel="stylesheet" href="styl.css">
</head>
<body>
<h1>Witaj w serwisie</h1>
<p>To jest akapit tekstu.</p>
</body>
</html>
| Element | Do czego służy |
|---|---|
<!DOCTYPE html> | wskazuje przeglądarce, że to dokument HTML5 (tryb standardów, nie „quirks”) |
<html lang="pl"> | korzeń dokumentu; atrybut lang pomaga czytnikom ekranu i wyszukiwarkom |
<head> | informacje o dokumencie (niewidoczne na stronie): kodowanie, tytuł, style, skrypty |
<meta charset="UTF-8"> | kodowanie znaków – dzięki niemu poprawnie wyświetlają się polskie litery |
<meta name="viewport"> | skalowanie strony na urządzeniach mobilnych (podstawa responsywności) |
<title> | tytuł widoczny na karcie przeglądarki i w wynikach wyszukiwania |
<body> | cała widoczna treść strony |
Elementy semantyczne
Elementy semantyczne nazywają rolę fragmentu strony, więc ułatwiają dostępność (nawigacja czytnikiem ekranu) i pozycjonowanie. Zamiast samych <div> stosujemy:
| Element | Rola |
|---|---|
<header> | nagłówek strony lub sekcji (logo, tytuł) |
<nav> | główne menu nawigacyjne |
<main> | główna treść strony (tylko jeden na stronie) |
<section> | tematyczna sekcja treści, zwykle z nagłówkiem |
<article> | samodzielna całość (wpis, artykuł, komentarz) |
<aside> | treść poboczna (reklama, powiązane linki) |
<footer> | stopka strony lub sekcji |
<div> i <span> nie mają znaczenia semantycznego – służą tylko do grupowania i stylowania. Gdy istnieje element semantyczny, użyj go zamiast <div>.
Do czego służy atrybut lang w elemencie html i dlaczego warto go ustawić?
Pokaż przykładową odpowiedź
Informuje o języku treści. Czytniki ekranu dobierają wymowę, a przeglądarki i wyszukiwarki lepiej rozpoznają język i oferują poprawne tłumaczenie lub sprawdzanie pisowni.
Którego elementu użyjesz do menu głównego strony?
Pokaż przykładową odpowiedź
Elementu <nav>, najczęściej z listą odnośników <ul> w środku.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Uzupełnij szkielet dokumentu HTML5: deklarację typu dokumentu, język polski i kodowanie UTF-8.
<html lang="">
<head>
<meta charset="">
<title>Moja strona</title>
</head>
<body>
</body>
</html>
Uzupełnij elementy semantyczne układu strony.
<>Nagłówek serwisu</>
<>Menu</>
<>Treść główna</>
<>Stopka</>
Dokument nie ma deklaracji typu, języka strony ani kodowania znaków. Uzupełnij je.
Element title powinien być w sekcji head, a nie między head i body. Przenieś go.
Część A, lekcja 2
Tekst, nagłówki, listy i odnośniki
Nagłówki <h1>–<h6> budują hierarchię treści. Na stronie jest zwykle jeden <h1>, a kolejne poziomy nie powinny być pomijane (po h2 następuje h3, nie h5). Nagłówków nie używamy do powiększania tekstu – od tego jest CSS.
| Znacznik | Znaczenie | Uwagi |
|---|---|---|
<p> | akapit | przeglądarka dodaje odstępy nad i pod akapitem |
<strong>, <em> | ważny tekst (pogrubienie), podkreślenie znaczenia (kursywa) | nazywają znaczenie; <b> i <i> to tylko wygląd |
<br> | łamanie wiersza | znacznik pusty (bez zamknięcia) |
<hr> | tematyczna linia podziału | |
<blockquote>, <q> | cytat blokowy i krótki | |
<pre>, <code> | tekst sformatowany, fragment kodu | <pre> zachowuje spacje i nowe linie |
Listy
<ul> <!-- lista nieuporządkowana (punktowana) -->
<li>HTML</li>
<li>CSS</li>
</ul>
<ol type="1" start="3"> <!-- lista uporządkowana (numerowana) -->
<li>Trzeci krok</li>
<li>Czwarty krok</li>
</ol>
<dl> <!-- lista definicji -->
<dt>HTML</dt><dd>język znaczników</dd>
</dl>
Odnośniki
<a href="kontakt.html">Kontakt</a> <!-- względny -->
<a href="https://mti.edu.pl" target="_blank" rel="noopener">Szkoła</a> <!-- bezwzględny, nowa karta -->
<a href="#cennik">Przejdź do cennika</a> <!-- kotwica w tej samej stronie -->
<a href="mailto:biuro@firma.pl">Napisz do nas</a> <!-- program pocztowy -->
<a href="tel:+48221234567">Zadzwoń</a>
Ścieżka względna (img/logo.png, ../index.html) zależy od położenia pliku i działa po przeniesieniu całego serwisu. Ścieżka bezwzględna (https://domena.pl/img/logo.png lub /img/logo.png) wskazuje stałe miejsce. .. oznacza katalog nadrzędny.
Czym różni się <strong> od <b>?
Pokaż przykładową odpowiedź
<strong> oznacza tekst ważny znaczeniowo (czytniki ekranu mogą go zaakcentować), a <b> tylko pogrubia wygląd bez nadawania znaczenia.
Jak zapisać odnośnik, który otwiera się w nowej karcie?
Pokaż przykładową odpowiedź
<a href="adres" target="_blank" rel="noopener">opis</a>. Atrybut rel="noopener" chroni przed dostępem nowej karty do strony źródłowej.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Uzupełnij znaczniki: akapit, wyróżnienie, lista numerowana i jej element.
<h1>Przepisy</h1>
<>Składniki: <strong>mąka</strong> i <>cukier</em>.</p>
<>
<>Wymieszaj</li>
<li>Upiecz</li>
</ol>
Uzupełnij odnośniki: do pliku kontakt.html w nowej karcie oraz do poczty.
< ="kontakt.html" ="_blank">Kontakt</a>
<a href="jan@example.pl">Napisz do nas</a>
Odnośnik nie działa, bo atrybut z adresem ma złą nazwę. Popraw go.
Lista punktowana jest zbudowana ze złych znaczników: powinna być lista nienumerowana z elementami li.
Część A, lekcja 3
Obrazy i multimedia
<img src="img/kot.jpg" alt="Szary kot śpi na parapecie" width="400" height="300">
<figure>
<img src="img/wykres.png" alt="Wykres sprzedaży w 2025 roku">
<figcaption>Rys. 1. Sprzedaż w 2025 roku</figcaption>
</figure>
<picture>
<source media="(min-width: 800px)" srcset="img/baner-duzy.jpg">
<img src="img/baner-maly.jpg" alt="Baner reklamowy">
</picture>
- alt – tekst alternatywny, obowiązkowy: czytany przez czytniki ekranu i wyświetlany, gdy obraz się nie załaduje. Obrazy czysto ozdobne dostają
alt="". - width i height – rezerwują miejsce, więc strona nie „skacze” podczas ładowania.
<figure>+<figcaption>– obraz z podpisem.<picture>,srcset– różne pliki dla różnych ekranów.
Formaty plików graficznych na stronach
| Format | Typ | Zastosowanie |
|---|---|---|
| JPEG (.jpg) | rastrowy, stratna kompresja | zdjęcia; brak przezroczystości |
| PNG | rastrowy, bezstratny | grafiki z przezroczystością, zrzuty ekranu, logo rastrowe |
| GIF | rastrowy, 256 kolorów | proste animacje |
| SVG | wektorowy | logo, ikony, wykresy – skalują się bez utraty jakości, mały rozmiar |
| WebP / AVIF | rastrowy, nowoczesna kompresja | zdjęcia i grafiki mniejsze od JPEG/PNG przy podobnej jakości |
Dźwięk, wideo i osadzanie
<video controls width="640" poster="okladka.jpg">
<source src="film.mp4" type="video/mp4">
<source src="film.webm" type="video/webm">
Twoja przeglądarka nie obsługuje elementu video.
</video>
<audio controls src="nagranie.mp3"></audio>
<iframe src="https://www.youtube.com/embed/ID" title="Film instruktażowy" width="560" height="315" allowfullscreen></iframe>
Filmy powinny mieć napisy (<track kind="captions">), nagrania audio transkrypcję, a <iframe> atrybut title. Nie włączaj automatycznego odtwarzania z dźwiękiem.
Jakiego formatu użyjesz do logo, które ma być ostre na każdym ekranie?
Pokaż przykładową odpowiedź
Formatu wektorowego SVG, bo skaluje się bez utraty jakości.
Co oznacza pusty atrybut alt (alt="")?
Pokaż przykładową odpowiedź
Że obraz jest wyłącznie ozdobny, więc czytnik ekranu go pominie. Obrazy niosące treść muszą mieć opisowy tekst alternatywny.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Wstaw obraz rower.jpg z opisem alternatywnym i szerokością 300 pikseli.
< ="img/rower.jpg" ="Rower górski" width="300">
Obraz z podpisem: uzupełnij elementy figure i figcaption.
<>
<img src="img/rzym.jpg" alt="Koloseum">
<>Koloseum w Rzymie</>
</>
Odtwarzacz wideo z przyciskami sterowania i źródłem w formacie MP4.
<video width="400">
< src="film.mp4" type="video/mp4">
</video>
Element img jest pusty: nie ma zawartości ani znacznika zamykającego, a opis powinien być w atrybucie alt. Popraw kod.
Odtwarzacz audio nie ma przycisków sterowania. Dodaj odpowiedni atrybut.
Część A, lekcja 4
Tabele
<table>
<caption>Plan lekcji – poniedziałek</caption>
<thead>
<tr><th scope="col">Godzina</th><th scope="col">Przedmiot</th><th scope="col">Sala</th></tr>
</thead>
<tbody>
<tr><td>8:00</td><td>Bazy danych</td><td>12</td></tr>
<tr><td>8:55</td><td colspan="2">Zajęcia wychowawcze</td></tr>
</tbody>
<tfoot>
<tr><td colspan="3">Zmiany planu na stronie szkoły</td></tr>
</tfoot>
</table>
| Element / atrybut | Znaczenie |
|---|---|
<table>, <tr> | tabela i wiersz |
<th>, <td> | komórka nagłówkowa i zwykła komórka |
colspan | scala komórki w poziomie (w kolumnach) |
rowspan | scala komórki w pionie (w wierszach) |
<thead>, <tbody>, <tfoot> | sekcje nagłówkowa, główna i podsumowania |
<caption> | podpis tabeli |
scope="col|row" | wskazuje, czego dotyczy komórka nagłówkowa (dostępność) |
Tabel używamy do danych tabelarycznych. Układ strony (kolumny, menu) tworzymy w CSS (Flexbox, Grid). Wygląd tabeli (ramki, kolory, border-collapse) ustawiamy w CSS, nie atrybutami HTML.
Jak scalić dwie komórki w jednym wierszu?
Pokaż przykładową odpowiedź
Atrybutem colspan="2" w pierwszej z nich (i usunięciem drugiej komórki).
Po co stosować th z atrybutem scope?
Pokaż przykładową odpowiedź
Aby czytnik ekranu wiedział, że komórka jest nagłówkiem kolumny lub wiersza i mógł ją powiązać z danymi.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Uzupełnij tabelę: wiersz nagłówkowy z komórkami th i wiersz z danymi.
<>
<>
<>Imię</th>
<th>Wiek</th>
</tr>
<tr>
<>Anna</td>
<td>17</td>
</tr>
</table>
Połącz komórki: nagłówek na dwie kolumny i komórkę na dwa wiersze.
<tr><th ="2">Dane</th></tr>
<tr><td ="2">Anna</td><td>17</td></tr>
Komórki nagłówkowe zostały zapisane jako zwykłe komórki. Zamień je na właściwe znaczniki.
Atrybut łączący komórki w poziomie ma literówkę. Popraw go.
Część A, lekcja 5
Formularze HTML i walidacja po stronie przeglądarki
<form action="rejestracja.php" method="post">
<fieldset>
<legend>Dane konta</legend>
<label for="imie">Imię</label>
<input type="text" id="imie" name="imie" required minlength="2" maxlength="40">
<label for="mail">E-mail</label>
<input type="email" id="mail" name="mail" required placeholder="jan@szkola.pl">
<label for="wiek">Wiek</label>
<input type="number" id="wiek" name="wiek" min="16" max="99">
<label for="miasto">Miasto</label>
<select id="miasto" name="miasto">
<option value="">— wybierz —</option>
<option value="waw">Warszawa</option>
<option value="rad">Radom</option>
</select>
<label><input type="checkbox" name="regulamin" required> Akceptuję regulamin</label>
<label for="opis">Krótki opis</label>
<textarea id="opis" name="opis" rows="4" cols="40"></textarea>
<button type="submit">Zarejestruj</button>
<button type="reset">Wyczyść</button>
</fieldset>
</form>
| Pole | Opis |
|---|---|
text, password, email, url, tel, search | pola tekstowe (różne klawiatury i sprawdzanie formatu) |
number, range | liczba, suwak; atrybuty min, max, step |
date, time, datetime-local, color | wybieraki daty, czasu i koloru |
checkbox | pole wyboru – wiele odpowiedzi |
radio | przyciski opcji – jedna odpowiedź w grupie (wspólny name) |
file, hidden | wysyłanie pliku (potrzebne enctype="multipart/form-data"); pole ukryte |
<select>, <textarea> | lista rozwijana, wieloliniowe pole tekstowe |
Metody GET i POST
| Metoda | Jak przesyła dane | Kiedy stosować |
|---|---|---|
GET | w adresie URL (?imie=Jan&wiek=17) | wyszukiwanie, filtrowanie – dane nie są wrażliwe, można zapisać adres |
POST | w treści żądania (niewidoczne w adresie) | logowanie, rejestracja, zmiany danych, wysyłanie plików |
Walidacja HTML5
required– pole wymagane,pattern="[0-9]{2}-[0-9]{3}"– wyrażenie regularne (np. kod pocztowy),min,max,minlength,maxlength– zakresy,type="email"– sprawdza format adresu.
Użytkownik może wyłączyć JavaScript lub wysłać żądanie bez przeglądarki. Dane z formularza zawsze trzeba sprawdzić jeszcze raz po stronie serwera (np. w PHP).
Każde pole powinno mieć <label for="id"> powiązany z id pola. Kliknięcie etykiety aktywuje pole, a czytnik ekranu wie, czego dotyczy.
Czym różni się radio od checkbox?
Pokaż przykładową odpowiedź
Radio w grupie o wspólnym name pozwala wybrać tylko jedną opcję, a checkbox pozwala zaznaczyć dowolną liczbę opcji.
Dlaczego do wysyłania hasła używamy metody POST, a nie GET?
Pokaż przykładową odpowiedź
Metoda GET umieszcza dane w adresie URL, który trafia do historii przeglądarki i logów serwera. POST przesyła dane w treści żądania.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Uzupełnij formularz: adres i metodę wysłania, etykietę powiązaną z polem oraz wymagane pole tekstowe.
< ="dodaj.php" method="post">
< ="imie">Imię:</label>
<input type="" id="imie" name="imie" >
<input type="submit" value="Wyślij">
</form>
Lista rozwijana i przyciski radio: radia jednej grupy mają wspólną nazwę.
< name="kraj">
< value="pl">Polska</option>
<option value="de">Niemcy</option>
</select>
<input type="radio" ="rozmiar" value="s"> S
<input type="radio" ="rozmiar" value="m"> M
Pole nie ma typu odpowiedniego do adresu e-mail ani nazwy, więc dane nie zostaną wysłane. Popraw znacznik (typ email i nazwa mail).
Etykieta nie jest powiązana z polem: wartość atrybutu for musi być taka sama jak id pola. Popraw kod.
Zadanie praktyczne
Strona wizytówka z formularzem kontaktowym
Zadanie
Przygotuj dwustronicowy serwis wizytówkę firmy usługowej (np. serwis komputerowy). Strony mają poprawną strukturę semantyczną i wspólne menu.
Założenia
- Plik
index.html:headerz logo inav,mainz sekcjami „O nas” i „Oferta” (lista punktowana),footer. - W sekcji „Oferta” dodaj tabelę cennika z nagłówkami (
thead,th scope) i jedną scaloną komórką. - Dodaj obraz z poprawnym
alt, a logo wfigurez podpisem. - Plik
kontakt.html: formularz (imię, e-mail, temat jako lista rozwijana, wiadomość, zgoda – checkbox) z etykietami i atrybutamirequired, wysyłany metodą POST. - Obie strony przechodzą walidację w narzędziu W3C Validator bez błędów.
Ocenie podlegać będzie
- poprawna struktura dokumentu i elementy semantyczne,
- tabela i obrazy z atrybutami dostępności,
- formularz: typy pól, etykiety, walidacja HTML5,
- działające odnośniki względne,
- brak błędów w walidatorze.
Wskazówki
- Szkielet dokumentu — Lekcja 1, formularze — Lekcja 5.
- Menu wstaw w
<nav>jako listę<ul>. - Walidator: validator.w3.org (wklej kod lub wgraj plik).
Część B
CSS: wygląd, układ i responsywność
Selektory, kaskada, model pudełkowy, typografia, Flexbox, Grid, media queries oraz przejścia i animacje.
Część B, lekcja 6
Składnia CSS i selektory
CSS (Cascading Style Sheets) opisuje wygląd elementów HTML. Reguła składa się z selektora (do czego) i deklaracji (jakie właściwości i wartości):
selektor {
właściwość: wartość;
inna-właściwość: wartość;
}
h1 { color: navy; font-size: 2rem; }
| Selektor | Przykład | Wybiera |
|---|---|---|
| typu (elementu) | p | wszystkie akapity |
| klasy | .ramka | elementy z class="ramka" (klasy można powtarzać) |
| identyfikatora | #menu | jeden element z id="menu" (id jest unikalne) |
| uniwersalny | * | wszystkie elementy |
| grupowy | h1, h2, h3 | kilka selektorów naraz |
| potomka | nav a | wszystkie a wewnątrz nav (na dowolnej głębokości) |
| dziecka | ul > li | tylko bezpośrednie dzieci |
| sąsiada | h2 + p | akapit bezpośrednio po h2 |
| rodzeństwa | h2 ~ p | wszystkie akapity po h2 w tym samym rodzicu |
| atrybutu | a[target="_blank"], input[type=text] | elementy z danym atrybutem lub wartością |
| złożony | p.uwaga | akapity z klasą uwaga |
Pseudoklasy i pseudoelementy
| Rodzaj | Przykład | Znaczenie |
|---|---|---|
| pseudoklasa | a:hover | element, nad którym jest kursor |
| pseudoklasa | a:visited, input:focus | odwiedzony odnośnik, pole z fokusem |
| pseudoklasa | li:first-child, tr:nth-child(2n) | pierwszy element, co drugi wiersz |
| pseudoelement | p::first-line, p::first-letter | pierwszy wiersz, pierwsza litera |
| pseudoelement | a::after, h2::before | wstawiona treść (content: "→") |
Pseudoklasy zapisujemy z jednym dwukropkiem (:hover), a pseudoelementy z dwoma (::before).
Czym różni się selektor klasy od selektora identyfikatora?
Pokaż przykładową odpowiedź
Klasa (.nazwa) może być użyta na wielu elementach, a identyfikator (#nazwa) powinien wystąpić tylko raz w dokumencie. Identyfikator ma też większą specyficzność.
Co wybiera selektor ul > li?
Pokaż przykładową odpowiedź
Tylko te elementy li, które są bezpośrednimi dziećmi ul.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Napisz reguły CSS: dla nagłówka h1, dla klasy lista i dla elementu o identyfikatorze menu.
{
: navy;
}
lista { margin: 0; }
menu { padding: 10px; }
Selektory złożone: elementy li wewnątrz nav, bezpośrednie dzieci listy oraz stan najechania.
nav { color: red; }
ul li { color: blue; }
a { color: green; }
Podłącz arkusz stylów styl.css do strony.
< ="stylesheet" ="styl.css">
W regule brakuje dwukropka i średnika. Popraw ją.
Selektor klasy musi zaczynać się od kropki, a identyfikatora od znaku #. Popraw selektory.
Część B, lekcja 7
Kaskada, dziedziczenie i specyficzność
Style można podłączyć na trzy sposoby:
| Sposób | Zapis | Uwagi |
|---|---|---|
| zewnętrzny | <link rel="stylesheet" href="styl.css"> w head | najlepszy: jeden plik dla całego serwisu, cache przeglądarki |
| wewnętrzny | <style> ... </style> w head | styl jednej strony |
| lokalny (inline) | <p style="color:red"> | jeden element; trudny w utrzymaniu |
Gdy kilka reguł dotyczy tego samego elementu, o wyniku decyduje kaskada: najpierw ważność (!important), potem specyficzność selektora, a przy równej specyficzności – kolejność (późniejsza reguła wygrywa).
| Selektor | Siła (inline - id - klasy - elementy) |
|---|---|
p | 0-0-0-1 |
.uwaga, [type=text], :hover | 0-0-1-0 |
#menu | 0-1-0-0 |
style="..." (inline) | 1-0-0-0 |
nav ul li a.aktywny | 0-0-1-4 |
Dziedziczenie: niektóre właściwości przechodzą z elementu nadrzędnego na potomne (np. color, font-family, line-height, text-align), a inne nie (np. margin, border, background). Wymusić dziedziczenie można wartością inherit.
!important łamie normalną kaskadę i utrudnia późniejsze zmiany. Lepiej zmienić selektor lub kolejność reguł.
Który kolor otrzyma akapit: p { color: red; } poniżej .opis { color: blue; }, jeśli akapit ma klasę opis?
Pokaż przykładową odpowiedź
Niebieski: selektor klasy ma większą specyficzność niż selektor elementu, niezależnie od kolejności.
Którą właściwość dziedziczy element potomny: color czy border?
Pokaż przykładową odpowiedź
color jest dziedziczone, a border nie.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Ustaw kolor i czcionkę w elemencie body, aby odziedziczyły je elementy wewnątrz.
body {
: #333;
: Arial, sans-serif;
}
Dodaj styl najechania na odnośnik; reguła stanu musi stać po regule podstawowej.
a { color: blue; }
a { color: red; }
W CSS komentarze zapisujemy inaczej niż w innych językach. Popraw zapis komentarza.
Wymuś kolor niezależnie od specyficzności innych reguł.
p { color: red ; }
Część B, lekcja 8
Model pudełkowy i jednostki
Każdy element HTML jest dla CSS prostokątnym pudełkiem. Od środka na zewnątrz tworzą je: content (treść), padding (wypełnienie), border (obramowanie) i margin (margines, odstęp od sąsiadów).
* { box-sizing: border-box; } /* width obejmuje padding i border */
.karta {
width: 300px;
padding: 16px; /* wszystkie strony */
border: 2px solid #1d4ed8;
margin: 12px auto; /* góra/dół 12px, lewo/prawo auto (wyśrodkowanie) */
}
/* skróty: margin: góra prawo dół lewo; margin: pion poziom; */
Domyślnie (content-box) szerokość width dotyczy samej treści, a padding i border się dodają, więc element jest szerszy. Przy box-sizing: border-box width obejmuje treść, padding i border – obliczenia są prostsze.
Wartość display | Zachowanie |
|---|---|
block | zajmuje całą szerokość, zaczyna od nowego wiersza (np. div, p, h1) |
inline | płynie w tekście, ignoruje width/height (np. span, a) |
inline-block | płynie w tekście, ale przyjmuje wymiary |
none | element znika i nie zajmuje miejsca (w przeciwieństwie do visibility:hidden) |
flex, grid | kontener układu (kolejne lekcje) |
Jednostki i kolory
| Jednostka | Znaczenie | Kiedy |
|---|---|---|
px | piksel (jednostka bezwzględna) | ramki, cienie, małe stałe wymiary |
% | procent wymiaru rodzica | szerokości elastyczne |
em | wielkość czcionki elementu (lub rodzica) | odstępy zależne od tekstu |
rem | wielkość czcionki elementu html | czcionki i odstępy skalowane przez użytkownika |
vw, vh | 1% szerokości / wysokości okna | pełnoekranowe sekcje |
Kolor zapisujemy nazwą (navy), szesnastkowo (#1d4ed8, skrót #fff), jako rgb(29, 78, 216), z przezroczystością rgba(29,78,216,.5) lub hsl(224, 76%, 48%).
Pionowe marginesy sąsiednich elementów blokowych zwijają się: odstęp między dwoma akapitami z margin: 20px wynosi 20px, a nie 40px.
Element ma width: 200px; padding: 10px; border: 5px solid i box-sizing: content-box. Jaka jest jego szerokość na stronie?
Pokaż przykładową odpowiedź
200 + 2·10 + 2·5 = 230 px. Przy border-box byłoby 200 px.
Czym różni się rem od em?
Pokaż przykładową odpowiedź
rem odnosi się do wielkości czcionki elementu html (stałe odniesienie), a em do wielkości czcionki bieżącego elementu lub jego rodzica, więc może się kumulować w zagnieżdżeniach.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Ustaw model pudełkowy: margines, wcięcie, ramkę oraz liczenie szerokości razem z ramką.
div {
: 10px;
: 15px;
: 1px solid black;
box-sizing: ;
}
Wyśrodkuj blok o stałej szerokości w poziomie.
#strona {
width: 800px;
margin: 0 ;
}
Wartości liczbowe w CSS wymagają jednostek (poza zerem). Dopisz jednostki px.
Dobierz jednostki: względną do czcionki elementu głównego, procent szerokości rodzica i wysokość okna.
p { font-size: 1.2; }
.kolumna { width: 50; }
.okno { height: 100; }
Część B, lekcja 9
Tekst, tło, czcionki i efekty
body {
font-family: "Segoe UI", Roboto, Arial, sans-serif; /* lista zastępcza */
font-size: 1rem;
line-height: 1.6; /* odstęp między wierszami */
color: #1f2937;
background: #f8fafc url("tlo.png") no-repeat center / cover;
}
h1 { text-align: center; text-transform: uppercase; letter-spacing: .05em; }
a { color: #1d4ed8; text-decoration: none; }
a:hover { text-decoration: underline; }
| Właściwość | Opis |
|---|---|
font-family, font-size, font-weight, font-style | krój, rozmiar, grubość, kursywa |
line-height, letter-spacing, text-indent | interlinia, odstęp liter, wcięcie pierwszego wiersza |
text-align, text-decoration, text-transform | wyrównanie, podkreślenie, wielkość liter |
background-color, background-image, background-repeat, background-size, background-position | tło |
border, border-radius | obramowanie i zaokrąglenie rogów |
box-shadow, text-shadow | cienie: przesunięcie-x przesunięcie-y rozmycie kolor |
opacity | przezroczystość całego elementu (0–1) |
/* własna czcionka */
@font-face {
font-family: "MojaCzcionka";
src: url("fonts/moja.woff2") format("woff2");
font-display: swap;
}
/* z Google Fonts w HTML:
<link href="https://fonts.googleapis.com/css2?family=Roboto&display=swap" rel="stylesheet"> */
body { font-family: "MojaCzcionka", sans-serif; }
- Kroje: szeryfowe (Times – do druku), bezszeryfowe (Arial, Roboto – do ekranu), monospace (Courier – kod).
- Używaj listy zastępczej czcionek, a na końcu rodziny ogólnej (
sans-serif). - Dbaj o kontrast tekstu z tłem (WCAG: min. 4,5:1 dla zwykłego tekstu).
Do czego służy lista nazw czcionek w font-family?
Pokaż przykładową odpowiedź
Przeglądarka używa pierwszej dostępnej czcionki z listy. Dzięki temu strona wygląda poprawnie także wtedy, gdy preferowana czcionka nie jest zainstalowana.
Jak zaokrąglić rogi przycisku i dodać mu cień?
Pokaż przykładową odpowiedź
border-radius: 8px; box-shadow: 0 2px 6px rgba(0,0,0,.25);
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Sformatuj tekst: krój pisma, wyrównanie do środka, brak podkreślenia i interlinia.
p {
font-family: Arial, ;
text-align: ;
text-decoration: ;
line-height: 1.5;
}
Ustaw tło: kolor, obraz z pliku i dopasowanie obrazu do elementu.
div {
background-: #eee;
background-image: ("tlo.jpg");
background-size: ;
}
W regule są dwie niepoprawne nazwy lub wartości: nie ma właściwości font-colour, a wyrównanie middle nie istnieje. Popraw je.
Zaokrąglij rogi i dodaj cień.
div {
: 8px;
: 2px 2px 5px gray;
}
Część B, lekcja 10
Układ strony: Flexbox
Flexbox układa elementy w jednym wymiarze (wiersz lub kolumna). Włączamy go na kontenerze przez display: flex, a jego dzieci stają się elementami elastycznymi.
nav ul {
display: flex;
justify-content: space-between; /* wzdłuż osi głównej */
align-items: center; /* w poprzek */
gap: 16px;
list-style: none;
padding: 0;
}
.kolumny { display: flex; flex-wrap: wrap; gap: 20px; }
.kolumny > .karta { flex: 1 1 250px; } /* rośnie, kurczy się, bazowo 250px */
| Właściwość (kontener) | Działanie |
|---|---|
flex-direction | row (domyślnie) lub column – kierunek osi głównej |
justify-content | rozmieszczenie wzdłuż osi głównej: flex-start, center, space-between, space-around |
align-items | wyrównanie w poprzek osi: stretch, center, flex-start |
flex-wrap | czy elementy mogą przechodzić do następnego wiersza |
gap | odstęp między elementami |
| Właściwość (element) | Działanie |
|---|---|
flex-grow | ile wolnego miejsca element może zająć |
flex-shrink | czy może się kurczyć |
flex-basis | rozmiar bazowy |
flex: 1 | skrót: elementy dzielą miejsce po równo |
align-self, order | indywidualne wyrównanie i kolejność |
Wyśrodkowanie elementu w poziomie i pionie: display: flex; justify-content: center; align-items: center; na kontenerze.
Jak ułożyć trzy kolumny o równej szerokości obok siebie?
Pokaż przykładową odpowiedź
Kontener display: flex, a każda kolumna flex: 1.
Którą właściwością zmienisz układ z poziomego na pionowy?
Pokaż przykładową odpowiedź
flex-direction: column.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Ułóż elementy w rzędzie: kontener flex, odstęp między elementami i wyśrodkowanie w pionie.
nav {
display: ;
justify-content: ;
align-items: ;
}
Elementy mają ustawiać się w kolumnie, zawijać się i mieć odstęp 10 pikseli.
div {
display: flex;
flex-direction: ;
flex-wrap: ;
: 10px;
}
Wartość display nie istnieje, a właściwość justify-items nie służy do ustawiania elementów we flexboksie. Popraw kod, aby elementy były wyśrodkowane poziomo.
Dziecko kontenera flex ma zająć całą wolną przestrzeń.
main { : 1; }
Część B, lekcja 11
Układ strony: Grid i pozycjonowanie
CSS Grid układa elementy w dwóch wymiarach (wiersze i kolumny jednocześnie). Jest idealny do układu całej strony.
.strona {
display: grid;
grid-template-columns: 220px 1fr; /* stała kolumna + elastyczna */
grid-template-areas:
"naglowek naglowek"
"menu tresc"
"stopka stopka";
gap: 16px;
min-height: 100vh;
}
header { grid-area: naglowek; }
nav { grid-area: menu; }
main { grid-area: tresc; }
footer { grid-area: stopka; }
.galeria { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 12px; }
Jednostka fr oznacza ułamek wolnego miejsca. repeat(3, 1fr) tworzy trzy równe kolumny.
Pozycjonowanie
| position | Zachowanie |
|---|---|
static | domyślne, zgodnie z przepływem dokumentu |
relative | przesunięcie względem własnego miejsca (top/left), miejsce zostaje zajęte; punkt odniesienia dla absolute |
absolute | usuwa element z przepływu; pozycja względem najbliższego przodka z position innym niż static |
fixed | przyklejony do okna (np. stały pasek menu) |
sticky | zachowuje się jak relative, a po przewinięciu „przykleja się” |
Kolejność nakładania ustawia z-index (działa na elementach pozycjonowanych). Dawny sposób układu, float, zostaje do opływania obrazów tekstem; czyścimy go clear.
Czym Grid różni się od Flexboxa?
Pokaż przykładową odpowiedź
Flexbox układa elementy w jednym wymiarze (wiersz albo kolumna), a Grid w dwóch jednocześnie (wiersze i kolumny), więc lepiej nadaje się do całego układu strony.
Co oznacza grid-template-columns: 200px 1fr 1fr?
Pokaż przykładową odpowiedź
Trzy kolumny: pierwsza o stałej szerokości 200 px, pozostałe dwie dzielą po równo resztę miejsca.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Utwórz siatkę o trzech równych kolumnach i odstępie 10 pikseli.
.galeria {
display: ;
grid-template-columns: ;
gap: 10px;
}
Pozycjonowanie: rodzic odniesienia i element w prawym górnym rogu.
#ramka { position: ; }
#znaczek {
position: ;
top: 0;
right: 0;
}
Element ma być rozciągnięty na dwie kolumny siatki, a pasek przypięty do dołu okna.
.szeroki { grid-column: ; }
#pasek { position: ; bottom: 0; }
Nazwa właściwości siatki jest zapisana w liczbie pojedynczej, a w deklaracji brakuje średnika. Popraw kod.
Część B, lekcja 12
Responsywność i media queries
Strona responsywna dopasowuje układ do szerokości ekranu (telefon, tablet, komputer). Opiera się na trzech filarach: elastyczny układ (jednostki względne, Flexbox/Grid), elastyczne obrazy i media queries. Warunkiem jest znacznik <meta name="viewport" content="width=device-width, initial-scale=1">.
/* styl bazowy: telefon – jedna kolumna */
.kolumny { display: grid; grid-template-columns: 1fr; gap: 16px; }
img { max-width: 100%; height: auto; } /* obrazy nie wychodzą poza kontener */
/* tablet */
@media (min-width: 600px) {
.kolumny { grid-template-columns: repeat(2, 1fr); }
}
/* komputer */
@media (min-width: 992px) {
.kolumny { grid-template-columns: repeat(3, 1fr); }
nav ul { flex-direction: row; }
}
/* druk i preferencje użytkownika */
@media print { nav, footer { display: none; } }
@media (prefers-color-scheme: dark) { body { background: #111; color: #eee; } }
| Pojęcie | Wyjaśnienie |
|---|---|
| breakpoint (punkt graniczny) | szerokość, przy której zmienia się układ (np. 600 px, 992 px) |
| mobile-first | najpierw styl dla telefonu, potem rozszerzenia przez min-width |
| desktop-first | najpierw styl dla komputera, potem ograniczenia przez max-width |
max-width: 100% dla obrazów | obraz skaluje się w dół do szerokości kontenera |
picture/srcset | różne pliki obrazu dla różnych ekranów i gęstości pikseli |
Sprawdzaj stronę w narzędziach deweloperskich przeglądarki (F12 → tryb urządzenia), na prawdziwych telefonach i w różnych przeglądarkach. Wymiary dotykowych elementów powinny wynosić min. ok. 44×44 px.
Po co jest znacznik meta viewport?
Pokaż przykładową odpowiedź
Informuje przeglądarkę mobilną, że ma użyć szerokości urządzenia i skali 1. Bez niego telefon wyświetla stronę jak na szerokim ekranie i pomniejsza ją, więc media queries nie działają zgodnie z oczekiwaniem.
Czym jest podejście mobile-first?
Pokaż przykładową odpowiedź
Tworzeniem stylów najpierw dla małych ekranów, a następnie dodawaniem reguł dla większych przez zapytania min-width.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Dodaj w nagłówku strony znacznik viewport, aby strona skalowała się na telefonach.
<meta name="" content="width=, initial-scale=1">
Na ekranach o szerokości do 600 pikseli ukryj menu.
(: 600px) {
.menu { display: none; }
}
W regule media brakuje dwukropka w warunku i nawiasu zamykającego. Popraw ją.
Obrazy mają się skalować do szerokości kontenera z zachowaniem proporcji.
img {
max-width: ;
height: ;
}
Część B, lekcja 13
Zmienne CSS, przejścia i animacje
:root {
--kolor-glowny: #1d4ed8;
--odstep: 1rem;
}
.przycisk { background: var(--kolor-glowny); padding: var(--odstep); }
.przycisk {
transition: background .25s ease, transform .25s ease;
}
.przycisk:hover { background: #1e40af; transform: translateY(-2px); }
@keyframes pulsuj {
0% { transform: scale(1); }
50% { transform: scale(1.08); }
100% { transform: scale(1); }
}
.alarm { animation: pulsuj 1.2s ease-in-out infinite; }
@media (prefers-reduced-motion: reduce) {
* { animation: none !important; transition: none !important; }
}
| Właściwość | Opis |
|---|---|
transition | płynna zmiana wartości po zmianie stanu (np. :hover) |
transform | translate, scale, rotate, skew – bez wpływu na układ otoczenia |
@keyframes + animation | animacja złożona z kroków |
Animacje mogą szkodzić osobom wrażliwym (zawroty głowy, epilepsja). Szanuj ustawienie prefers-reduced-motion i nie stosuj migotania szybszego niż 3 razy na sekundę.
Do czego służą zmienne CSS?
Pokaż przykładową odpowiedź
Pozwalają zapisać wartość (kolor, odstęp) w jednym miejscu i używać jej wielokrotnie przez var(--nazwa), więc zmiana motywu wymaga edycji jednej linii.
Czym różni się transition od animation?
Pokaż przykładową odpowiedź
Przejście płynnie łączy dwa stany po ich zmianie (np. po najechaniu), a animacja z @keyframes może mieć wiele kroków i uruchamia się samodzielnie.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Zdefiniuj zmienną CSS w selektorze :root i użyj jej w regule.
{ : #0a5; }
a { color: (--kolor); }
Płynna zmiana tła przy najechaniu oraz powiększenie elementu.
button { : background 0.3s ease; }
button:hover {
background: orange;
transform: (1.1);
}
Zdefiniuj animację zanikania i przypisz ją elementowi.
znikaj {
{ opacity: 1; }
{ opacity: 0; }
}
.komunikat { : znikaj 2s infinite; }
Zmienna CSS jest wywołana niepoprawnie: nazwa zmiennej zaczyna się od dwóch myślników. Popraw odwołanie.
Zadanie praktyczne
Responsywna strona firmowa
Zadanie
Na podstawie strony z zadania A przygotuj zewnętrzny arkusz stylów i wykonaj responsywny projekt wizualny. Strona ma działać na telefonie (320 px), tablecie i komputerze.
Założenia
- Arkusz
styl.csspodłączony elementemlink;box-sizing: border-boxdla wszystkich elementów; zmienne CSS na kolory. - Menu poziome we Flexbox, które na telefonie układa się w kolumnę (media query).
- Sekcja „Oferta” w siatce Grid: 1 kolumna na telefonie, 2 na tablecie, 3 na komputerze.
- Karty ofertowe z
border-radius,box-shadowi efektem:hoverz przejściem. - Obrazy skalujące się (
max-width: 100%), czytelna typografia (line-height), kontrast tekstu min. 4,5:1. - Przetestuj stronę w trybie urządzenia w przeglądarce (F12) i opisz w 2 zdaniach przyjęte punkty graniczne.
Ocenie podlegać będzie
- poprawne selektory i brak powtórzeń,
- układ Flexbox i Grid,
- responsywność (media queries, obrazy),
- estetyka i kontrast,
- czytelność i organizacja pliku CSS.
Wskazówki
- Siatka kart:
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr))daje responsywność bez media query. - Podejście mobile-first: najpierw styl dla telefonu.
- Lekcje 10–12.
Część C
Bootstrap i dobre praktyki
Gotowe komponenty i siatka frameworka Bootstrap oraz walidacja, testowanie i organizacja projektu.
Część C, lekcja 14
Bootstrap: siatka i gotowe komponenty
Bootstrap to najpopularniejszy framework CSS (z częścią JavaScript). Dostarcza gotową siatkę 12-kolumnową, komponenty (menu, przyciski, karty, formularze, okna modalne) i klasy pomocnicze. Podłączamy go z CDN lub z plików lokalnych:
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
<div class="container">
<div class="row">
<div class="col-12 col-md-6 col-lg-4">Kolumna 1</div>
<div class="col-12 col-md-6 col-lg-4">Kolumna 2</div>
<div class="col-12 col-md-12 col-lg-4">Kolumna 3</div>
</div>
</div>
<button class="btn btn-primary">Zapisz</button>
<div class="alert alert-warning">Uwaga!</div>
| Klasa | Znaczenie |
|---|---|
container, container-fluid | kontener o stałej maksymalnej szerokości / na całą szerokość |
row, col-* | wiersz i kolumny; suma kolumn w wierszu to 12 |
col-sm-*, col-md-*, col-lg-* | kolumny od danej szerokości ekranu (≥576, ≥768, ≥992 px) |
btn btn-primary, btn-outline-secondary | przyciski |
navbar, card, table, form-control | menu, karty, tabele, pola formularza |
m-3, p-2, text-center, d-flex, d-none d-md-block | klasy pomocnicze: marginesy, wyrównanie, widoczność |
Bootstrap przyspiesza pracę i zapewnia spójny wygląd i responsywność. Wadą jest podobny wygląd wielu stron i większa waga plików, jeśli korzystasz z niewielkiej części frameworka.
Ile kolumn ma siatka Bootstrap i co oznacza klasa col-md-6?
Pokaż przykładową odpowiedź
Siatka ma 12 kolumn. col-md-6 zajmuje 6 z 12 kolumn (połowę szerokości) od szerokości ekranu md (768 px) w górę; na węższych ekranach kolumna zajmuje całą szerokość.
Jak ukryć element na telefonie, a pokazać na większych ekranach?
Pokaż przykładową odpowiedź
Klasami d-none d-md-block.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Zbuduj układ w siatce Bootstrapa: kontener, wiersz i kolumna zajmująca połowę szerokości na średnich ekranach.
<div class="">
<div class="">
<div class="">Lewa</div>
<div class="col-md-6">Prawa</div>
</div>
</div>
Niebieski przycisk i pasek nawigacji rozwijany od dużych ekranów.
<button class="">Zapisz</button>
<nav class=" navbar-expand-lg"></nav>
Podłącz arkusz Bootstrapa z sieci CDN.
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" ="stylesheet">
Klasy Bootstrapa są przypisane w atrybucie o złej nazwie. Popraw znacznik.
Kolumny muszą być umieszczone w wierszu (row) wewnątrz kontenera. Dodaj brakujący element.
Część C, lekcja 15
Dobre praktyki, walidacja i organizacja plików
- Rozdzielaj strukturę (HTML), wygląd (CSS) i zachowanie (JS) – w osobnych plikach.
- Nazwy plików: małe litery, bez spacji i polskich znaków (
oferta-lato.html), kodowanie UTF-8. - Struktura katalogów:
index.html,css/,js/,img/,fonts/. - Klasy nazywaj według roli (
.karta-oferty), nie wyglądu (.czerwony-duzy). - Stosuj wcięcia i komentarze (
<!-- -->w HTML,/* */w CSS). - Optymalizuj obrazy (właściwy format i rozmiar), minimalizuj liczbę plików i zapytań.
Walidacja i testowanie
| Narzędzie | Co sprawdza |
|---|---|
| W3C Markup Validation Service (validator.w3.org) | poprawność składni HTML |
| W3C CSS Validation Service (jigsaw.w3.org/css-validator) | poprawność składni CSS |
| Narzędzia deweloperskie przeglądarki (F12) | inspekcja DOM i CSS, tryb urządzenia, konsola błędów, wydajność |
| Lighthouse | wydajność, dostępność, SEO, dobre praktyki |
| WAVE, axe | dostępność (WCAG) |
Poprawny kod to taki, który przechodzi walidację i działa w różnych przeglądarkach. Typowe błędy: niezamknięte znaczniki, brak alt, powtórzone id, brak DOCTYPE, nieprawidłowe zagnieżdżenie.
Które narzędzie sprawdza poprawność składni kodu HTML?
Pokaż przykładową odpowiedź
Walidator W3C (W3C Markup Validation Service).
Dlaczego nie nadajemy plikom nazw z polskimi znakami i spacjami?
Pokaż przykładową odpowiedź
Mogą powodować problemy z kodowaniem adresów URL i różnicami między systemami (np. serwery Linux rozróżniają wielkość liter), a spacje w adresach zamieniają się na %20.
Ćwiczenia interaktywne: uzupełnij i popraw kod
Wpisz brakujące fragmenty w polach albo popraw kod w oknie i kliknij „Sprawdź”. Białe znaki, rodzaj cudzysłowu i kolejność atrybutów HTML nie mają znaczenia. Rozwiązane ćwiczenia zapisują się na koncie i liczą się do odznak.
Uzupełnij podstawowe elementy dostępności: opis obrazu, język strony i komentarz.
<html ="pl">
<img src="a.jpg" ="Opis zdjęcia">
koniec sekcji -->
Zamiast przestarzałych znaczników wyglądu użyj akapitu z klasą uwaga (wygląd ustawisz w CSS).
Ścieżka do arkusza stylów wskazuje na dysk komputera autora, więc na innym komputerze nie zadziała. Użyj ścieżki względnej.
Pliki są uporządkowane w folderach; wpisz ścieżki względne do arkusza i obrazu.
<link rel="stylesheet" href="">
<img src="" alt="Logo">
Zadanie praktyczne
Strona w Bootstrapie i walidacja
Zadanie
Przebuduj stronę wizytówkę z zadania A z użyciem frameworka Bootstrap, a następnie zwaliduj kod i oceń jakość.
Założenia
- Podłącz Bootstrap z CDN; użyj
navbarz przyciskiem zwijania na telefonie (część JavaScript Bootstrapa). - Oferta w siatce:
rowz kartamicard,col-12 col-md-6 col-lg-4. - Formularz kontaktowy z klasami
form-control,form-labeli przyciskiembtn btn-primary. - Zwaliduj HTML w W3C Validator i uruchom raport Lighthouse; zapisz uzyskane wyniki wydajności i dostępności.
- Wypisz 3 zmiany, które poprawią wynik Lighthouse.
Ocenie podlegać będzie
- poprawne użycie siatki i komponentów,
- responsywność na 3 szerokościach,
- walidacja kodu,
- wnioski z raportu Lighthouse.
Wskazówki
- Dokumentacja: getbootstrap.com/docs.
- Menu zwijane wymaga skryptu
bootstrap.bundle.min.js. - Lighthouse jest w narzędziach deweloperskich Chrome.