Na rozmowach z HTML najczęściej pada kilkanaście pytań: czym jest semantyczny HTML, czym różni się element blokowy od liniowego, jak działają formularze i etykiety, po co jest atrybutalt, kiedy użyć linku, a kiedy przycisku oraz czym różnią sięasyncidefer. Rekruter nie sprawdza znajomości wszystkich tagów, tylko to, czy rozumiesz, po co jest dana struktura i co się stanie, gdy ją złamiesz. Dobra odpowiedź to jedno zdanie definicji i krótki przykład kodu.
Rozmowa o HTML wydaje się najłatwiejsza, więc część kandydatów traktuje ją po macoszemu, a potem gubi się przy pytaniu o semantykę albo dostępność. Poniżej znajdziesz pytania, które wracają na rozmowach na stanowisko juniora, razem z tym, jak na nie odpowiadać. HTML jest fundamentem całego frontendu, więc zwykle po nim padają pytania z CSS i JavaScriptu. Do tych drugich przygotuj się z artykułu o pytaniach rekrutacyjnych z JavaScript, a do pierwszych z artykułu o pytaniach rekrutacyjnych z CSS.
Zachowanie przykładów z tego artykułu sprawdziliśmy w przeglądarce Chromium: trybu przeglądarki zależnego od doctype, etykiet, przycisków w formularzu, walidacji pól i tego, jak parser naprawia błędnie zagnieżdżone tagi. Wyniki w tekście pochodzą z tych uruchomień.
Jak odpowiadać na pytania rekrutacyjne z HTML?
Najlepiej w trzech krokach: jedno zdanie definicji, krótki przykład (kilka linijek kodu albo sytuacja z projektu) i informacja, kiedy to ma znaczenie w praktyce. Taka odpowiedź zajmuje 30–60 sekund i pokazuje, że rozumiesz mechanizm, a nie wkułeś formułkę. Jeśli czegoś nie wiesz, powiedz, co wiesz, i rozumuj na głos. Rekruterzy oceniają sposób myślenia, a nie tylko wynik.
Pytania są ułożone od podstaw do tematów, które częściej pojawiają się przy ofertach na mid-poziom.
Podstawy HTML
Czym jest HTML i czym jest HTML5?
HTML (HyperText Markup Language) to język znaczników, który opisuje strukturę i znaczenie treści na stronie: nagłówki, akapity, linki, obrazy, formularze. To nie jest język programowania, bo nie ma w nim zmiennych ani pętli. HTML5 to nazwa nowszej generacji standardu, która wprowadziła m.in. elementy semantyczne (<header>, <main>, <article>), wbudowane wideo i audio oraz nowe typy pól formularzy. Dziś mówi się po prostu „HTML”, bo standard jest rozwijany na bieżąco.
Jak wygląda podstawowa struktura dokumentu HTML?
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Tytuł strony</title>
</head>
<body>
<h1>Nagłówek</h1>
</body>
</html>
Każda część ma swoje zadanie:
| Element | Do czego służy |
|---|---|
<!DOCTYPE html> | informuje przeglądarkę, że strona jest w standardzie HTML5 |
<html lang="pl"> | element główny; lang podpowiada czytnikom ekranu i tłumaczom język treści |
<meta charset="UTF-8"> | kodowanie znaków, dzięki któremu polskie litery wyświetlają się poprawnie |
<meta name="viewport"> | dopasowanie szerokości strony na telefonie (podstawa responsywności) |
<title> | tytuł w karcie przeglądarki i w wynikach wyszukiwania |
Co się stanie, jeśli pominę DOCTYPE?
Przeglądarka przełączy się w tryb zgodności wstecznej (quirks mode) i będzie renderować stronę według zasad sprzed standaryzacji, np. inaczej liczyć szerokości elementów. W teście w Chromium document.compatMode zwracało CSS1Compat dla strony z <!DOCTYPE html> i BackCompat bez niej. Dlatego doctype zawsze jest pierwszą linią dokumentu.
Czym różni się element blokowy od liniowego?
Element blokowy zaczyna się od nowej linii i domyślnie zajmuje całą dostępną szerokość (np. <div>, <p>, <h1>, <ul>). Element liniowy (inline) mieści się w linii tekstu i zajmuje tylko tyle miejsca, ile potrzebuje jego zawartość (np. <span>, <a>, <strong>). Elementy liniowe ignorują width i height: w naszym teście <span> z width: 200px miał realną szerokość 7 px, czyli tyle, ile zajmował jego tekst. Gdy potrzebujesz mieć wymiary i zostać w linii, używasz display: inline-block.
Czym różni się id od class?
id identyfikuje jeden element na stronie i musi być unikalny. class oznacza grupę elementów i można go użyć wielokrotnie, a jeden element może mieć kilka klas. Przy duplikacie id przeglądarka się nie sypie, ale getElementById zwraca tylko pierwszy pasujący element (w teście 1 z dwóch <span id="x">), więc druga kopia jest „niewidoczna” dla skryptów.
Czym różni się <div> od <span>?
Oba są elementami bez znaczenia (neutralnymi kontenerami). <div> jest blokowy i służy do grupowania większych fragmentów układu, <span> jest liniowy i służy do oznaczenia kawałka tekstu w linii, np. żeby go pokolorować. Jeśli istnieje element semantyczny pasujący do treści (<nav>, <article>, <strong>), wybierz go zamiast <div> lub <span>.
Semantyka i SEO
Czym jest semantyczny HTML i po co się go stosuje?
Semantyczny HTML (semantic HTML) to używanie elementów zgodnie z ich znaczeniem: nagłówek jako <h1>–<h6>, nawigacja jako <nav>, lista jako <ul>, a nie wszystko jako <div> ze stylem. Daje to trzy korzyści: czytniki ekranu rozumieją strukturę strony, wyszukiwarki lepiej interpretują treść, a kod jest czytelniejszy dla zespołu.
Jakie elementy semantyczne trzeba znać i kiedy użyć <section>, a kiedy <article>?
| Element | Zastosowanie |
|---|---|
<header> | nagłówek strony lub sekcji (logo, tytuł) |
<nav> | główne bloki nawigacji |
<main> | główna treść strony, jeden na stronę |
<article> | samodzielna całość, która ma sens poza kontekstem (wpis, karta produktu) |
<section> | tematyczna część treści, zwykle z własnym nagłówkiem |
<aside> | treść poboczna (ramka, powiązane linki) |
<footer> | stopka strony lub sekcji |
Prosta reguła: jeśli fragment mógłby żyć samodzielnie, np. w czytniku RSS, to <article>. Jeśli tylko porządkuje stronę na tematy, to <section>. Jeśli nie ma ani jednego, ani drugiego sensu i potrzebujesz kontenera pod styl, zostaje <div>.
Jak powinna wyglądać hierarchia nagłówków?
Jeden <h1> na stronie, który opisuje jej temat, a niżej kolejne poziomy bez przeskoków (h2, potem h3, a nie od razu h4). Nagłówków używa się do struktury, a nie do powiększania tekstu: do tego służy CSS. Czytniki ekranu pozwalają użytkownikom nawigować po nagłówkach, więc przeskoki poziomów sprawiają, że strona jest trudna w odbiorze.
Po co jest atrybut alt w obrazku?
Atrybut alt zawiera tekstowy opis obrazu. Pokazuje się, gdy obraz się nie wczyta, czytają go czytniki ekranu, a wyszukiwarki używają go do zrozumienia zawartości obrazu. Dla obrazów dekoracyjnych zostawiasz pusty alt="", żeby czytnik je pominął. Samego atrybutu nie wolno pominąć, bo wtedy czytnik może odczytać nazwę pliku.
<img src="wykres.png" alt="Wykres sprzedaży: wzrost o 20% w drugim kwartale" />
<img src="ozdoba.svg" alt="" />
Formularze
Do czego służy <label> i dlaczego powinien być powiązany z polem?
<label> opisuje pole formularza. Powiązany z polem przez for (z id pola) lub przez zagnieżdżenie, powiększa obszar kliknięcia i jest odczytywany przez czytnik ekranu razem z polem. W teście kliknięcie w <label for="e"> ustawiło fokus na polu o id="e". Sam placeholder nie zastępuje etykiety, bo znika po wpisaniu tekstu.
<label for="email">Adres e-mail</label>
<input id="email" type="email" name="email" required />
Jak działa walidacja formularza w HTML i czy wystarczy?
Przeglądarka sprawdza atrybuty takie jak required, type="email", minlength, pattern i nie pozwala wysłać formularza z błędnymi danymi. W teście checkValidity() zwróciło false dla pustego pola required i dla tekstu zly w polu type="email", a true dla a@b.pl. To jednak tylko wygoda użytkownika. Walidację w HTML da się obejść (np. przez narzędzia deweloperskie), więc dane i tak muszą być sprawdzone na serwerze. Praktyczne podejście do tematu opisujemy w artykule o walidacji formularza w JavaScript.
Czym różni się metoda GET od POST w formularzu?
GET dołącza dane do adresu URL (?q=html) i służy do pobierania lub wyszukiwania, bo wynik można zapisać w zakładce i udostępnić. POST wysyła dane w treści żądania i służy do operacji, które coś zmieniają (rejestracja, zamówienie) oraz do danych, których nie chcemy pokazywać w adresie. Nie oznacza to, że POST jest „bezpieczny”: dane nadal trzeba szyfrować przez HTTPS.
Do czego służy atrybut name w polu formularza?
Wartość name jest kluczem, pod którym dane trafiają do serwera. Pole bez name nie zostanie wysłane razem z formularzem, nawet jeśli ma id i jest wypełnione. id służy do powiązania z <label> i do skryptów, name do wysyłania.
Czym różni się <button> od <input type="submit"> i co robi type="button"?
<button> może zawierać dowolną treść (tekst, ikonę), a <input type="submit"> pokazuje tylko tekst z atrybutu value. Ważniejsze jest zachowanie domyślne: przycisk w formularzu bez atrybutu type jest przyciskiem wysyłającym. W teście przycisk bez type wywołał submit, a z type="button" nie wywołał niczego. Dlatego przycisk, który ma tylko otworzyć okno lub wykonać skrypt, zawsze dostaje type="button".
Jak wybrać odpowiedni typ pola <input>?
Typ pola wpływa na klawiaturę na telefonie, walidację i dostępność: email, tel, number, password, date, url, search. Dobrze dobrany type często zastępuje własny skrypt. Pole „numer telefonu” jako type="tel" pokaże klawiaturę numeryczną, a jako zwykły text nie.
Linki, przyciski i dostępność
Kiedy użyć linku <a>, a kiedy przycisku <button>?
Link prowadzi gdzieś (do innej strony lub fragmentu strony) i ma atrybut href. Przycisk wykonuje akcję na stronie (otwórz menu, wyślij formularz, dodaj do koszyka). Użycie <a href="#"> zamiast przycisku lub <div onclick> zamiast linku to klasyczny błąd: element traci obsługę klawiatury i znaczenie dla czytników ekranu. Jeśli element „wygląda jak przycisk”, ale prowadzi na inną stronę, nadal powinien być linkiem, a wygląd ustawisz w CSS.
Co robi target="_blank" i po co rel="noopener"?
target="_blank" otwiera link w nowej karcie. Dawniej taka strona mogła przez window.opener sterować kartą, z której została otwarta. Dziś nowoczesne przeglądarki domyślnie traktują _blank jak noopener, ale rel="noopener noreferrer" nadal jest częstym nawykiem. Warto dodatkowo uprzedzić użytkownika, że link otworzy nową kartę.
Czym jest dostępność i jak o nią dbać w HTML?
Dostępność (accessibility, a11y) to projektowanie stron tak, żeby mogły z nich korzystać też osoby z niepełnosprawnościami: niewidzące, niesłyszące, używające tylko klawiatury. W HTML zaczyna się od podstaw: semantyczne elementy, alt w obrazkach, etykiety pól, atrybut lang, sensowna kolejność nagłówków i możliwość obsługi strony klawiaturą. Zasada numer jeden dla atrybutów ARIA brzmi: jeśli istnieje natywny element HTML, który robi to samo, użyj go zamiast dodawać role lub aria-* do <div>. Szerzej o tym, jak dostępność wygląda w praktyce i w prawie, mówimy na ścieżce o dostępności.
Do czego służy atrybut tabindex?
tabindex="0" dodaje element do kolejności nawigacji klawiaturą (klawisz Tab), tabindex="-1" pozwala ustawić na nim fokus skryptem, ale nie dodaje go do tej kolejności. Dodatnich wartości (tabindex="3") lepiej unikać, bo psują naturalną kolejność. Elementy, które są natywnie interaktywne (linki, przyciski, pola), nie potrzebują tabindex.
Wydajność i ładowanie
Czym różni się <script async> od <script defer>?
Domyślnie skrypt wstrzymuje parsowanie HTML, dopóki się nie pobierze i nie wykona. Oba atrybuty pobierają skrypt równolegle z parsowaniem, ale różnią się momentem wykonania:
async | defer | |
|---|---|---|
| Pobieranie | równolegle z parsowaniem | równolegle z parsowaniem |
| Wykonanie | od razu po pobraniu (przerywa parsowanie) | po zakończeniu parsowania, przed DOMContentLoaded |
| Kolejność skryptów | nie jest gwarantowana | zachowana |
| Typowe użycie | niezależne skrypty (analityka) | skrypty aplikacji zależne od DOM |
W praktyce defer jest bezpieczniejszym wyborem dla skryptów strony, a async dla narzędzi, które nie zależą od innych skryptów.
Jak wczytywać obrazy wydajnie?
Trzy narzędzia, które warto znać: loading="lazy" odkłada pobranie obrazu do momentu, gdy zbliży się do widocznego obszaru (nie stosuj go dla obrazu widocznego od razu po wejściu na stronę), srcset z sizes pozwalają przeglądarce wybrać plik o odpowiedniej szerokości, a <picture> umożliwia podanie innych źródeł (np. innego kadru lub nowocześniejszego formatu) dla różnych warunków. W każdym obrazku podawaj też width i height, żeby przeglądarka zarezerwowała miejsce i strona nie „skakała” przy ładowaniu.
Po co <meta name="viewport">?
Bez niego telefon renderuje stronę tak, jakby miała szerokość kilkuset pikseli, i pomniejsza ją, żeby zmieściła się na ekranie. Wpis width=device-width, initial-scale=1 mówi, że szerokość strony ma być równa szerokości urządzenia. To podstawa responsywności, a media queries bez niego nie zadziałają tak, jak powinny. Jak je pisać, opisujemy w artykule o media queries w CSS.
Inne pytania, które się powtarzają
Do czego służą atrybuty data-*?
To własne atrybuty, w których możesz zapisać dane powiązane z elementem, np. data-user-id="42". Z poziomu JavaScriptu odczytasz je przez element.dataset: w naszym teście z data-user-id="42" i data-role="admin" powstał obiekt { userId: "42", role: "admin" }. Zwróć uwagę, że nazwa z myślnikiem zamienia się na camelCase. Wartości są zawsze tekstem, więc liczbę trzeba przekonwertować.
Czym są encje HTML i kiedy trzeba ich używać?
Encje to zapis znaków specjalnych, np. < dla <, > dla >, & dla &, dla niełamliwej spacji. Używasz ich wtedy, gdy znak ma być wyświetlony jako tekst, a nie zinterpretowany jako znacznik. To także podstawa ochrony przed wstrzyknięciem kodu (XSS): dane od użytkownika zawsze trzeba traktować jako tekst, a nie jako HTML.
Czym jest <iframe> i jakie są jego ryzyka?
<iframe> osadza inną stronę wewnątrz bieżącej, np. film z YouTube lub mapę. Osadzona strona działa we własnym kontekście, ale może spowalniać ładowanie i sama zbierać dane o użytkownikach. Dla zewnętrznych treści warto ograniczyć uprawnienia atrybutem sandbox i dodać title, żeby czytniki ekranu wiedziały, co zawiera ramka.
Zadania z kodem i mini-test
Jakie zadania z HTML pojawiają się na rozmowach?
Najczęściej to krótkie zadania typu: „zbuduj semantyczną strukturę prostej strony z nagłówkiem, nawigacją, treścią i stopką”, „napisz formularz kontaktowy z poprawnymi etykietami i walidacją” albo „znajdź błędy w tym fragmencie”. Przy takich zadaniach liczy się nie wygląd, tylko poprawny dobór elementów i atrybutów. Dlatego mów na głos, dlaczego wybierasz dany tag.
Co jest nie tak w tym kodzie? Mini-test na rozgrzewkę
<div>
<p>Zapisz się:
<div>
<input placeholder="E-mail" />
<button>Wyślij</button>
</div>
</p>
<img src="logo.png" />
<span id="info">Dziękujemy</span>
<span id="info">Do zobaczenia</span>
</div>
Są tu co najmniej cztery problemy:
<div>wewnątrz<p>. Akapit nie może zawierać elementu blokowego, więc parser zamyka<p>przed<div>. Z<p>a<div>b</div>c</p>powstało w teście<p>a</p><div>b</div>c<p></p>, czyli pusty akapit i tekst „c” poza akapitem.- Brak
<label>. Samo pole zplaceholdernie ma trwałej etykiety, a czytnik ekranu nie wie, czego dotyczy pole. - Przycisk bez
type. W formularzu domyślnie wysyła dane, więc warto jawnie ustawićtype="submit"(albotype="button", jeśli nie ma wysyłać). - Brak
altw obrazku i zduplikowaneid.altjest wymagany, aid="info"użyte dwa razy sprawia, że skrypt zobaczy tylko pierwszy element.
Jak przygotować się do rozmowy z HTML?
- Napisz stronę od zera, bez frameworka. Nagłówek, nawigacja, treść, formularz, stopka: wszystko semantycznie. Porównaj z tym, co zrobiłbyś na
<div>ach. - Przetestuj stronę klawiaturą. Przejdź całą stronę klawiszem Tab i sprawdź, czy kolejność ma sens i czy widać fokus.
- Użyj walidatora i narzędzi deweloperskich. Walidator W3C pokaże błędne zagnieżdżenia, a zakładka dostępności w narzędziach przeglądarki — brakujące etykiety i
alt. - Przećwicz odpowiedzi na głos. Dla każdego pytania z tego artykułu sformułuj w 30 sekund definicję i przykład.
Na czym juniorzy najczęściej tracą punkty?
Nie na trudnych tematach, tylko na trzech drobiazgach, które wychodzą dopiero przy pytaniach uzupełniających:
- Wszystko jako
<div>. Brak semantyki wychodzi od razu przy zadaniu na tablicy. Pokaż, że wiesz, kiedy<nav>,<main>i<button>są lepsze. - Mylenie linku z przyciskiem. Odpowiedź „jeden i drugi można kliknąć” kończy temat. Wyjaśnij, że link prowadzi, a przycisk wykonuje akcję, i jak to wpływa na klawiaturę oraz czytniki ekranu.
- Walidacja tylko w HTML. Powiedz wprost, że to wygoda użytkownika, a nie zabezpieczenie.
Jak brzmi dobra odpowiedź, a jak słaba?
Weźmy pytanie o async i defer:
| Odpowiedź | Dlaczego | |
|---|---|---|
| Słaba | „async i defer sprawiają, że skrypt się szybciej ładuje.” | Brak różnicy między nimi. Pytanie uzupełniające („w jakiej kolejności się wykonają dwa skrypty?”) od razu to pokaże. |
| Dobra | „Oba pobierają skrypt równolegle z parsowaniem HTML. async wykonuje go zaraz po pobraniu, więc kolejność nie jest gwarantowana. defer czeka do końca parsowania i zachowuje kolejność. Dla skryptów aplikacji zwykle używam defer.” | Jest różnica w zachowaniu, konsekwencja i uzasadnienie wyboru. |
Ten sam schemat działa przy każdym pytaniu z tego artykułu: definicja, mechanizm, przykład użycia.
Co zrobić, gdy nie znasz odpowiedzi?
Nie zgaduj i nie milcz. Powiedz, co wiesz na pewno, a potem rozumuj na głos, np.: „Nie pamiętam, czy ten element jest blokowy, ale wiem, że mogę to sprawdzić w narzędziach deweloperskich po jego domyślnym display.” Taka odpowiedź pokazuje, że potrafisz sobie poradzić w pracy, a umiejętność znalezienia odpowiedzi jest w codziennej pracy ważniejsza niż pamięć do szczegółów.
Jeśli dopiero planujesz ścieżkę nauki, HTML opanujesz najszybciej, budując prawdziwe strony razem z CSS i JavaScriptem. W naszym programie robisz to na ścieżce nauki frontendu z mentorem. Ogólny przebieg całego procesu rekrutacji opisujemy w poradniku jak przygotować się do rekrutacji na juniora.


