Struktura witryny – dostępne rodzaje bloków, semantyka
W poprzednich lekcjach z działu HTML nauczyliśmy się tworzyć przeróżne, fundamentalne elementy HTML: nagłówki, akapity, obrazy, cytaty, tabele, listy, formularze… Lecz jak połączyć to wszystko w spójną, zrozumiałą strukturę? W tym właśnie celu powstały znaczniki strukturalne – zarówno klasyczne jak <div>
i <span>
oraz nowsze, wprowadzone w standardzie HTML 5 tzw. tagi semantyczne: <main>
, <header>
, <nav>
, <article>
, <section>
, <aside>
oraz <footer>
. Semantyka to inaczej nauka o znaczeniu, która zajmuje się badaniem relacji między znakami i rzeczywistością. W HTML 5 ten termin oznacza znaczniki, które niosą znaczenie (czyli np. mówią: “to jest nagłówek”, “to jest menu nawigacyjne”, “to jest stopka”).
W starszych wersjach HTML wszystkie pojemniki realizowaliśmy przy pomocy wszechobecnego div
. A zatem przeglądarka nie miała możliwości wiedzieć, który div
to nagłówek, który to artykuł, gdzie jest treść poboczna, a który pojemnik to stopka? Całość była jak jeden wielki karton przeprowadzkowy, do którego wrzucono wiele przeróżnych obiektów! Natomiast obecnie, możemy już tworzyć opisane “etykietami” pudełka, dzięki którym “odpakowanie” zawartości (czyli w praktyce zrozumienie struktury witryny) okaże się łatwiejsze dla przeglądarek, robotów indeksujących i czytników ekranowych.
Co daje nam semantyka?
- Większa czytelność kodu – dla nas, dla innych programistów, czytników ekranowych oraz… dla egzaminatora CKE 🙂 Widzimy od razu jakie jest przeznaczenie danego pojemnika strukturalnego (czy to jest menu nawigacyjne, treść poboczna z reklamą, a może stopka?).
- Lepsze pozycjonowanie (SEO) – roboty Google lepiej rozumieją strukturę strony, co ma pozytywny wpływ na pozycję strony w rezultatach wyszukiwania (zwłaszcza w porównaniu do opublikowania tej samej witryny, lecz wykonanej bez semantyki). Zyskujemy naprawdę dużo w kontekście SEO – warto więc zadbać o semantykę!
- Dobra dostępność, w tym współpraca z czytnikami ekranów – osoby słabowidzące, korzystające z technologii asystujących otrzymują jasny komunikat: “to jest artykuł“, “to jest nawigacja“, “to jest treść główna podstrony“.
- Lepsze debugowanie i stylizowanie w CSS – możemy łatwiej tworzyć selektory w arkuszach stylów – na przykład:
section h2 {...}
albofooter p {...}
.
Przykład kodu bez semantyki (słaba implementacja):
<div id="naglowek">Logo i menu</div> <div id="srodek">Tutaj tekst artykułu</div> <div id="bok">Reklamy i linki</div> <div id="stopka">Kontakt i copyright</div>
To samo, lecz z semantyką (dobre podejście):
<header>Logo i menu</header> <main> <article>Tutaj tekst artykułu</article> <aside>Reklamy i linki</aside> </main> <footer>Kontakt i copyright</footer>
Semantyka to nie fanaberia – to wymóg! Na egzaminie zawodowym INF.03 bardzo często w poleceniu znajdziemy fragment w stylu: “Użyj znaczników semantycznych”, “Stwórz menu główne z użyciem tagów HTML 5” albo moje ulubione (i w sumie dziwnie powiedziane!): “Zbuduj strukturę z użyciem znaczników sekcji”. Tak naprawdę chodzi tutaj o znaczniki semantyczne – do dziś nie wiem czemu CKE używa frazy “znaczników sekcji”. Natomiast – co najważniejsze! – jeśli zignorujemy te wymagania i zamiast semantyki zastosujemy same <div>
, to na pewno stracimy punkty! – mimo, iż wizualnie strona może wyglądać poprawnie.
Podsumujmy zatem:
- Semantyka to nadanie treści odpowiedniego znaczenia, a nie tylko wyglądu w przeglądarce.
- Znaczniki takie jak
<main>
,<article>
,<section>
,<header>
,<nav>
,<aside>
oraz<footer>
pomagają nam tworzyć logiczne i zrozumiałe strony. - Stosując semantyczny HTML pomagamy sobie, przeglądarce, wyszukiwarce i użytkownikom – lepiej dbamy o dostępność strony.
- Na egzaminie INF.03 semantyka to nie opcja – to obowiązek!
A zatem pora najwyższa na opisanie wszystkich znaczników, które spotykamy w strukturze HTML – zróbmy solidną powtórkę! Jeżeli semantyka jest dla Ciebie totalnie nowym albo zwyczajnie trudniejszym tematem, to gorąco polecam także obejrzeć tutorial video: Nowe znaczniki semantyczne w HTML5 – tam zobaczymy zrealizowanie konkretnego projektu witryny od zera, wraz z poprawną semantyką. A my przejdźmy już do przeglądu tagów!
Znacznik <div>
To najbardziej klasyczny znacznik do grupowania elementów. Używamy go, gdy chcemy zebrać kilka innych znaczników w jeden kontener – np. wszystkie pola formularza, całą kolumnę na stronie, albo grupę artykułów. Znacznik <div>
nie niesie sam z siebie żadnej semantyki – nie mówi nic o tym, co zawiera – to tylko “przezroczyste pudełko” do rozmieszczania innych elementów:
<div class="logowanie"> <label> Login: <input type="text" id="login"> </label> <label> Hasło: <input type="password" id="pasdd"> </label> </div>
Tag <div>
definiuje tzw. element blokowy (ang. block-level element), czyli taki, który:
- Rozciąga się na całą szerokość dostępnego miejsca, czyli całego rodzica – np.
<body>
. - Zaczyna się w nowej linii i kończy się w nowej linii – czyli nie może “stać obok” innego bloku – układają się one same z siebie jeden pod drugim.
- W praktyce
<div>
działa trochę jak niewidzialne pudełko, które grupuje inne elementy – teksty, formularze, obrazy, przyciski – i porządkuje ich układ wizualnie na stronie. Jednak w żaden sposób nie informuje przeglądarki, czytnika ekranowego czy robota indeksującego co oznacza zawartość w jego środku.
Znacznik <span>
To odpowiednik div
, ale nie jest elementem blokowym tylko liniowym (ang. inline). Czyli jest to kontener, który służy do zaznaczenia (objęcia) elementu w jednej linii, np. jednego wyrazu, obrazu, liczby, ikony etc. W odróżnieniu od elementu blokowego, element liniowy:
- Nie rozciąga się na całą szerokość, tylko obejmuje dokładnie to, co ma w środku (jest “opakowaniem” dla treści – ang. wrapper).
- Nie wprowadza przerwy ani skoku w układzie strony – elementy liniowe nie układają się blokowo (jeden pod drugim) tylko klasycznie obok siebie (jak tekst).
Przykład zastosowania do szybkiego ostylowania treści:
<p>Promocja: <span style="color: green; font-weight: bold;">-50%</span> tylko dziś!</p>
Natomiast podobnie jak <div>
, tak samo znacznik <span>
nie niesie żadnego znaczenia semantycznego – nie mówi przeglądarce ani algorytmom indeksującym, że coś jest tytułem, cytatem, nazwiskiem, itp. To po prostu neutralny pojemnik, no tyle że w odróżnieniu od bloków zachowuje się inline.
W praktyce, na egzaminie INF.03 pamiętajmy:
- Tag
<span>
często posłuży do stylizowania fragmentów tekstu w linii, - Wstawienie spana nie zmieni układu strony (nie robi “entera”, czyli nie zachowa się blokowo),
- Jest często używany w formularzach, np. przy walidacji danych w skryptach (dodanie kolorowego komunikatu),
- Nie jest semantyczny – więc lepiej używać go tylko tam, gdzie chcemy coś pokolorować lub zmienić styl lokalnie.
Znacznik <main>
Znacznik <main>
informuje przeglądarkę, czytnik ekranowy oraz robota indeksującego iż to, co znajduje się w jego wnętrzu, stanowi najważniejszy obszar dokumentu HTML – czyli tę część, która jest unikalna dla danej podstrony i której nie powtarzamy np. w nagłówku czy stopce (w których często znajdują się informacje nawigacyjne albo kontaktowe). Tag <main>
powinien więc opakowywać “mięso” zawartości – ten content, po który faktycznie wchodzimy w dany serwis – tę realną treść, którą spodziewamy się ujrzeć po kliknięciu na witrynę w rezultatach wyszukiwania Google.
Ważne informacje praktyczne na temat używania tagu <main>
:
- Powinien występować tylko raz na stronie (podobnie jak to było z nagłówkiem
<h1>
), - Nie umieszczajmy w nim nawigacji, logo serwisu, informacji kontaktowych – to ma być unikalna zawartość podstrony, a nie informacje poboczne!
- Zazwyczaj znajduje się pod nagłówkiem i przed stopką – to “środek” witryny.
- Często stosowaną kombinacją bywa
<main>
i od razu w środku niego<article>
– w końcu często to artykuł stanowi główną treść podstrony.
Zobaczmy przykładowe umiejscowienie tego tagu – jeden raz, pod częścią nagłówkową, a ponad stopką:
<body> <header> ... Logo, nawigacja ... </header> <main> <article> <header> ... Nagłówek artykułu ... </header> <p> ... Unikalna treść artykułu ... </p> <footer> ... Stopka wpisu i np. sekcja komentarzy ... </footer> </article> </main> <footer> ... Informacje kontaktowe ... </footer> </body>
Reasumując: <main>
to główna treść strony – coś, co jest unikalne i najważniejsze. Używamy go tylko raz na stronie! Nie powinien zawierać rzeczy pobocznych i występujących na każdej podstronie (menu, informacje kontaktowe ze stopki etc.). Znakomicie współgra z innymi znacznikami semantycznymi, zwłaszcza z <article>
. Na egzaminie INF.03 jego użycie to dobra praktyka i często obowiązek!
Znacznik <header>
To nagłówek danej sekcji podstrony albo też całej witryny. Co ważne – możemy go stosować wielokrotnie – zarówno w głównym layoucie, jak i np. w artykułach, sekcjach, a nawet w aside’ach (kontenerach z treścią poboczną, w tej lekcji także je wkrótce omówimy). Nagłówek często może zawierać:
-
nagłówki albo krótki opis wstępny (ang. lead) artykułu,
-
logo, menu nawigacyjne główne lub poboczne – w dodatkowym tagu
<nav>
Zobaczmy umiejscowienie przykładowych nagłówków:
<body> <header> ... Logo, menu główne w <nav> ... </header> <main> <article> <header> ... Tytuł <h1>, autor, data publikacji oraz lead artykułu ... </header> <p> ... Unikalna treść artykułu ... </p> <footer> ... Stopka wpisu i np. sekcja komentarzy ... </footer> </article> </main> <footer> ... Informacje kontaktowe ... </footer> </body>
Pierwszy nagłówek <header>
jako znajdujący się wewnątrz <body>
zostanie zinterpretowany jako część nagłówkowa dla całej strony, zaś drugi <header>
– znajdujący się w <article>
zawierać będzie metadane – tytuł, data publikacji, autor tekstu, akapit wstępny (lead) artykułu – pełni rolę nagłówka lokalnego, wprowadzającego do konkretnego wpisu.
Czego raczej nie umieszczać w <header>
? Zaleca się nie umieszczać w nim stopki, reklam ani pobocznych treści. W końcu nagłówek powinien zawierać elementy wprowadzające do treści, nie treść właściwą czy końcową (podsumowującą).
Znacznik <nav>
Używamy go do otoczenia całego bloku linków prowadzących do innych sekcji strony lub zupełnie innych podstron – jest to więc kontener przeznaczony na menu nawigacyjne. Obecność tego tagu ułatwia organizację nawigacji i pozwala przeglądarce zrozumieć, że w tym kontenerze chodzi o wypisanie opcji “podlinkowanych”:
<nav> <ul> <li><a href="index.html">Start</a></li> <li><a href="blog.html">Blog</a></li> </ul> </nav>
Znacznik ten nie zmienia wyglądu strony (nie dodaje stylu), ale ma ogromne znaczenie semantyczne. Dzięki niemu przeglądarka, roboty indeksujące oraz czytniki ekranów wiedzą, że dany fragment strony to menu – miejsce do zmapowania możliwości “poruszania się” po witrynie. Oczywiście znacznik <ul>
oznacza listę nieuporządkowaną, a <li>
– poszczególne elementy (itemy) tej listy – a są nimi linki <a>
. Współcześnie menu realizujemy zawsze jako listy!
Czy <nav>
musi być tylko jeden na podstronę? Absolutnie nie! Możemy wstawić kilka znaczników <nav>
na stronie. Na przykład jeden globalny (na górze), a drugi lokalny – np. wewnątrz artykułu lub w bocznej kolumnie, zawierający odnośniki tylko do podsekcji danego artykułu lub kategorii tematycznej.
Gdzie można umieścić <nav>
? Podajmy kilka przykładów:
- Bezpośrednio w
<body>
– jeśli chcemy stworzyć samodzielne menu w postaci np. belki nawigacyjnej. - Wewnątrz
<header>
– jako część nagłówkowa – zależnie od tego, gdzie znajduje się nagłówek – np. nagłówek artykułu. - Wewnątrz
<aside>
– jako lokalna nawigacja np. po działach bloga albo wewnątrz jednej z kategorii tematycznych.
W praktyce wszystko zależy od naszych intencji, natomiast przestrzegajmy dwóch prostych zasad: opcje nawigacyjne zawsze zamykajmy w <nav>
, a ponadto realizujmy poszczególne linki jako itemy listy nieuporządkowanej (w razie potrzeby stylizując ją odpowiednio, usuwając punktor i układając elementy obok siebie – w linii).
Znacznik <article>
Ten znacznik służy w HTML 5 do oznaczania samodzielnych, niezależnych bloków treści, które mogą funkcjonować autonomicznie – czyli zarówno w kontekście naszej strony, ale i poza nią (po udostępnieniu, skopiowaniu czy konwersji do PDF). Jak to rozumieć w praktyce? Jeśli stworzymy wpis na blogu, artykuł w serwisie informacyjnym, komentarz użytkownika, recenzję produktu, wiadomość czy post – to każda taka jednostka treści powinna zostać opakowana właśnie w znacznik <article>
, bo jest autonomiczną “jednostką” treści.
Blok <article>
zawiera zwykle metadane: własny nagłówek, datę publikacji, autora treści, a często też przyciski udostępniania w social-mediach oraz stopkę z komentarzami. Rozważmy strukturę przykładowego bloga:
<main> <article> <header> <h1> ... Tytuł wpisu ... </h1> <p> ... Metadane - data, autor, kategoria wpisu ... </p> </header> <section> ... Kilka sekcji artykułu ... </section> <section> ... Kilka sekcji artykułu ... </section> <section> <header> <h2> ... Sekcja komentarzy ... </h2> </header> <article> <header> ... Metadane komentarza - kto i kiedy go zapostował ... </header> <p> ... Treść komentarza ... </p> </article> <article> ... Kolejny komentarz ... </article> </section> </article> </main>
Znacznik <article>
umieszczony bezpośrednio w <main>
posłużył do oznaczenia treści dużego artykułu, zbudowanego z kilku sekcji (rozdziałów). A ponadto, także każdy komentarz użytkownika jest samodzielną “jednostką” zawartości i jako autonomiczna treść (bo inny jest autor, data, kontekst, styl wypowiedzi) także każdy komentarz to <article>
(lokalnie w sekcji komentarzy naszego “dużego” wpisu).
Zapamiętajmy, iż <article>
jest zatem – można powiedzieć: semantycznym odpowiednikiem znacznika <main>
– niesie konkretne znaczenie! Przeglądarka, czytnik ekranu czy robot indeksujący Google, wiedzą, że zawartość znacznika <article>
to treść, która może być niezależna, autonomiczna i zrozumiała sama w sobie – stanowi pewną całość (“jednostkę”) treści.
Znacznik <section>
Służy do oznaczania logicznie wydzielonych sekcji treści w dokumencie. Jest to więc coś w rodzaju rozdziału w książce czy fragmentu artykułu w gazecie. Jest to wydzielona część mająca swoją tematykę – często zawierać będzie własny nagłówek, a czasem także dodatkowe podsekcje lub wprowadzenie (ang. lead).
Używajmy <section>
wszędzie tam, gdy chcemy uporządkować zawartość w spójne, sensowne “bloki tematyczne”. Co ważne – taki znacznik również niesie znaczenie semantyczne: przeglądarka, czytniki ekranów i roboty indeksujące Google wiedzą, że dana sekcja strony to rozdział/blok/segment mający konkretny temat lub spełniający zadaną funkcję. Zobaczmy przykład:
<article> <header> <h1>Misja firmy WebTech</h1> <p> ... </p> </header> <section> <h2>Zespół programistów</h2> <p> ... </p> </section> <section> <h2>Technologie</h2> <p> ... </p> </section> <section> <h2>Nasze realizacje</h2> <p> ... </p> </section> <footer> <h2>Kontakt z nami</h2> <p> ... </p> </footer> </article>
Tag <article>
otacza cały autonomiczny tekst o firmie – to ewidentnie “samodzielna jednostka treści” podzielona na rozdziały. Każda sekcja odpowiada za inny aspekt informacji (misja, zespół, technologie, porfolio…). Dzięki takiej strukturze, kod jest czytelny, semantyczny i egzaminacyjnie poprawny!
Częste pytanie jakie pojawia nam się teraz w głowach to: Jak zatem odróżnić treść w <section>
od zawartości <article>
? Odpowiedź jest prosta – artykuł to coś, co może funkcjonować samodzielnie poza stroną – np. wpis blogowy, recenzja produktu czy wiadomość. Sekcja natomiast to zawsze część większej całości, czyli np. działy strony głównej albo artykułu.
Na egzaminie INF.03 użycie znacznika <section>
może być wymagane, jeśli w treści arkusza pojawi się sformułowanie “wydziel sekcję strony“, “stwórz fragment zawierający…” lub “użyj znaczników sekcji“.
Znacznik <aside>
To po prostu wszelka zawartość poboczna – elementy w <aside>
to często reklamy, źródła w postaci dodatkowych cytatów czy linków, przypisy albo ciekawostki tematyczne. Najczęściej <aside>
jest bocznym panelem (szpaltą, kolumną, blokiem), ale jeśli treści wewnątrz dotyczą stricte artykułu (przypisy, cytaty, linki źródłowe) to <aside>
może być umieszczony nawet wewnątrz <article>
– wszystko zależy od naszych intencji.
Rozważmy konkretny przykład – podstrona zawiera artykuł o języku JavaScript i tag <article>
zawiera główną treść. Natomiast w <aside>
znalazła się treść dodatkowa: link do tutoriala video, cytat z oficjalnej dokumentacji oraz reklamę książki o JS:
<article> <header> <h1> ... Tytuł lekcji na temat JavaScript ... </h1> </header> <section>... Sekcja artykułu ...</section> <section>... Sekcja artykułu ...</section> <section>... Sekcja artykułu ...</section> <aside> <h2>... Dodatkowe materiały ... </h2> <a href="#"> ... Tutorial video ... </a> <blockquote> ... Dodatkowe cytaty z dokumentacji ... </blockquote> <a href="#"> <img src="#" alt=""> ... Baner z reklamą książki o JS ... </a> </aside> <footer> ... Stopka artykułu... </footer> </article>
Przeglądarka i czytniki ekranów rozpoznają <aside>
jako mniej istotną część strony, co pomaga w nawigacji i tworzeniu dostępnych treści oraz ma ogromne znaczenie w kontekście SEO.
Znacznik <footer>
To stopka całej strony albo tylko np. sekcji – zwykle zawiera informacje kontaktowe, linki do regulaminu, dane firmy etc. Tak samo jak <header>
, może występować wielokrotnie – np. na końcu artykułu, sekcji komentarzy wpisu albo też całej strony:
<footer> <p>2025 © Wszelkie prawa zastrzeżone. Zdaj informatyka - kursy online z kwalifikacji INF.02 i INF.03 ...</p> </footer>
Podsumowanie – co warto zapamiętać?
- Znaczniki semantyczne w HTML5 informują o znaczeniu zawartości bloku – przeglądarka oraz czytniki ekranowe wiedzą, co zawiera dana część strony (np. nagłówek, artykuł, stopka) – jest to taka logiczna “etykieta” kontenera.
- Stosowanie
<div>
(zachowanie blokowe) oraz<span>
(element inline) nie przekazuje informacji o strukturze dokumentu – to tylko przezroczyste kontenery bez semantyki. - W HTML5 mamy do dyspozycji znaczniki semantyczne:
<main>
,<header>
,<nav>
,<section>
,<article>
,<aside>
oraz<footer>
. - Użycie semantycznych znaczników poprawia:
- czytelność kodu dla programistów (i egzaminatora…),
- dostępność dla osób z niepełnosprawnościami,
- współpracę z robotami indeksującymi Google (lepsze SEO),
- łatwość debugowania i tworzenia reguł CSS.
<main>
zawiera główną treść strony i występuje tylko raz.<header>
definiuje nagłówek strony lub sekcji – może zawierać np. tytuł, autora, menu.<nav>
służy do umieszczania menu nawigacyjnego – z reguły jako lista linków.<article>
otacza autonomiczną jednostkę treści – np. wpis blogowy, komentarz, recenzję.<section>
służy do podziału artykułu lub strony na logiczne sekcje tematyczne.<aside>
zawiera treści poboczne – np. reklamy, przypisy, cytaty, linki powiązane.<footer>
to stopka – zawiera informacje kontaktowe, autorów, prawa autorskie, linki.- Semantyka w HTML 5 to obowiązkowy element profesjonalnego kodowania! Uczmy się jej od początku i stosujmy z pietyzmem w każdym nowym projekcie!
W zadaniach egzaminacyjnych INF.03 bardzo często mamy za zadanie utworzyć stronę z wyraźnie określoną semantycznie strukturą. Jeśli zamiast znaczników semantycznych użyjemy divów i spanów, to mimo że strona będzie działać i nawet dobrze wyglądać wizualnie, to nie spełni wymagań zadania i stracimy sporo punktów!