Jak zbudować stronę z arkusza egzaminacyjnego
W każdym arkuszu INF.03 jest część „Witryna internetowa”: opis bloków strony i ich zawartości, np. „w banerze nagłówek pierwszego stopnia o treści…”, „lista numerowana z pozycjami…”, „obraz ryba.jpg z tekstem alternatywnym…”, „formularz z polem numerycznym i przyciskiem…”. Ten kurs uczy zamieniać takie zdania na znaczniki HTML.
<!-- wymaganie: „w banerze nagłówek pierwszego stopnia o treści Portal dla wędkarzy” --> <header> <h1>Portal dla wędkarzy</h1> </header>
Jak korzystać z kursu
- Lekcje idą po kolei: podstawy, tekst, odnośniki i obrazy, listy i tabele, układ strony, formularze, multimedia, a na końcu cała strona jak na egzaminie.
- Prawie każda lekcja ma ćwiczenie. Piszesz HTML, podgląd odświeża się w trakcie pisania, a „Sprawdź” bada zbudowaną stronę: czy są właściwe znaczniki, atrybuty i treść. Pod zadaniem możesz rozwinąć listę potrzebnych znaczników.
- Pod lekcjami są pytania „Sprawdź się”. Najpierw odpowiedz sam, dopiero potem rozwiń przykładową odpowiedź.
- Co kilka lekcji czeka zadanie praktyczne (Z1–Z7). Robisz je w edytorze na swoim komputerze i krok po kroku budujesz jedną witrynę: stronę klubu turystycznego „Szlak”. Po skończeniu oznacz zadanie jako zrobione.
- W podglądzie obrazy zastępują plansze z nazwą pliku, a odnośniki i formularze nie przenoszą na inną stronę, tylko pokazują na dole, dokąd by prowadziły i jakie dane by wysłały.
- Wygląd strony (kolory, czcionki, ramki) to CSS: kurs „CSS od podstaw”. Ustawianie bloków obok siebie: kurs „Układ strony: float i flex”.
- Postęp i twoje szkice zapisują się w tej przeglądarce.
Czym jest HTML i gdzie go pisać
HTML (HyperText Markup Language) to język, w którym zapisuje się strony internetowe. HyperText to tekst z odnośnikami do innych dokumentów, a Markup Language to język znaczników, czyli sposób oznaczania fragmentów treści. HTML nie jest językiem programowania: nie ma zmiennych, warunków ani pętli. Opisuje tylko strukturę: mówi przeglądarce, że ten fragment jest nagłówkiem, ten akapitem, a ten odnośnikiem.
Przeglądarka nie wyświetla znaczników. Odczytuje je, żeby zdecydować, jak pokazać treść.
Trzy warstwy strony
| Technologia | Za co odpowiada | Na egzaminie |
|---|---|---|
| HTML | treść i jej znaczenie | plik strony, np. index.html |
| CSS | wygląd: kolory, czcionki, układ | arkusz, np. styl.css |
| JavaScript | zachowanie: reakcje na kliknięcia, obliczenia | skrypt w stronie albo w pliku .js |
Tim Berners-Lee wymyślił WWW w 1989 roku. Po wersjach HTML 2, 3.2, 4.01 i XHTML w 2014 roku standardem został HTML5. Dziś HTML rozwija się jako „żywy standard” (HTML Living Standard), poprawiany na bieżąco przez organizację WHATWG, więc „HTML6” nie będzie.
Edytor i pierwsza strona
Wystarczy dowolny edytor tekstu. Wygodniej pisze się w edytorze dla programistów, np. Visual Studio Code albo Notepad++: kolorują składnię i podpowiadają znaczniki. Edytorów „wizualnych”, w których się klika zamiast pisać, unikaj: na egzaminie liczy się kod, który rozumiesz.
- Utwórz nowy plik i wpisz kod strony.
- Zapisz go z rozszerzeniem
.html(np.index.html) i kodowaniem UTF-8..htmdziała tak samo, ale przyjęło się.html. - Otwórz plik w przeglądarce dwuklikiem albo przeciągając go na okno.
- Po każdej zmianie zapisz plik (
Ctrl+S) i odśwież kartę (F5).
index.html.txt i przeglądarka pokaże go jako zwykły tekst razem ze znacznikami.Zaglądanie do kodu strony
Ctrl+U: źródło strony, czyli dokładnie ten tekst, który jest w pliku.F12albo prawy przycisk myszy → „Zbadaj”: narzędzia deweloperskie. Zakładka Elementy pokazuje drzewo, które przeglądarka zbudowała z kodu, już po poprawieniu błędów. Możesz tu na próbę zmieniać tekst i style; zmiany znikną po odświeżeniu.
Dlaczego na stronie nie widać napisów <h1> i <p>, choć są w kodzie?
Znaczniki są instrukcjami dla przeglądarki, a nie treścią. Przeglądarka odczytuje je, żeby wiedzieć, jak wyświetlić tekst, a same znaczniki pomija.
Kolega zapisał stronę w Notatniku, a po otwarciu widzi cały kod razem ze znacznikami. Na pasku adresu jest strona.html.txt. Co się stało?
Notatnik dopisał rozszerzenie .txt, bo w oknie zapisu był wybrany typ „Dokumenty tekstowe”. Trzeba zapisać plik ponownie z typem „Wszystkie pliki” jako strona.html albo zmienić nazwę pliku przy włączonym pokazywaniu rozszerzeń.
Czym różni się to, co widać po Ctrl+U, od zakładki Elementy w narzędziach deweloperskich?
Ctrl+U pokazuje kod dokładnie tak, jak jest zapisany w pliku. Elementy pokazują drzewo zbudowane przez przeglądarkę, po automatycznym poprawieniu błędów (np. dopisaniu brakujących znaczników) i po zmianach zrobionych przez skrypty.
Struktura dokumentu HTML
Treść otaczają znaczniki: otwierający <p> i zamykający </p>. Razem z treścią tworzą element. Każdy dokument HTML5 ma ten sam szkielet; warto umieć napisać go z pamięci:
<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Schronisko Łapa</title> <link rel="stylesheet" href="styl.css"> </head> <body> <h1>Schronisko Łapa</h1> <p>Adoptuj psa albo kota.</p> </body> </html>
| Element | Po co |
|---|---|
<!DOCTYPE html> | pierwsza linia; mówi przeglądarce, że to HTML5. Nie jest znacznikiem. |
<html lang="pl"> | korzeń dokumentu; lang to język treści, z którego korzystają czytniki ekranu, tłumacze i wyszukiwarki |
<head> | metadane, czyli dane o stronie; nic z tej części nie widać w oknie |
<body> | wszystko, co widać na stronie |
Co może być w head
| Element | Do czego służy |
|---|---|
<title> | tytuł na karcie przeglądarki, w zakładkach i w wynikach wyszukiwania; wymagany |
<meta charset="utf-8"> | kodowanie znaków; bez niego polskie litery mogą zamienić się w „krzaczki” |
<meta name="viewport" …> | poprawne skalowanie na telefonach (lekcja „Strona responsywna”) |
<meta name="description" content="…"> | krótki opis strony, często pokazywany przez wyszukiwarki pod tytułem |
<meta name="author">, <meta name="keywords"> | autor i słowa kluczowe (słowa kluczowe wyszukiwarki dziś ignorują) |
<meta http-equiv="refresh" content="30"> | odświeżanie strony co 30 sekund |
<link rel="stylesheet" href="styl.css"> | arkusz stylów; na egzaminie zawsze |
<link rel="icon" href="img/favicon.png"> | favicon: ikonka na karcie, zwykle 32 × 32 px (PNG, ICO, SVG); po podmianie pliku odśwież Ctrl+F5 |
<style>, <script> | CSS i JavaScript zapisane wprost w dokumencie |
<base href="…"> | adres bazowy dla wszystkich ścieżek względnych; zmienia działanie każdego odnośnika, więc ostrożnie |
Drzewo dokumentu
Elementy są zagnieżdżone: jeden leży w drugim. Przeglądarka buduje z nich drzewo, w którym head i body są dziećmi html.
index.html, wedkowanie.html), zapisz go w UTF-8 i otwórz w przeglądarce. Jeśli polskie znaki wyglądają jak „Ä…”, brakuje meta charset albo edytor zapisał plik w innym kodowaniu.Po co pisać <title>, skoro jego treści nie widać na samej stronie? Podaj trzy miejsca, w których się pojawia.
Na karcie przeglądarki, jako domyślna nazwa zakładki (ulubionych) i jako klikalny nagłówek w wynikach wyszukiwania. Bez niego karta pokazuje samą nazwę pliku.
Napisz element, który doda favicon z pliku ikona.svg leżącego w folderze img.
<link rel="icon" type="image/svg+xml" href="img/ikona.svg"> w sekcji head.
Elementy i atrybuty
Element to wszystko od znacznika otwierającego do zamykającego, razem z treścią. Elementy można zagnieżdżać, a obowiązuje zasada pudełek: element otwarty jako ostatni zamyka się jako pierwszy. <p><strong>…</strong></p> jest dobrze, <p><strong>…</p></strong> źle.
- Elementy puste nie mają treści ani znacznika zamykającego:
br,hr,img,input,meta,link. Zapis z ukośnikiem<br />też jest poprawny; wymaga go dopiero XHTML. - Nie pomijaj znaczników zamykających. Przeglądarka często „dopisze” brakujące
</p>, ale w złożonym kodzie efekt bywa nieprzewidywalny, a walidator zgłosi błąd. - Wielkość liter w nazwach elementów nie ma znaczenia (
<P>=<p>), ale standardem jest zapis małymi literami.
Atrybuty
Atrybuty przekazują dodatkowe informacje o elemencie. Zapisuje się je w znaczniku otwierającym jako nazwa="wartość", oddzielone spacjami.
| Atrybut | Gdzie | Znaczenie |
|---|---|---|
href | a, link | adres, do którego prowadzi odnośnik |
src | img, script, iframe | ścieżka do pliku |
alt | img | tekst zastępczy obrazu |
width, height | img, iframe, video | wymiary w pikselach, bez „px” |
id, class | każdy | identyfikator i klasa |
style | każdy | styl CSS jednego elementu |
title | każdy | dymek po najechaniu kursorem |
lang | każdy | język treści |
hidden | każdy | ukrywa element |
Atrybuty pasujące do każdego elementu (id, class, style, title, lang, hidden) to atrybuty globalne. Pozostałe mają sens tylko przy konkretnych elementach: src przy akapicie nic nie da.
- Cudzysłowy: wartość ze spacją bez cudzysłowu się rozpada. W
<a href=moja strona.html>adresem będzie tylkomoja. Gdy wartość zawiera cudzysłów podwójny, otocz ją pojedynczymi:title='Nazywają go "Wilk"'. - Atrybuty logiczne działają samą obecnością:
disabled,required,checked,hidden.disabled="false"nadal wyłącza pole.
Które z tych elementów są puste: p, br, img, a, hr, h1, input?
br, img, hr i input. Pozostałe mają treść, więc wymagają znacznika zamykającego.
Znajdź błąd: <p>Zbiórka <strong>o 6:00</p></strong>
Elementy są zamknięte w złej kolejności. strong otwarto jako drugi, więc musi zamknąć się jako pierwszy: <p>Zbiórka <strong>o 6:00</strong></p>.
Co jest nie tak z zapisem <a href=galeria zdjec.html>Galeria</a>?
Wartość ze spacją nie jest w cudzysłowie: adresem będzie tylko galeria, a zdjec.html stanie się osobnym, nieznanym atrybutem. Poprawnie: cudzysłów, a najlepiej też nazwa bez spacji, np. href="galeria-zdjec.html".
Pole formularza ma atrybut disabled="false". Czy da się w nim pisać?
Nie. disabled to atrybut logiczny: liczy się sama obecność, nie wartość. Żeby pole było aktywne, trzeba usunąć atrybut.
Wizytówka klubu
Przygotuj folder projektu i pierwszą stronę klubu turystycznego „Szlak”. Na tym projekcie zbudujesz wszystkie kolejne zadania praktyczne. Pracujesz w edytorze na swoim komputerze.
Założenia
- Folder
szlak, w nim plikindex.htmli podfolderimgz dowolną kwadratową ikonkąfavicon.png. - Poprawny szkielet HTML5: język polski, kodowanie UTF-8, znacznik viewport.
- Tytuł karty „Klub turystyczny Szlak”; na karcie widać favicon.
- W
headopis strony: „Klub turystyczny z Płocka: wyjazdy, zapisy i galeria zdjęć.” - W treści nagłówek pierwszego stopnia „Klub turystyczny Szlak” i akapit z opisem klubu (2–3 zdania z polskimi znakami).
- Po najechaniu kursorem na akapit z opisem pojawia się dymek „Działamy od 2015 roku”.
- Pod opisem pozioma linia, a pod nią akapit z adresem w dwóch wierszach: „ul. Tumska 1” i „09-400 Płock”.
- Na końcu odnośnik „Polskie Towarzystwo Turystyczno-Krajoznawcze” do
https://www.pttk.pl. - Nazwy elementów i atrybutów małymi literami, wartości atrybutów w cudzysłowach.
Ocenie podlega
- strona otwiera się poprawnie, polskie znaki wyświetlają się bez błędów,
- tytuł i favicon są widoczne na karcie,
- dymek działa,
- adres jest w dwóch wierszach jednego akapitu,
- wszystkie elementy są poprawnie zagnieżdżone i zamknięte.
F12) drzewo elementów swojej strony i porównaj je z tym, co widać po Ctrl+U.Wskazówki
- Szkielet, head i favicon: lekcja „Struktura dokumentu”.
- Linia pozioma, złamanie wiersza, dymek i adres odnośnika: lekcja „Elementy i atrybuty”.
- Jeśli favicon się nie pokazuje, sprawdź ścieżkę w
hrefi odśwież stronę skrótemCtrl+F5.
Nagłówki i akapity
Nagłówki mają sześć stopni, od h1 (najważniejszy) do h6. Razem tworzą konspekt strony, jak spis treści w książce. Stopień oznacza ważność, nie rozmiar; rozmiar ustawia się w CSS. Arkusz pisze „nagłówek pierwszego stopnia”, „nagłówek trzeciego stopnia” i to od razu mówi, który znacznik wybrać.
- Na stronie powinien być jeden
h1: główny temat strony. - Nie przeskakuj stopni: po
h2idzieh3, nieh5. - Nie używaj nagłówka tylko po to, żeby pogrubić albo powiększyć tekst. Za duży nagłówek zmniejszasz stylem, a nie zamieniasz
h2nah4.
Akapity i białe znaki
p to akapit: zaczyna się w nowej linii, a przeglądarka dodaje odstęp nad nim i pod nim. Przeglądarka zwija białe znaki: kilka spacji i enterów w kodzie zamienia na jedną spację. Wyjątkiem jest pre (tekst sformatowany), który zachowuje spacje i podziały wierszy i pisze czcionką o stałej szerokości.
| Znacznik | Co robi |
|---|---|
<p> … </p> | akapit |
<br> | złamanie wiersza w tym samym akapicie; tam, gdzie podział należy do treści: adres, wiersz |
<hr> | tematyczna zmiana w treści, domyślnie linia pozioma |
<pre> … </pre> | tekst wyświetlany dokładnie tak, jak w kodzie |
<!-- … --> | komentarz; nie widać go na stronie, widać w kodzie |
<br>; do tego jest margin.Uczeń wpisał czterowierszowy wiersz w jeden akapit, każdy wers w osobnej linii kodu. W przeglądarce wszystko jest w jednej linii. Dlaczego i jak to naprawić?
Przeglądarka zwija białe znaki, więc entery stają się spacjami. Trzeba dodać <br> na końcu każdego wersu albo umieścić wiersz w <pre>.
Kolega chce, żeby podtytuł był mniejszy, więc zamiast <h2> użył <h5>. Co jest nie tak?
Stopień nagłówka określa miejsce w strukturze, nie wygląd. Czytnik ekranu i wyszukiwarka uznają podtytuł za mało ważny i „zgubią” stopnie pośrednie. Należy zostawić h2 i zmniejszyć go stylem.
Wyróżnienia w tekście i encje
Wewnątrz akapitu można wyróżnić słowa. Część znaczników niesie znaczenie, część tylko wygląd:
| Znacznik | Znaczenie | Domyślny wygląd |
|---|---|---|
<strong> | treść ważna, pilna albo poważna (ostrzeżenie) | pogrubienie |
<b> | pogrubienie bez dodatkowego znaczenia | pogrubienie |
<em> | akcent: słowo, które zaakcentowałbyś głosem; zmienia sens zdania | kursywa |
<i> | tekst „innym głosem”: termin, wyraz obcy, nazwa łacińska | kursywa |
<u> | podkreślenie | podkreślenie |
<mark> | wyróżnienie jak zakreślaczem, np. szukane słowo | żółte tło |
<small> | drobny dopisek, zastrzeżenie | mniejsze litery |
<del>, <ins> | tekst usunięty i wstawiony (zmiana ceny, terminu) | przekreślenie, podkreślenie |
<sub>, <sup> | indeks dolny i górny | H₂O, m² |
strong i b wyglądają tak samo, podobnie em i i. Różnicę słyszy czytnik ekranu, który zmienia intonację, i widzi wyszukiwarka. Na co dzień wybieraj strong i em. Gdy arkusz każe „pogrubić” albo „pochylić” tekst, egzaminator przyjmie oba zapisy, a gdy wprost wymienia znacznik, użyj tego.
Komentarze
Komentarz <!-- … --> może mieć wiele wierszy i służy do notatek albo do tymczasowego „wyłączenia” fragmentu kodu. Nie da się go zagnieździć: pierwsze --> kończy komentarz.
Ctrl+U). Nigdy nie zostawiaj w nim haseł ani prywatnych uwag.Encje: znaki specjalne
Znak < w treści przeglądarka bierze za początek znacznika. Takie znaki zapisuje się encjami: nazwą &nazwa; albo numerem &#numer;. Nazwy encji rozróżniają wielkość liter.
| Znak | Encja | Numer | Kiedy |
|---|---|---|---|
| < > | < > | < > | nawiasy ostre w treści, np. opis znacznika |
| & | & | & | ampersand |
| " | " | " | cudzysłów w wartości atrybutu |
| (spacja) | |   | twarda spacja: „12 km” nie rozdzieli się na dwa wiersze; nie jest zwijana |
| © | © | © | prawa autorskie w stopce |
| ° | ° | ° | stopień |
| € | € | € | euro |
| → | → | → | strzałka |
Encjami zapiszesz też symbole matematyczne (∑, ∞) i litery greckie (α, Ω). Emoji to zwykłe znaki Unicode: można je wkleić albo wpisać numerem, np. 😀 to 😀. Zachowują się jak tekst.
Kodowanie znaków
Komputer przechowuje znak jako liczbę, a kodowanie mówi, która liczba to który znak. ASCII ma tylko 128 znaków, bez polskich liter. ISO-8859-2 i Windows-1250 dodały znaki środkowoeuropejskie, ale każde inaczej. UTF-8 obejmuje niemal wszystkie znaki świata i to jego zawsze używasz: <meta charset="utf-8"> w kodzie i zapis pliku w UTF-8 w edytorze.
Adres URL może zawierać tylko znaki ASCII; resztę przeglądarka zamienia na % i cyfry szesnastkowe. Spacja to %20, a „ł” to %C5%82. Dlatego pliki nazywaj bez spacji i polskich znaków.
Dobierz znacznik do każdego fragmentu: wzór wody; „metr kwadratowy” jako m²; ostrzeżenie „Nie schodź ze szlaku!”; zmiana godziny zbiórki z 7:00 na 6:30; słowo „Tatry” w wynikach wyszukiwania; łacińska nazwa kosodrzewiny Pinus mugo; zdanie „To ty prowadzisz grupę, nie ja” z akcentem na „ty”.
H<sub>2</sub>O; m<sup>2</sup>; <strong>Nie schodź ze szlaku!</strong>; <del>7:00</del> <ins>6:30</ins>; <mark>Tatry</mark>; <i lang="la">Pinus mugo</i> (język podpowiada czytnikowi wymowę); To <em>ty</em> prowadzisz grupę, nie ja.
Jaka jest różnica między <strong> a <b>, skoro oba pogrubiają?
strong mówi, że treść jest ważna, i tę informację odczytują czytniki ekranu i wyszukiwarki. b tylko wyróżnia tekst wizualnie.
Na stronie ma się wyświetlić dosłownie tekst <p>. Co wpiszesz w kodzie?
<p>. Encje zamienią się na ekranie w znaki < i >, a przeglądarka nie potraktuje ich jako znacznika.
W tekście „Trasa ma 12 km” przeglądarka przeniosła „km” do następnego wiersza. Jak temu zapobiec?
Zastąpić spację twardą: 12 km. W miejscu twardej spacji przeglądarka nie złamie wiersza.
Uczeń zakomentował w kodzie linijkę z hasłem do panelu administracyjnego. Czy hasło jest bezpieczne?
Nie. Komentarz jest częścią kodu wysyłanego do przeglądarki i każdy zobaczy go w źródle strony. Hasło trzeba usunąć z pliku.
Cytaty, skróty, kontakt i kod
| Znacznik | Co oznacza |
|---|---|
<blockquote cite="…"> | dłuższy cytat w osobnym bloku, z wcięciem; cite wskazuje źródło (nie jest wyświetlany) |
<q> | krótki cytat w zdaniu; cudzysłowy dodaje przeglądarka, więc ich nie wpisuj |
<abbr title="…"> | skrót; pełne rozwinięcie pojawia się w dymku |
<cite> | tytuł dzieła: książki, filmu, piosenki; kursywą |
<address> | dane kontaktowe autora albo właściciela strony; kursywą, w osobnym bloku |
<bdo dir="rtl"> | wymuszony kierunek tekstu od prawej do lewej; rzadko potrzebny |
Kod komputerowy
<kbd>: klawisze, które naciska użytkownik.<samp>: to, co wypisał program.<var>: zmienna we wzorze albo programie.<code>: fragment kodu. Dłuższy kod umieszcza się wprezcodew środku, żeby zachować wcięcia. Znaki<i>w pokazywanym kodzie zapisuje się encjami.
Kiedy użyjesz <q>, a kiedy <blockquote>?
q dla krótkiego cytatu wplecionego w zdanie (przeglądarka sama doda cudzysłowy). blockquote dla dłuższego cytatu w osobnym bloku.
Napisz kod zdania „Aby odświeżyć stronę, naciśnij F5”, poprawnie oznaczając klawisz.
<p>Aby odświeżyć stronę, naciśnij <kbd>F5</kbd>.</p>
Skrót „INF.03” ma po najechaniu kursorem pokazywać pełną nazwę kwalifikacji. Jak to zapiszesz?
<abbr title="Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych">INF.03</abbr>
Relacja z wyprawy
Utwórz w folderze szlak plik relacja.html z relacją z klubowego wyjazdu w Bieszczady. Treść wymyśl sam; liczy się poprawne oznaczenie każdego fragmentu. Nie używaj CSS.
Założenia
- Szkielet jak w zadaniu Z1, tytuł karty „Relacja: Bieszczady 2026”.
- Na początku kodu komentarz z imieniem autora i datą, niewidoczny na stronie.
- Nagłówek pierwszego stopnia z tytułem relacji i trzy części z nagłówkami drugiego stopnia: „Dzień 1”, „Dzień 2”, „Wnioski”; w każdej co najmniej jeden akapit.
- W tekście: ważne ostrzeżenie (znaczeniowo), słowo z akcentem, fragment wyróżniony jak zakreślaczem i zmiana godziny zbiórki pokazana jako treść usunięta i wstawiona.
- Wysokość szczytu z jednostką zapisana tak, że liczba i „m n.p.m.” nie rozdzielą się przy łamaniu wiersza.
- Temperatura ze znakiem stopnia wstawionym encją, np. „4°C”.
- Cytat przewodnika jako osobny blok ze źródłem w atrybucie oraz krótki cytat wpleciony w zdanie.
- Skrót „PTTK” z pełną nazwą w dymku.
- Lista rzeczy do plecaka wyrównana spacjami w dwóch kolumnach (np. „czołówka 1 szt.”), wyświetlana dokładnie tak, jak w kodzie.
- Na końcu dane kontaktowe organizatora w elemencie na kontakt i linijka „© 2026 Klub turystyczny Szlak” ze znakiem zapisanym encją.
Ocenie podlega
- hierarchia nagłówków bez przeskakiwania stopni,
- znaczniki dobrane do znaczenia treści, a nie tylko do wyglądu,
- poprawne encje i twarda spacja,
- lista do plecaka zachowuje wyrównanie,
- komentarz niewidoczny na stronie.
⛰) i sprawdź, jak zmienia się jego wielkość przy powiększaniu strony (Ctrl + +).Wskazówki
- Nagłówki, akapity, tekst sformatowany: lekcja „Nagłówki i akapity”.
- Ostrzeżenie, akcent, zakreślenie, zmiana treści, komentarz, encje: lekcja „Wyróżnienia i encje”.
- Cytaty, skrót, kontakt: lekcja „Cytaty i kod”.
Atrybut style, kolory i dołączanie CSS
Atrybut style nadaje wygląd jednemu elementowi. Jego wartość to deklaracje CSS właściwość: wartość; rozdzielone średnikami.
<h1 style="color: DarkGreen; text-align: center;">Klub Szlak</h1> <p style="background-color: #FDF0EA; font-family: Verdana, sans-serif;">Zapisy do piątku.</p> <p style="font-size: 20px; border: 2px solid Tomato;">Tekst z ramką</p>
| Właściwość | Co zmienia |
|---|---|
color, background-color | kolor tekstu, kolor tła |
font-family | krój czcionki; lista, na końcu rodzina ogólna: serif, sans-serif, monospace |
font-size | rozmiar czcionki, np. 20px, 150% |
text-align | wyrównanie: left, center, right |
border | ramka: grubość, styl, kolor, np. 2px solid Tomato |
Zapis kolorów
- Nazwa: przeglądarki znają około 140 nazw, np.
Tomato,DodgerBlue,SlateGray. Wielkość liter nie ma znaczenia. - RGB:
rgb(czerwony, zielony, niebieski), każda składowa od 0 do 255, razem ponad 16 milionów kolorów.rgb(0, 0, 0)to czerń, trzy równe wartości dają szarość. - HEX:
#RRGGBB, te same składowe szesnastkowo od00doFF(255). Skrót#F00=#FF0000. - HSL:
hsl(odcień, nasycenie, jasność). Odcień to kąt na kole barw (0 czerwony, 120 zielony, 240 niebieski). Jasność 0% to zawsze czerń, 100% biel. - RGBA, HSLA: czwarta wartość to krycie, od
0(przezroczysty) do1(pełny kolor).
Trzy sposoby dołączenia CSS
<!-- 1. w atrybucie style jednego elementu -->
<h1 style="color: DarkGreen;">Klub Szlak</h1>
<!-- 2. element style w head -->
<style>
h1 { color: DarkGreen; }
</style>
<!-- 3. zewnętrzny plik, podłączony w head -->
<link rel="stylesheet" href="css/styl.css">
Najczęściej używa się zewnętrznego pliku: jeden arkusz obsługuje wszystkie podstrony, więc jedna zmiana zmienia całą witrynę. Plik CSS zawiera tylko reguły, bez HTML. „Kaskadowe” oznacza, że style się nakładają: ustawienia z body dziedziczą elementy w środku, a przy konflikcie wygrywa reguła bardziej szczegółowa; styl w atrybucie style jest silniejszy niż arkusz.
Kolory odnośników
Domyślnie odnośnik nieodwiedzony jest niebieski i podkreślony, odwiedzony fioletowy, a w chwili kliknięcia czerwony. Zmieniają to stany odnośnika w CSS, w kolejności :link, :visited, :hover, :active; inaczej późniejsza reguła przykryje wcześniejszą.
a:link { color: DarkGreen; text-decoration: none; }
a:visited { color: Olive; }
a:hover { color: Tomato; text-decoration: underline; }
a:active { color: Red; }
Zamień kolor #FF6347 na zapis RGB.
Każdą parę cyfr zamieniasz z szesnastkowego na dziesiętny: FF = 255, 63 = 6 × 16 + 3 = 99, 47 = 4 × 16 + 7 = 71. Wynik: rgb(255, 99, 71), czyli Tomato.
Jaki kolor da hsl(120, 100%, 25%), a jaki hsl(120, 0%, 25%)?
Pierwszy ciemnozielony (odcień 120, pełne nasycenie, mała jasność). Drugi ciemnoszary: przy nasyceniu 0% odcień nie ma znaczenia.
Witryna ma dziesięć podstron o jednakowym wyglądzie. Który sposób dołączenia CSS wybierzesz?
Zewnętrzny plik podłączony przez link na każdej podstronie. Style są w jednym miejscu, a przeglądarka pobiera arkusz raz i go zapamiętuje.
Kolor po najechaniu kursorem nie działa. W arkuszu jest kolejno: a:hover, a:link, a:visited. Dlaczego?
Reguły mają tę samą siłę, więc wygrywa zapisana później: a:link i a:visited nadpisują kolor z a:hover. Poprawna kolejność: :link, :visited, :hover, :active.
Odnośniki
Odnośnik (hiperłącze) to znacznik a (od anchor, kotwica) z atrybutem href. Tekst między znacznikami jest tym, co się klika.
<a href="kontakt.html">Kontakt</a> <a href="https://www.pttk.pl" target="_blank" rel="noopener">PTTK w nowej karcie</a> <a href="mailto:zapisy@szlak.pl?subject=Zapisy">Napisz do nas</a> <a href="tel:+48241234567">Zadzwoń</a> <a href="regulamin.pdf" download>Pobierz regulamin</a>
| href | Dokąd prowadzi |
|---|---|
kontakt.html | plik w tym samym folderze co strona (adres względny) |
dokumenty/regulamin.pdf | plik w podfolderze dokumenty |
https://cke.gov.pl | inna witryna; adres bezwzględny z protokołem |
#kontakt | element o id="kontakt" na tej samej stronie |
wyjazdy.html#tatry | element o id="tatry" na innej stronie |
mailto:biuro@lapa.pl?subject=Zapisy | nowa wiadomość e-mail, z tematem po ?subject= |
tel:+48123456789 | połączenie telefoniczne |
Atrybuty odnośnika
target: gdzie otworzyć stronę._self(domyślnie) w tej samej karcie,_blankw nowej karcie lub oknie,_parenti_topdotyczą stron w ramkachiframe. Arkusz pisze wtedy „otwierany w nowej karcie” albo „w nowym oknie”.rel="noopener"przy_blankodcina nowej karcie dostęp do twojej strony.download: przeglądarka pobierze plik zamiast go otworzyć.title: dymek z informacją, dokąd prowadzi odnośnik.- Odnośnikiem może być obraz (
imgwewnątrza), a w HTML5 nawet cały blok, np. karta z obrazem i tekstem.
Zakładki: odnośnik do miejsca na stronie
Najpierw elementowi nadajesz id, potem odnośnik prowadzi do niego przez #. Tak buduje się spis treści długiej strony.
<a href="#tatry">Przejdź do wyjazdu w Tatry</a> ... <h2 id="tatry">Tatry: sierpień</h2>
Napisz odnośnik, który z index.html przeniesie do części z id="kontakt" na podstronie onas.html.
<a href="onas.html#kontakt">Kontakt</a>
Dlaczego tekst odnośnika „kliknij tutaj” to zły pomysł?
Nie mówi, dokąd prowadzi odnośnik. Osoby z czytnikiem ekranu często przeglądają samą listę odnośników, a dziesięć razy „kliknij tutaj” nic im nie powie. Lepiej: „Regulamin wyjazdów”, „Zapisz się na wyjazd w Tatry”.
Ścieżki do plików
Ścieżka mówi przeglądarce, gdzie leży plik: strona, obraz, arkusz, skrypt. Weźmy taki projekt:
szlak/
├── index.html
├── css/
│ └── styl.css
├── img/
│ ├── logo.png
│ └── galeria/
│ └── tarnica.jpg
└── wyjazdy/
├── tatry.html
└── pieniny.html
| Ścieżka | Znaczenie |
|---|---|
logo.png | plik w tym samym folderze co bieżąca strona |
img/logo.png | plik w podfolderze img |
../logo.png | plik o jeden folder wyżej (.. to „wyjdź z folderu”) |
../../logo.png | dwa foldery wyżej |
/img/logo.png | liczone od katalogu głównego witryny (ukośnik na początku) |
https://…/logo.png | pełny adres: ścieżka bezwzględna |
Ten sam plik wskazujesz różnie, zależnie od tego, w której stronie piszesz ścieżkę:
<!-- w pliku index.html --> <img src="img/galeria/tarnica.jpg" alt="Tarnica o świcie"> <a href="wyjazdy/tatry.html">Tatry</a> <!-- w pliku wyjazdy/tatry.html --> <img src="../img/galeria/tarnica.jpg" alt="Tarnica o świcie"> <a href="../index.html">Strona główna</a> <link rel="stylesheet" href="../css/styl.css">
/ działają na serwerze, ale przy otwieraniu pliku z dysku (file:///…) „katalogiem głównym” staje się cały dysk i obrazy znikają. Na egzaminie i w ćwiczeniach używaj ścieżek względnych. Pisz ukośnikiem /, nie \, i bez litery dysku. Na serwerze wielkość liter w nazwach plików ma znaczenie: Kot.jpg to inny plik niż kot.jpg.Strona wyjazdy/tatry.html ma wyświetlić logo z img/logo.png. Jaki src wpiszesz?
../img/logo.png: najpierw wychodzisz z folderu wyjazdy do folderu głównego, potem wchodzisz do img.
Obrazek <img src="/img/logo.png"> się nie wyświetla, choć plik jest w szlak/img/logo.png. Strona jest otwierana dwuklikiem z dysku. Dlaczego?
Ukośnik na początku każe liczyć ścieżkę od katalogu głównego, a przy otwieraniu z dysku jest nim katalog główny dysku, np. C:/. Przeglądarka szuka więc C:/img/logo.png. Rozwiązanie: img/logo.png.
Obrazy
Obraz wstawia element pusty img. Plik wskazuje src, a alt opisuje go słowami.
<img src="zdjecia/pies.jpg" alt="Pies Burek" width="300">
| Atrybut | Co robi |
|---|---|
src | ścieżka do pliku albo pełny adres |
alt | tekst alternatywny: widać go, gdy obraz się nie wczyta; czytają go czytniki ekranu i wyszukiwarki. Wymagany. Obraz czysto ozdobny dostaje pusty alt="", żeby czytnik go pominął. |
width, height | wymiary w pikselach, bez jednostki. Przeglądarka rezerwuje miejsce, zanim pobierze obraz, i treść nie przeskakuje. Podanie jednego zachowuje proporcje. |
title | dymek po najechaniu kursorem |
Poniżej ten sam obraz trzy razy: z właściwą ścieżką, ze złą ścieżką i tekstem alternatywnym oraz ze złą ścieżką bez niego.
Formaty
| Format | Kiedy |
|---|---|
JPEG (.jpg) | zdjęcia |
PNG (.png) | grafiki z przezroczystością, zrzuty ekranu |
GIF (.gif) | proste animacje |
SVG (.svg) | logo i ikony; grafika wektorowa, ostra w każdym rozmiarze |
| WebP, AVIF | nowoczesne formaty, mniejsze pliki przy tej samej jakości |
ICO (.ico) | favicony |
Podpis i obraz jako odnośnik
<figure> <img src="zdjecia/pies.jpg" alt="Pies Burek"> <figcaption>Burek, 3 lata</figcaption> </figure> <!-- miniatura otwiera duże zdjęcie --> <a href="kot-duzy.png"><img src="kot-maly.png" alt="Kot Mruczek"></a>
Obraz w tle i opływanie tekstem
Obraz, który ma być tłem elementu, ustawia CSS, a nie img: background-image: url('img/gory.jpg'), z background-size: cover (wypełnia cały element) i background-repeat: no-repeat. Styl float: left albo right stawia obraz przy krawędzi, a tekst go opływa.
.jpg czy .png, .JPG czy .jpg). Obraz, który się nie wyświetla, to prawie zawsze literówka w src.Obraz na stronie galerii jest tylko ozdobnym szlaczkiem. Jaką wartość nadasz atrybutowi alt?
Pusty tekst: alt="". Czytnik ekranu pominie obraz. Samego atrybutu nie usuwaj: jego brak to błąd walidacji, a czytnik mógłby odczytać nazwę pliku.
Mapa obrazu i element picture
Na jednym obrazie można wyznaczyć kilka klikalnych obszarów, np. na mapie szlaków. Obraz wskazuje mapę atrybutem usemap (z kratką), a mapa map (z name bez kratki) zawiera obszary area.
<img src="mapa.png" alt="Mapa szlaków w Bieszczadach" usemap="#szlaki" width="600" height="400"> <map name="szlaki"> <area shape="rect" coords="40,30,220,140" href="relacja.html#dzien-1" alt="Wetlina"> <area shape="circle" coords="410,220,60" href="relacja.html#dzien-2" alt="Tarnica"> <area shape="poly" coords="300,300,380,350,320,390" href="relacja.html" alt="Ustrzyki Górne"> </map>
| shape | coords |
|---|---|
rect | x1,y1,x2,y2: lewy górny i prawy dolny róg prostokąta |
circle | x,y,r: środek i promień koła |
poly | kolejne pary x,y wierzchołków wielokąta |
default | reszta obrazu |
Współrzędne liczy się w pikselach od lewego górnego rogu obrazu. Odczytasz je w dowolnym programie graficznym; Paint pokazuje je na pasku stanu.
Element picture
picture podaje kilka wersji obrazu, a przeglądarka bierze pierwszą pasującą. Na końcu zawsze stoi zwykły img: to on wyświetla obraz, ma alt i jest wersją zapasową.
<picture> <source media="(min-width: 800px)" srcset="img/gory-szerokie.jpg"> <source type="image/avif" srcset="img/gory.avif"> <img src="img/gory.jpg" alt="Grań Tatr o zachodzie słońca"> </picture>
Na mapie ma być klikalne koło o środku (150, 90) i promieniu 40 px, prowadzące do tarnica.html. Napisz element area.
<area shape="circle" coords="150,90,40" href="tarnica.html" alt="Tarnica">
Po co w picture jest zwykły img, skoro wersje obrazu podano w source?
img jest obowiązkowy: to on wyświetla obraz (źródła tylko podpowiadają, jaki plik do niego załadować), ma tekst alt i jest wersją zapasową dla przeglądarek, którym nie pasuje żadne źródło.
Podstrony, galeria i mapa
Rozbuduj witrynę klubu o wspólny arkusz stylów, menu łączące podstrony, galerię zdjęć i klikalną mapę.
Założenia
- Struktura:
index.html,relacja.html(z Z2) i nowygaleria.htmlw folderze głównym;css/styl.css; cztery dowolne zdjęcia wimg/galeria/i obraz mapyimg/mapa.png. - Wszystkie trzy podstrony mają podłączony ten sam arkusz. W arkuszu kolor tła strony zapisany szesnastkowo, kolor tekstu w RGB, kolor nagłówków nazwą.
- Odnośniki nieodwiedzone bez podkreślenia, po najechaniu kursorem inny kolor i podkreślenie; stany we właściwej kolejności.
- Na górze każdej podstrony menu z odnośnikami „Start”, „Relacja”, „Galeria” (ścieżki względne).
- W
relacja.htmlczęści dni mają identyfikatorydzien-1idzien-2; naindex.htmlodnośnik „Zobacz relację z Tarnicy” prowadzi wprost do drugiego dnia. - Na
index.htmlodnośnik do e-maila nazapisy@szlak.plz tematem „Zapisy” i odnośnik do połączenia telefonicznego. galeria.html: nagłówek z obrazem w tle wypełniającym cały blok (wysokość 200 px); pod nim 4 zdjęcia szerokości 300 px z opisowym tekstem alternatywnym; każde zdjęcie otwiera pełny plik w nowej karcie.- Pod galerią część „Mapa wyjazdu” z obrazem mapy i dwoma obszarami: prostokątnym (do
relacja.html#dzien-1) i okrągłym (dorelacja.html#dzien-2), każdy z tekstem alternatywnym.
Ocenie podlega
- menu działa na każdej podstronie, bez błędnych ścieżek,
- jeden arkusz obsługuje wszystkie podstrony,
- poprawne stany odnośników,
- zdjęcia mają sensowne teksty alternatywne i otwierają się w nowej karcie,
- oba obszary mapy prowadzą do właściwych miejsc relacji,
- witryna działa po otwarciu z dysku (żadna ścieżka nie zaczyna się od
/).
relacja.html do podfolderu wyjazdy/ i popraw wszystkie ścieżki, które przestały działać.Wskazówki
- Zapisy kolorów, zewnętrzny CSS i stany odnośników: lekcja „Style i kolory”.
- Nowa karta,
mailto:,tel:, zakładki: lekcja „Odnośniki”. - Ścieżki do podfolderów: lekcja „Ścieżki do plików”.
- Obraz jako odnośnik i obraz w tle: lekcja „Obrazy”; mapa: lekcja „Mapa obrazu i picture”.
Listy
HTML ma trzy rodzaje list. Punktowana (w arkuszach też „nienumerowana”) ul: zbiór bez znaczącej kolejności. Numerowana ol: kroki, ranking, instrukcja. Opisowa dl: pojęcia z objaśnieniami. Pozycje ul i ol to li, a w ul i ol nie może stać nic poza li.
<ul> <li>Pieczywo</li> <li>Nabiał</li> </ul>
<ol type="A"> <li>Wybierz produkty</li> <li>Zapłać</li> </ol>
| Atrybut ol | Wynik |
|---|---|
type="1" (domyślnie), "A", "a", "I", "i" | 1, 2, 3 · A, B, C · a, b, c · I, II, III · i, ii, iii |
start="5" | numeracja od 5; zawsze liczbą, także przy literach i cyfrach rzymskich |
reversed | numeracja malejąca |
Lista zagnieżdżona
Podlista leży wewnątrz pozycji li, przed jej znacznikiem zamykającym. Częsty błąd to wstawienie ul między dwa li. Przeglądarka sama zmienia punktor podlisty (z kropki na kółko).
<ul>
<li>Owoce
<ul>
<li>Jabłka</li>
<li>Gruszki</li>
</ul>
</li>
</ul>
Lista opisowa
dl (description list) składa się z par: dt to pojęcie, dd jego opis (domyślnie z wcięciem). Nadaje się do słowniczków, FAQ i zestawień „cecha: wartość”.
list-style-type: disc (koło, domyślnie), circle, square, none. Menu to w praktyce lista odnośników bez punktorów, ułożona w CSS w poziomie.Napisz listę numerowaną cyframi rzymskimi, której pierwsza pozycja ma numer V.
<ol type="I" start="5"><li>…</li></ol>: start zawsze jest liczbą, niezależnie od rodzaju numeracji.
Znajdź błąd: <ul><li>Góry</li><ul><li>Tatry</li></ul></ul>
Podlista stoi wprost w ul, a tam może być tylko li. Poprawnie: <ul><li>Góry<ul><li>Tatry</li></ul></li></ul>.
Na stronie ma być słowniczek pojęć turystycznych. Który rodzaj listy wybierzesz?
Listę opisową dl: pojęcie w dt, wyjaśnienie w dd.
Tabele
Tabela służy do danych, które mają wiersze i kolumny: harmonogramu, cennika, wyników. Składa się z wierszy tr, a wiersze z komórek: th (nagłówkowa) albo td (zwykła). Kolumny nie mają własnego znacznika, wynikają z liczby komórek w wierszu.
<table>
<caption>Cennik wypożyczalni</caption>
<thead>
<tr><th scope="col">Rower</th><th scope="col">Godzina</th><th scope="col">Doba</th></tr>
</thead>
<tbody>
<tr><td>Górski</td><td>15 zł</td><td>60 zł</td></tr>
<tr><td>Miejski</td><td>10 zł</td><td>40 zł</td></tr>
</tbody>
</table>
| Znacznik | Co oznacza |
|---|---|
<caption> | podpis tabeli; zaraz po <table> |
<thead>, <tbody>, <tfoot> | grupy wierszy: nagłówek, treść, podsumowanie |
<tr> | wiersz (table row) |
<th> | komórka nagłówkowa (table header); domyślnie pogrubiona i wyśrodkowana. scope="col" albo "row" mówi czytnikom ekranu, czy dotyczy kolumny, czy wiersza |
<td> | zwykła komórka (table data); może zawierać tekst, obraz, listę, a nawet inną tabelę |
<colgroup>, <col span="2"> | grupa kolumn do ostylowania całej kolumny; po caption, przed pierwszym wierszem; działają tylko width, background, border, visibility |
Ramki i odstępy to CSS
Tabela w HTML nie ma ramek. W ćwiczeniach ramki dodaje styl podglądu, a na stronie robi to arkusz:
table, th, td {
border: 1px solid #999999;
border-collapse: collapse; /* jedna linia zamiast podwójnych ramek */
}
table { width: 100%; }
th, td { padding: 8px 12px; } /* odstęp treści od ramki */
tr:nth-child(even) { background-color: #F5F6F8; } /* co drugi wiersz */
tr:hover { background-color: #FFF3C4; } /* wiersz pod kursorem */
Bez border-collapse: collapse każda komórka ma własną ramkę i między komórkami widać podwójne linie. Stary atrybut border="1" działa, ale w HTML5 jest przestarzały.
Między komórkami tabeli widać podwójne linie. Jaka właściwość to naprawi?
border-collapse: collapse; dla tabeli: sąsiednie ramki łączą się w jedną linię.
Scalanie komórek
Komórka może zająć kilka kolumn (colspan) albo kilka wierszy (rowspan). Za każdą zajętą kolumnę albo wiersz trzeba usunąć jedną komórkę, inaczej tabela się „rozjedzie”.
- colspan="2": komórka zajmuje swoje miejsce i miejsce następnej w tym samym wierszu. W wierszu piszesz o jedną komórkę mniej.
- rowspan="2": komórka zajmuje też miejsce w wierszu poniżej. W następnym wierszu pomijasz komórkę w tej kolumnie.
- Sprawdzaj, licząc: każdy wiersz musi dać tyle samo kolumn, wliczając komórki z
colspani te, które „wchodzą” z góry przezrowspan.
Tabela ma cztery kolumny. W ostatnim wierszu napis „Suma” ma zająć trzy pierwsze kolumny, a w czwartej ma być kwota 2140 zł. Napisz ten wiersz.
<tr><td colspan="3">Suma</td><td>2140 zł</td></tr>
Komórka w drugim wierszu ma rowspan="3". Ile komórek td napiszesz w wierszach trzecim i czwartym, jeśli tabela ma cztery kolumny?
Po trzy. Scalona komórka zajmuje pierwszą kolumnę w wierszach 2, 3 i 4, więc w wierszach 3 i 4 zostają trzy kolumny do wypełnienia.
Harmonogram wyjazdów
Dodaj do witryny podstronę wyjazdy.html z harmonogramem wyjazdów na 2026 rok i informacjami praktycznymi. Dopisz ją do menu na wszystkich podstronach.
Założenia
- Tabela z podpisem „Harmonogram wyjazdów 2026” i kolumnami: Miesiąc, Kierunek, Liczba dni, Trudność, Cena; nagłówki w
thead, oznaczone jako nagłówki kolumn. - W
tbodypięć wyjazdów; dwa odbywają się w tym samym miesiącu, a nazwa miesiąca jest wtedy jedną komórką na dwa wiersze. - Wiersz podsumowania w
tfoot: „Łącznie dni” zajmuje dwie pierwsze kolumny, suma dni stoi w kolumnie „Liczba dni”, a dwie ostatnie kolumny wypełnia jedna pusta komórka. - Kolumna „Cena” ma inne tło niż pozostałe, ustawione grupą kolumn.
- W arkuszu: tabela na całą szerokość, pojedyncze ramki 1 px, dopełnienie komórek 8 px, tło nagłówków, co drugi wiersz treści w innym kolorze, podświetlenie wiersza pod kursorem.
- Pod tabelą lista punktowana „Co zabrać” z kwadratowymi punktorami; pozycja „Ubrania” ma zagnieżdżoną listę z trzema pozycjami.
- Lista numerowana „Jak się zapisać” z czterema krokami i druga lista „Po wyjeździe”, której numeracja zaczyna się od 5.
- Słowniczek z pojęciami grań, przełęcz, szlak jako lista opisowa.
Ocenie podlega
- poprawna liczba komórek w każdym wierszu (nic nie „wystaje”),
- scalenia zgodne z opisem,
- co drugi wiersz wyróżniony selektorem, a nie klasami w HTML,
- podlista zagnieżdżona we właściwym miejscu,
- numeracja drugiej listy od 5,
- nowa podstrona jest w menu wszystkich stron.
Wskazówki
- Podpis, grupy wierszy,
scope, grupy kolumn, ramki i paski: lekcja „Tabele”; scalanie: lekcja „Scalanie komórek”. - Zagnieżdżanie,
start, kształt punktora, lista opisowa: lekcja „Listy”. - Przy scalaniu narysuj tabelę na kartce i policz komórki w każdym wierszu.
Bloki, klasy i identyfikatory
Każdy element ma domyślny sposób wyświetlania:
- Blokowy zaczyna się w nowej linii i zajmuje całą szerokość:
div,p,h1–h6,ul,ol,li,table,form,header,section,footer. - Liniowy (inline) płynie w tekście jak słowo w zdaniu:
span,a,strong,em,img,code,label,input,button.
div to blok bez znaczenia ani wyglądu: pojemnik do grupowania elementów, któremu wygląd i miejsce nadaje CSS. span to jego odpowiednik w wierszu tekstu, do wyróżnienia kilku słów. Kilka bloków obok siebie układa display: flex na wspólnym rodzicu (starsze sposoby: float, inline-block).
- Element liniowy nie powinien zawierać blokowego:
<span><div>…</div></span>to błąd. Wyjątkiem jesta, który w HTML5 może obejmować całe bloki. - Blok nie powinien leżeć w akapicie:
<p><div>…</div></p>przeglądarka rozbije na dwa osobne elementy.
class i id
<div id="oferta">
<div class="karta promocja">
<h3>Rower miejski</h3>
<p>Cena: <span class="cena">1599 zł</span></p>
</div>
</div>
| class | id | |
|---|---|---|
| ile razy na stronie | dowolnie wiele | raz |
| ile na jednym elemencie | kilka, po spacji: class="karta promocja" | jeden |
| selektor CSS | .karta | #oferta |
| w JavaScripcie | getElementsByClassName("karta") | getElementById("oferta") |
| typowe zastosowanie | powtarzalne elementy: karty, przyciski | pojedyncze bloki strony, zakładki #id, elementy dla skryptu |
- Identyfikator: co najmniej jeden znak, bez spacji, wielkość liter ma znaczenie (
Menuimenuto dwa różne). Nie zaczynaj od cyfry. Najbezpieczniej: małe litery, cyfry i myślniki, np.dzien-2. - Reguła z
#idjest silniejsza niż reguła z klasą. style="color: DarkRed"to styl tylko dla tego elementu; używaj wyjątkowo.
id="lewy", „elementy klasy cena” to class="cena". Arkusz CSS odwołuje się do tych nazw, więc literówka w HTML wyłącza styl.Które z tych elementów są domyślnie blokowe: p, span, li, a, h2, img, table?
p, li, h2 i table. span, a i img są liniowe.
W zdaniu „Zbiórka o 6:00 przy dworcu” godzina ma być czerwona, a zdanie ma zostać w jednym wierszu. Jakiego elementu użyjesz?
span, bo jest liniowy: Zbiórka o <span style="color: red;">6:00</span> przy dworcu. div przeniósłby godzinę do nowej linii.
Na stronie jest sześć kart wyjazdów o identycznym wyglądzie. Nadasz im id="karta" czy class="karta"?
class="karta". Identyfikator musi być unikalny; sześć elementów z tym samym id to błąd walidacji, który psuje też skrypty i zakładki.
Które identyfikatory są poprawne i bezpieczne: dzien 2, 2-dzien, dzien-2, Dzien_2?
dzien-2 i Dzien_2 (ten trzeba zawsze pisać z wielką literą). dzien 2 ma spację, to błąd. 2-dzien zaczyna się od cyfry, czego lepiej unikać, bo w CSS wymaga specjalnego zapisu.
Znaczniki semantyczne HTML5
Element semantyczny ma nazwę, która mówi, czym jest jego treść. form, table czy article od razu mówią, co zawierają; div i span nic. Na ekranie bloki semantyczne wyglądają jak div, ale czytnik ekranu pozwala przeskoczyć od razu do main albo nav, wyszukiwarka rozumie strukturę, a kod czyta się łatwiej.
| Znacznik | Co zawiera | W arkuszu |
|---|---|---|
<header> | nagłówek strony albo artykułu: logo, tytuł | baner |
<nav> | główne bloki nawigacji (nie każdy odnośnik) | menu, blok nawigacyjny |
<main> | główna treść; jeden na stronie | blok główny |
<section> | tematyczna część treści, zwykle z nagłówkiem | blok lewy, prawy, środkowy |
<article> | samodzielna całość: wpis, aktualność, karta produktu | rzadziej |
<aside> | treść poboczna: panel, ramka z ciekawostką | panel boczny |
<footer> | stopka strony albo artykułu | stopka „Stronę wykonał…” |
<figure>, <figcaption> | ilustracja (obraz, schemat, kod) z podpisem | obraz z podpisem |
<details>, <summary> | treść rozwijana po kliknięciu, bez JavaScriptu | rzadziej |
<time datetime="…"> | data albo godzina czytelna dla maszyn | rzadziej |
section czy article? Zapytaj: czy ten fragment miałby sens wyrwany ze strony, np. udostępniony osobno? Jeśli tak, to article (aktualność, wpis). Jeśli to część większej całości, to section (część „Kontakt”, rozdział). Oba można zagnieżdżać: sekcja „Aktualności” zawiera kilka artykułów. header i footer mogą wystąpić wiele razy, np. w każdym article.
header, section, footer) albo div, a jeśli arkusz podaje id lub klasę, to także ten atrybut. Gdy arkusz wprost wymienia znacznik, użyj tego.Na stronie klubu jest część „Aktualności” z pięcioma wpisami. Jakie znaczniki dla części, a jakie dla wpisów?
Całość to section z nagłówkiem „Aktualności”, a każdy wpis to osobny article, bo ma sens także sam.
Odpowiedź na pytanie z FAQ ma być ukryta i rozwijać się po kliknięciu pytania, bez JavaScriptu. Jakich elementów użyjesz?
<details><summary>Pytanie</summary><p>Odpowiedź</p></details>. Tak działają też odpowiedzi „Sprawdź się” w tym kursie.
Strona responsywna
Strona responsywna dobrze wygląda na każdym ekranie, od telefonu po duży monitor. Nie robi się osobnej wersji mobilnej: ta sama strona sama się dopasowuje. Po stronie HTML wystarczą dwa elementy, resztę robi CSS.
1. Znacznik viewport
<meta name="viewport" content="width=device-width, initial-scale=1.0">
Bez niego telefon udaje ekran o szerokości około 980 px i pomniejsza całą stronę, a tekst robi się mikroskopijny. width=device-width każe użyć prawdziwej szerokości ekranu, a initial-scale=1.0 ustawia powiększenie na 100%.
2. Obrazy, które się skalują
img {
max-width: 100%;
height: auto;
}
max-width: 100% pozwala obrazowi się zmniejszać, ale nie powiększy go ponad oryginał (width: 100% rozciągnąłby mały obraz i go rozmył). height: auto zachowuje proporcje. Różne pliki dla różnych ekranów podaje picture.
3. Media queries
#lewy { width: 30%; }
#prawy { width: 70%; }
@media screen and (max-width: 700px) {
.kolumny { flex-direction: column; } /* kolumny jedna pod drugą */
#lewy, #prawy { width: 100%; }
}
Reguły w @media działają tylko przy spełnionym warunku. Zapisuj je na końcu arkusza: mają tę samą siłę co wcześniejsze reguły, więc wygrywają dzięki temu, że stoją niżej. Jednostka vw to 1% szerokości okna (font-size: 6vw), ale na telefonie tekst może zrobić się za mały. Wersję mobilną sprawdzisz w narzędziach deweloperskich: Ctrl+Shift+M włącza tryb urządzenia. Gotowe klasy do responsywnych układów mają frameworki, np. Bootstrap.
Na telefonie strona wygląda jak pomniejszona wersja komputerowa i trzeba ją powiększać palcami. Czego najpewniej brakuje?
Znacznika <meta name="viewport" content="width=device-width, initial-scale=1.0"> w head.
Obraz ma 400 px szerokości. Czym różni się width: 100% od max-width: 100% w kontenerze szerokim na 1000 px?
width: 100% rozciągnie obraz do 1000 px i go rozmyje. max-width: 100% zostawi 400 px; pozwala tylko zmniejszać, gdy kontener jest węższy od obrazu.
Media query z regułą #lewy { width: 100%; } stoi na początku arkusza, a zwykła reguła #lewy { width: 30%; } niżej. Na telefonie kolumna ma 30%. Dlaczego?
Przy wąskim ekranie obowiązują obie reguły o tym samym selektorze, a wygrywa zapisana później. Media queries trzeba przenieść na koniec arkusza.
Układ strony z bloków
Przebuduj index.html według poniższych założeń, używając znaczników semantycznych, klas i identyfikatorów. Style zapisz w css/styl.css.
┌──────────────────── header ────────────────────┐ │ logo, h1 │ ├───────────────────── nav ──────────────────────┤ │ menu │ ├─────── aside ───────┬──────── main ────────────┤ │ panel boczny │ section │ │ │ article │ │ │ article │ ├──────────────────── footer ────────────────────┤ │ kontakt, © │ └────────────────────────────────────────────────┘
Założenia
- Baner to
headero identyfikatorzebaner: logo i nagłówek pierwszego stopnia, ciemnozielone tło, biały tekst, wysokość 120 px. - Menu to
navz listą odnośników do wszystkich podstron, ułożonych poziomo, bez punktorów, z odstępem 20 px. - Pod menu dwie kolumny: lewa
asideo identyfikatorzelewy(30% szerokości) z nagłówkiem „Najbliższy wyjazd” i artykułem z ilustracją z podpisem oraz datą zapisaną z atrybutem w formacie maszynowym; prawamaino identyfikatorzeprawy(70%) z częścią „Aktualności”. - W „Aktualnościach” trzy wpisy jako osobne artykuły klasy
karta(ramka, dopełnienie, odstęp między kartami); jeden ma dodatkowo klasęwyroznionaz żółtym tłem. - W jednym wpisie cena wyróżniona kolorem przez element liniowy klasy
cena, bez łamania wiersza. - Pod aktualnościami część „Pytania” z dwoma pytaniami, których odpowiedzi rozwijają się po kliknięciu, bez JavaScriptu.
- Stopka
footero identyfikatorzestopka: wyśrodkowana informacja o prawach autorskich. - Przy szerokości do 700 px kolumny leżą jedna pod drugą na całą szerokość, a obrazy nie wychodzą poza swój blok.
Ocenie podlega
- układ zgodny ze schematem, kolumny 30% i 70%,
- znaczniki semantyczne użyte zgodnie ze znaczeniem,
- identyfikatory unikalne, klasy łączone na jednym elemencie,
- menu w poziomie, bez punktorów,
- poprawne zachowanie na wąskim ekranie (tryb urządzenia),
- żadnych tabel ani pustych elementów użytych do budowy układu.
display: flex, justify-content, align-items).Wskazówki
- Kolumny obok siebie:
display: flexna elemencie otaczającymasideimain. - Klasy łączone, identyfikatory,
span: lekcja „Bloki, klasy i id”. - Ilustracja z podpisem, data, treść rozwijana: lekcja „Znaczniki semantyczne”.
- Viewport, skalowanie obrazów, media query: lekcja „Strona responsywna”.
Formularz i pola
Formularz zbiera dane i wysyła je do skryptu na serwerze (na egzaminie zwykle PHP). Całość obejmuje form, a w nim są pola i przycisk wysyłania.
<form action="zapisz.php" method="post"> <label for="imie">Imię</label> <input type="text" id="imie" name="imie"> <label for="wiek">Wiek</label> <input type="number" id="wiek" name="wiek" min="16" max="99"> <button type="submit">Zapisz</button> </form>
Atrybuty form
| Atrybut | Działanie |
|---|---|
action | adres, pod który trafią dane, np. zapisz.php; bez niego dane idą do bieżącej strony |
method | get (domyślnie) albo post |
target | gdzie pokazać odpowiedź serwera: _self, _blank |
autocomplete="on" / "off" | czy przeglądarka podpowiada wcześniej wpisane wartości |
novalidate | wyłącza sprawdzanie pól przy wysyłaniu |
enctype="multipart/form-data" | wymagany, gdy formularz wysyła pliki (razem z method="post") |
GET czy POST
| GET | POST | |
|---|---|---|
| gdzie są dane | w adresie: zapisz.php?imie=Anna&wiek=17 | w treści żądania, niewidoczne w adresie |
| limit długości | tak, adres ma ograniczoną długość | praktycznie brak |
| zakładka, udostępnienie wyniku | da się | nie da się |
| kiedy | wyszukiwarki, filtry: dane niewrażliwe | logowanie, dane osobowe, pliki, zmiany na serwerze |
- name to nazwa danej po stronie serwera: w PHP odczytasz ją jako
$_POST['imie']. Dane idą jako parynazwa=wartość, a pole bez name nie zostanie wysłane. - id służy przeglądarce: łączy pole z etykietą
<label for="imie">. Kliknięcie etykiety ustawia kursor w polu, a czytnik ekranu wie, jak pole się nazywa. Zwykleidinamemają tę samą wartość. - button wysyła formularz domyślnie. To samo robi
<input type="submit" value="Zapisz">, gdzie napis jest wvalue.
Typy pól input
Domyślny typ to text. Nowsze typy dają gotowe kontrolki (kalendarz, suwak, wybór koloru), sprawdzają dane przy wysyłaniu, a na telefonie otwierają dopasowaną klawiaturę. Wygląd kontrolek różni się między przeglądarkami.
| W arkuszu | HTML |
|---|---|
| pole edycyjne, pole tekstowe | type="text" |
| pole hasła (znaki zamaskowane, ale nie zaszyfrowane) | type="password" |
| e-mail, adres strony, telefon, wyszukiwanie | type="email", "url", "tel", "search" |
| pole numeryczne, liczba od 1 do 10 | type="number" min="1" max="10" (krok: step) |
| suwak | type="range" min="0" max="100" |
| data, godzina | type="date", "time", "datetime-local", "month", "week" |
| kolor, plik | type="color", type="file" accept="image/*" |
| pole ukryte (niewidoczne, ale wysyłane) | type="hidden" name="…" value="…" |
| przycisk wysyłający w postaci obrazu | type="image" src="…" |
Który sposób wysyłania wybierzesz dla formularza logowania i dlaczego?
method="post". Przy GET login i hasło trafiłyby do adresu strony: widoczne na ekranie, zapisane w historii przeglądarki i w logach serwera.
Skrypt PHP dostaje imię, ale nie dostaje e-maila, choć użytkownik go wpisał. Pole to <input type="email" id="email">. Co poprawić?
Dopisać name="email". Wysyłane są tylko pola z nazwą; id nie ma tu znaczenia.
Formularz wyszukiwania wysyła dane metodą GET, użytkownik wpisał „Góry Stołowe”, action="szukaj.php", a pole ma name="q". Jak wygląda adres po wysłaniu?
Mniej więcej szukaj.php?q=G%C3%B3ry+Sto%C5%82owe: spacja zamienia się na +, a polskie litery na kody %.
Czy pole type="password" chroni hasło przed przechwyceniem?
Nie. Maskuje znaki na ekranie, żeby nikt nie podejrzał hasła przez ramię. Przesyłane hasło chroni szyfrowane połączenie (HTTPS) i metoda POST.
Przyciski opcji, listy wyboru i przyciski
Przyciski opcji i pola wyboru
Przyciski opcji (radio) o tym samym name tworzą grupę, w której zaznacza się jeden; wysyłana jest wartość value zaznaczonego. Pola wyboru (checkbox) są niezależne, można zaznaczyć dowolnie wiele. checked zaznacza pole na starcie.
<input type="radio" id="s" name="rozmiar" value="S"> <label for="s">S</label> <input type="radio" id="m" name="rozmiar" value="M" checked> <label for="m">M</label> <input type="checkbox" id="newsletter" name="newsletter"> <label for="newsletter">Chcę dostawać newsletter</label>
Lista rozwijana, podpowiedzi i pole wielowierszowe
selectzoption: lista rozwijana.selectedwybiera opcję na starcie,size="3"pokazuje trzy pozycje naraz,multiplepozwala wybrać kilka (zCtrl).optgroup label="…"grupuje opcje.optionbezvaluewysyła swój tekst.datalist: lista podpowiedzi dla polainput, połączona atrybutemlist. W przeciwieństwie doselectmożna wpisać też własną wartość.textarea: pole wielowierszowe. Rozmiar:rowsicols. Ma znacznik zamykający, a domyślną treść wpisuje się między znaczniki, nie wvalue.fieldsetilegend: grupa powiązanych pól z ramką i tytułem.output: miejsce na wynik obliczenia wykonanego skryptem.
Przyciski
| Zapis | Co robi |
|---|---|
<button type="submit">Wyślij</button> albo <input type="submit" value="Wyślij"> | wysyła formularz |
<button type="reset">Wyczyść</button> albo <input type="reset" value="Wyczyść"> | przywraca wartości początkowe |
<button type="button" onclick="…"> | nic nie wysyła; uruchamia skrypt |
button może zawierać tekst, obraz albo ikonę; input type="submit" tylko tekst. disabled wyłącza przycisk.
type w formularzu działa jak submit: wysyła formularz i strona się przeładowuje, zanim zobaczysz wynik skryptu.W formularzu jest <button>Pokaż mapę</button>, który ma tylko uruchamiać skrypt. Po kliknięciu formularz się wysyła. Dlaczego?
Przycisk nie ma type, a w formularzu domyślnym typem jest submit. Poprawnie: <button type="button">Pokaż mapę</button>.
Czym różni się select od pola z datalist?
select pozwala wybrać tylko jedną z podanych opcji. datalist tylko podpowiada; można wpisać dowolny inny tekst.
Trzy przyciski opcji mają name="n1", name="n2" i name="n3". Co zobaczy użytkownik?
Da się zaznaczyć wszystkie trzy naraz, bo każdy tworzy osobną grupę. Żeby wybór był jednokrotny, wszystkie muszą mieć ten sam name i różne value.
Które pole wybierzesz, żeby użytkownik podał poziom kondycji w skali 1–5 przesuwaniem, bez wpisywania?
<input type="range" min="1" max="5" name="kondycja">. Jeśli liczba ma być widoczna i wpisywana, lepszy jest type="number".
Atrybuty pól i sprawdzanie danych
Atrybuty pól określają wartość początkową, ograniczenia i zachowanie. Wiele z nich przeglądarka sprawdza sama przy próbie wysłania. W podglądzie kliknij „Sprawdź” z pustym albo złym kodem pocztowym, a potem z dobrym, i zobacz, które pola zostały wysłane.
| Atrybut | Działanie |
|---|---|
value | wartość początkowa |
readonly | nie da się edytować, ale wartość jest wysyłana |
disabled | pole wyszarzone, nieaktywne i niewysyłane |
required | pole musi być wypełnione |
placeholder | podpowiedź w pustym polu; znika przy pisaniu i nie zastępuje etykiety |
size, maxlength | widoczna szerokość w znakach, największa liczba znaków |
min, max, step | zakres i krok dla liczb, dat i suwaków |
pattern | wyrażenie regularne, któremu musi odpowiadać wartość; opis formatu daj w title |
multiple | kilka wartości (dla email i file) |
autofocus | kursor w tym polu zaraz po wczytaniu strony |
list | powiązanie z datalist |
Atrybuty form… na polach i przyciskach
form="id-formularza" łączy z formularzem pole leżące poza form. Przycisk wysyłania może mieć własne formaction, formmethod, formtarget i formnovalidate, gdy dwa przyciski mają robić różne rzeczy:
<form id="zgloszenie" action="zapisy.php" method="post"> <input type="email" name="email" required> <button type="submit">Wyślij zgłoszenie</button> <button type="submit" formaction="szkic.php" formnovalidate>Zapisz szkic</button> </form> <input type="text" name="uwagi" form="zgloszenie">
Które pole trafi na serwer: z readonly czy z disabled?
Pole readonly. Obu nie da się edytować, ale disabled wyłącza pole całkowicie i jego wartość nie jest wysyłana.
Napisz pole na numer telefonu, które przyjmie dokładnie 9 cyfr i pokaże opis formatu.
<input type="tel" name="telefon" pattern="[0-9]{9}" title="9 cyfr, bez spacji" required>: pattern sprawdza format, a title pojawia się w komunikacie o błędzie.
Formularz ma przyciski „Wyślij” i „Zapisz szkic”. Szkic ma trafić do szkic.php, nawet gdy wymagane pola są puste. Jakich atrybutów użyjesz na drugim przycisku?
formaction="szkic.php" (inny adres) i formnovalidate (bez sprawdzania pól).
Formularz zapisów na wyjazd
Utwórz podstronę zapisy.html z formularzem zgłoszenia na wyjazd i dodaj ją do menu. Formularz wysyła dane metodą POST do zapisy.php (samego skryptu nie piszesz).
Założenia
- Formularz obsługuje wysyłanie pliku; przeglądarka może podpowiadać wcześniej wpisane wartości.
- Grupa „Dane uczestnika” z tytułem: imię i nazwisko (wymagane, najwyżej 60 znaków, kursor w tym polu po wczytaniu strony), e-mail (wymagany), telefon (9 cyfr, z opisem formatu w komunikacie o błędzie), data urodzenia (nie później niż 31.12.2010), kod pocztowy w formacie 00-000.
- Grupa „Wyjazd”: lista rozwijana z kierunkami w grupach „Góry” (Tatry, Bieszczady, Pieniny) i „Inne” (Mazury, Roztocze), domyślnie Bieszczady; liczba osób od 1 do 4, domyślnie 1; nocleg do wyboru jednokrotnego: schronisko lub namiot; sprzęt do wyboru wielokrotnego: kijki, raki, śpiwór; suwak „Kondycja” od 1 do 5.
- Pole „Kod klubowy” z wartością
SZLAK-26, którego nie da się zmienić, ale które jest wysyłane. - Ukryte pole
zrodloz wartościąstrona. - Pole wielowierszowe „Uwagi” (4 wiersze) z podpowiedzią w pustym polu.
- Pole „Zdjęcie legitymacji” przyjmujące tylko obrazy.
- Wymagane pole zgody „Akceptuję regulamin” z odnośnikiem do regulaminu (PDF w nowej karcie).
- Trzy przyciski: „Wyślij zgłoszenie” (wysyła), „Wyczyść” (przywraca wartości początkowe) i „Zapisz szkic” (wysyła do
szkic.phpbez sprawdzania pól). - Każde pole ma powiązaną etykietę i atrybut
name.
Ocenie podlega
- poprawne atrybuty formularza (adres, metoda, wysyłanie plików),
- przeglądarka blokuje wysłanie przy pustych polach wymaganych i złym formacie telefonu albo kodu,
- nocleg pozwala wybrać jedną opcję, sprzęt kilka,
- kliknięcie tekstu każdej etykiety zaznacza odpowiednie pole,
- kod klubowy nie jest edytowalny, ale trafia na serwer,
- „Zapisz szkic” działa także przy pustych polach wymaganych.
Wskazówki
- Atrybuty
form, POST, wysyłanie plików, typy pól: lekcja „Formularz i pola”. - Grupy pól, lista z grupami opcji, pole wielowierszowe, typy przycisków: lekcja „Wybór i przyciski”.
patternztitle,readonlyidisabled,formactioniformnovalidate: lekcja „Atrybuty pól”.- Wysłanie sprawdzisz bez PHP: tymczasowo zmień metodę na GET i obejrzyj adres po kliknięciu „Wyślij”. Zobaczysz wszystkie pary
nazwa=wartość(pole pliku przy GET przekaże tylko nazwę pliku).
Dźwięk, wideo i ramki
HTML5 odtwarza multimedia bez wtyczek (dawniej potrzebny był np. Flash). Bez atrybutu controls nie ma przycisków i nie da się sterować odtwarzaniem.
<video width="400" controls muted poster="img/plakat.jpg"> <source src="wideo/wyjazd.mp4" type="video/mp4"> <source src="wideo/wyjazd.webm" type="video/webm"> Przeglądarka nie obsługuje wideo </video> <audio controls> <source src="audio/relacja.mp3" type="audio/mpeg"> <source src="audio/relacja.ogg" type="audio/ogg"> Przeglądarka nie obsługuje dźwięku </audio>
| Atrybut | Co robi |
|---|---|
controls | pasek odtwarzania: start, głośność, pasek postępu, pełny ekran |
autoplay | start po wczytaniu; przeglądarki pozwalają na to zwykle tylko z muted |
muted, loop | wyciszenie, odtwarzanie w pętli |
poster="okladka.jpg" | obraz przed startem wideo |
width, height | wymiary odtwarzacza wideo |
Kilka source z różnymi formatami: przeglądarka weźmie pierwszy, który umie odtworzyć. Tekst po ostatnim source pokazuje się tylko w przeglądarce, która nie zna video albo audio. Dźwięk to najczęściej MP3, rzadziej OGG i WAV. Przy jednym pliku wystarczy <audio src="plik.mp3" controls>.
YouTube, mapy i inne strony w ramce
Filmu z YouTube nie wstawia się przez video, bo to nie twój plik, tylko cudza strona z własnym odtwarzaczem. Używa się iframe, ramki z osadzoną stroną. Adres znajdziesz pod filmem: Udostępnij → Umieść. Tak samo osadza się mapę Google albo formularz z innej witryny. title opisuje zawartość ramki dla czytników ekranu.
<iframe width="320" height="180"
src="https://www.youtube.com/embed/…"
title="Film z wyjazdu"
allowfullscreen></iframe>
Wideo się odtwarza, ale użytkownik nie może go zatrzymać ani zmienić głośności. Czego brakuje?
Atrybutu controls na video.
Dlaczego filmu z YouTube nie wstawia się elementem video?
video odtwarza plik wskazany w src, który musi być dostępny wprost. Film z YouTube to cudza strona z własnym odtwarzaczem, więc wstawia się go przez iframe z adresem do umieszczenia.
JavaScript, SVG i canvas
HTML i JavaScript
JavaScript dodaje stronie zachowanie: reakcje na kliknięcia, obliczenia, zmiany treści bez przeładowania. Ten kurs uczy HTML, ale warto wiedzieć, jak oba języki się łączą. Kliknij przyciski w podglądzie.
- Atrybuty zdarzeń, np.
onclick,onchange,onmouseover, uruchamiają kod wpisany wprost w atrybucie. scriptzawiera kod albo przezsrcwskazuje plik.js:<script src="js/skrypt.js"></script>, podobnie jaklinkwskazuje plik CSS.document.getElementById("…")znajduje element poid; dlatego identyfikatory są tak ważne dla skryptów.noscriptpokazuje treść tylko przy wyłączonym JavaScripcie.- Skrypt na końcu
body(albo wheadz atrybutemdefer) nie blokuje wyświetlania strony.
SVG i canvas
svg opisuje rysunek kształtami zapisanymi w kodzie: circle, rect, line, polygon, path, z wypełnieniem fill i obrysem stroke. canvas to pusty prostokąt, na którym rysuje dopiero JavaScript.
| SVG | canvas | |
|---|---|---|
| zapis | elementy w kodzie strony | rysowane skryptem |
| skalowanie | bez utraty ostrości | traci ostrość przy powiększeniu |
| osobne kształty | każdy to element: można go kliknąć i ostylować w CSS | jedna bitmapa, współrzędne liczysz sam |
| typowe użycie | logo, ikony, mapy, diagramy | wykresy danych, gry, edytory obrazu |
Czym różni się <script src="js/skrypt.js"></script> od <link rel="stylesheet" href="css/styl.css">?
Oba dołączają zewnętrzny plik, ale script uruchamia kod JavaScript, a link podłącza arkusz CSS.
Logo klubu ma być ostre na dużym telewizorze i zmieniać kolor po najechaniu kursorem stylem CSS. SVG czy canvas?
SVG: skaluje się bez utraty ostrości, a każdy kształt to element, który można ostylować, także przez :hover.
Cała strona jak na egzaminie
Arkusz opisuje stronę w punktach: najpierw ogólne wymagania (język, kodowanie, tytuł, arkusz stylów), potem bloki po kolei i ich zawartość. Pisz w tej samej kolejności i odhaczaj punkty.
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8">
<title>Wędkowanie</title>
<link rel="stylesheet" href="styl.css">
</head>
<body>
<header>
<h1>Portal dla wędkarzy</h1>
</header>
<section id="lewy">
<!-- zawartość bloku lewego -->
</section>
<section id="prawy">
<!-- zawartość bloku prawego -->
</section>
<footer>
<p>Stronę wykonał: 00000000000</p>
</footer>
</body>
</html>
- Najpierw szkielet z pustymi blokami i komentarzami. Otwórz go w przeglądarce.
- Potem zawartość bloków, jeden po drugim. Treść kopiuj z pliku tekstowego, jeśli arkusz go dołącza.
- Po każdym bloku odśwież stronę (F5) i porównaj z obrazem w arkuszu.
- Na końcu wróć do listy wymagań i sprawdź każde: plik, alt, treść, atrybuty, kolejność.
Wymagania arkusza a znaczniki HTML
Arkusz opisuje stronę słowami. Ta tabela tłumaczy najczęstsze sformułowania na znaczniki.
| W arkuszu | HTML |
|---|---|
| tytuł strony widoczny na karcie przeglądarki | <title> w head |
| język polski, kodowanie UTF-8 | <html lang="pl">, <meta charset="utf-8"> |
| styl w zewnętrznym arkuszu styl.css | <link rel="stylesheet" href="styl.css"> |
| nagłówek pierwszego (drugiego…) stopnia | <h1> (<h2>…) |
| akapit (paragraf) | <p> |
| pogrubienie, pochylenie | <b>/<strong>, <i>/<em> |
| lista numerowana, punktowana (nienumerowana) | <ol>, <ul> z <li> |
| odnośnik do pliku X | <a href="X"> |
| odnośnik otwierany w nowej karcie | target="_blank" |
| obraz X z tekstem alternatywnym Y | <img src="X" alt="Y"> |
| tabela o 3 kolumnach, wiersz nagłówkowy | <table>, <tr>, <th>, <td> |
| komórka scalona z sąsiednią | colspan="2" / rowspan="2" |
| pole edycyjne, pole numeryczne, pole hasła | <input type="text">, type="number", type="password" |
| pole wyboru, przyciski opcji | type="checkbox", type="radio" ze wspólnym name |
| lista rozwijana | <select> z <option> |
| pole tekstowe wielowierszowe | <textarea> |
| przycisk o treści Z | <button>Z</button> albo <input type="submit" value="Z"> |
| formularz wysyłany metodą POST do skryptu X | <form action="X" method="post"> |
| baner, menu, panel, blok główny, stopka | header, nav, aside, main/section, footer albo div |
| blok o identyfikatorze X | id="X" |
| linia pozioma, złamanie wiersza | <hr>, <br> |
| odtwarzacz dźwięku / wideo z przyciskami | <audio controls>, <video controls> |
Częste błędy
- Niezamknięty znacznik albo zamknięcie w złej kolejności. Pomaga równe wcinanie kodu.
- Brak cudzysłowu zamykającego w atrybucie: reszta linii staje się wartością atrybutu.
lipoza listą,trpoza tabelą,tdwprost wtable.- Inna treść niż w arkuszu: literówka, brak polskiej litery, dodatkowe słowo.
- Ścieżka do obrazu z literą dysku albo złym rozszerzeniem.
Dostępność, walidacja i XHTML
Strony odwiedzają też osoby niewidome i słabowidzące, poruszające się tylko klawiaturą albo z wolnym łączem. Dostępność (accessibility, w skrócie a11y) to nie dodatek, tylko skutek poprawnie napisanego HTML.
Lista kontrolna
altprzy każdym obrazie (pustyalt=""dla ozdobnych) ilangwhtml.labelpowiązany z każdym polem formularza przezforiid.- Logiczna hierarchia nagłówków, bez przeskakiwania stopni.
- Znaczniki semantyczne (
nav,main,header,footer) zamiast samychdiv. - Wystarczający kontrast tekstu i tła; jasnoszary tekst na białym tle jest dla wielu osób nieczytelny.
- Stronę da się obsłużyć samą klawiaturą:
Tabprzechodzi między odnośnikami i polami w sensownej kolejności.
Walidacja
Przeglądarki są wyrozumiałe: niezamknięty znacznik czy powtórzony id często niczego widocznie nie psują, ale powodują trudne do znalezienia błędy. Dlatego kod sprawdza walidator W3C (validator.w3.org): wklej kod w zakładce „Validate by Direct Input” albo wgraj plik. Najczęstsze błędy: niezamknięty lub źle zagnieżdżony element, powtórzony id, brak alt, brak lang, literówka w nazwie znacznika. Gdy błędów jest dużo, poprawiaj od góry pliku: jeden niezamknięty element często wywołuje kilka kolejnych. Na egzaminie nie ma internetu, więc ćwicz walidację wcześniej.
Dobre nawyki
- Spójne wcięcia (2 spacje na poziom): od razu widać, co jest w czym.
- Małe litery w znacznikach i atrybutach, wartości w cudzysłowach.
- Nazwy plików małymi literami, bez spacji i polskich znaków (
galeria-zdjec.html, nieGaleria Zdjęć.html). - Przed oddaniem pracy usuń zakomentowane fragmenty i puste elementy.
HTML a XHTML
XHTML to HTML zapisany według ścisłych reguł XML. Warto go znać, żeby rozpoznać starszy kod.
| Reguła | HTML5 | XHTML |
|---|---|---|
| wielkość liter w znacznikach | bez znaczenia | wymagane małe litery |
| elementy puste | <br> wystarczy | wymagany ukośnik: <br /> |
| znaczniki zamykające | czasem można pominąć | zawsze obowiązkowe |
| cudzysłowy w atrybutach | zalecane | obowiązkowe |
| atrybuty logiczne | disabled | disabled="disabled" |
Pisz od razu według reguł XHTML (małe litery, domknięte elementy, cudzysłowy): to przenośny styl, który działa wszędzie.
Walidator zgłasza „Duplicate ID: menu”. Co to znaczy i jak to naprawić?
id="menu" występuje na stronie więcej niż raz. Jeśli kilka elementów ma wyglądać tak samo, zamień id="menu" na class="menu", a w CSS #menu na .menu.
Formularz nie ma etykiet label, tylko atrybuty placeholder. Dlaczego to problem?
placeholder znika po rozpoczęciu pisania, więc użytkownik przestaje widzieć, czego dotyczy pole. Część czytników ekranu nie odczytuje go jako etykiety, a kliknięcie w podpowiedź nie zaznacza pola.
Który zapis jest poprawny w HTML5, a który także w XHTML: <BR>, <br>, <br />?
W HTML5 wszystkie trzy. W XHTML tylko <br />: małe litery i obowiązkowy ukośnik przy elemencie pustym.
Projekt końcowy: witryna klubu turystycznego
Dopracuj całą witrynę „Szlak” tak, żeby przechodziła walidację, była dostępna i miała spójny, czytelny kod.
Założenia
- Co najmniej pięć podstron z poprzednich zadań (
index.html,relacja.html,galeria.html,wyjazdy.html,zapisy.html) połączonych jednym menu wnavna każdej z nich. - Każda podstrona ma w
headtytuł opisujący jej zawartość (na każdej inny) i opis meta. - Na stronie głównej część z filmem z wyjazdu (własny plik albo osadzony z YouTube) i proste logo SVG narysowane wprost w kodzie.
- Wszystkie obrazy mają sensowny
alt, wszystkie pola formularza powiązane etykiety, ahtmlmalang="pl". - Żaden identyfikator nie powtarza się na stronie; hierarchia nagłówków na każdej podstronie jest logiczna.
- Witryna działa na ekranie szerokości 375 px (tryb urządzenia): bez poziomego przewijania, menu i kolumny jedna pod drugą.
- Kod każdej podstrony przechodzi walidator W3C bez błędów.
- Spójne wcięcia, małe litery w znacznikach, bez zakomentowanych fragmentów i zbędnych elementów.
Ocenie podlega
- wynik walidatora dla każdej podstrony,
- działające menu i odnośniki między podstronami,
- zachowanie na wąskim ekranie,
- zgodność z listą kontrolną dostępności,
- czytelność i spójność kodu.
404.html z odnośnikiem do strony głównej i sprawdź w dokumentacji serwera albo zapytaj nauczyciela, jak się ją podłącza.Wskazówki
- Lista kontrolna i walidacja: lekcja „Dostępność i walidacja”.
- Wideo: lekcja „Dźwięk i wideo”; SVG: lekcja „JavaScript, SVG i canvas”.
- Viewport, media queries, skalowanie obrazów: lekcja „Strona responsywna”.
Quiz
Pytania w stylu części pisemnej egzaminu. Po kliknięciu odpowiedzi zobaczysz wyjaśnienie.
Ściąga
Szkielet
<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Tytuł</title> <link rel="stylesheet" href="styl.css"> </head> <body> … </body> </html>
Tekst
h1–h6, p, br, hr, pre | nagłówki, akapit, złamanie wiersza, linia, tekst sformatowany |
strong/b, em/i, u, mark, small | wyróżnienia |
sub, sup, del, ins | indeksy, zmiany |
blockquote cite, q, abbr title, cite, address | cytaty, skrót, tytuł dzieła, kontakt |
code, kbd, samp, var | kod, klawisz, wynik programu, zmienna |
< > & © ° | < > & twarda spacja © ° |
<!-- … --> | komentarz (widoczny w źródle) |
Atrybuty i kolory
| globalne | id, class, style, title, lang, hidden |
| kolor | Tomato, #FF6347, rgb(255, 99, 71), hsl(9, 100%, 64%), rgba(…, 0.4) |
| CSS | style="…", <style> w head, <link rel="stylesheet" href="…"> |
Odnośniki, ścieżki, obrazy
<a href="plik.html" target="_blank"> | #id, strona.html#id, mailto:, tel:, download |
| ścieżki | plik, folder/plik, ../plik; bez / na początku i bez litery dysku |
<img src="a.jpg" alt="opis" width="300"> | figure + figcaption; obraz w a; alt="" dla ozdobnych |
<img usemap="#m"> + <map name="m"><area shape coords href alt> | rect x1,y1,x2,y2 · circle x,y,r · poly |
<audio src controls>, <video width controls><source src type>, <iframe src title> | autoplay, muted, loop, poster |
Listy i tabele
ul, ol type="A" start="3" reversed, li, dl/dt/dd | podlista wewnątrz li |
table › caption, colgroup, thead/tbody/tfoot › tr › th scope/td | kolumny wynikają z liczby komórek |
colspan="2", rowspan="2" | usuń komórkę, którą zajmuje scalona |
Formularze
<form action="x.php" method="post"> | get: dane w adresie, post: w treści; pliki: enctype="multipart/form-data" |
<label for="id"> + <input id="id" name="id"> | name to nazwa danej, id łączy z etykietą |
type: text, password, email, tel, number, range, date, color, file, checkbox, radio, hidden, submit, reset | value, placeholder, required, checked, min, max, step, pattern, maxlength, readonly (wysyłane), disabled (niewysyłane) |
select + optgroup + option selected, datalist, textarea rows cols, fieldset + legend | lista, podpowiedzi, pole wielowierszowe, grupa pól |
<button type="submit|reset|button"> | bez type w formularzu działa jak submit |
Bloki
header · nav · main · section · article · aside · footer · figure · details/summary · time · div (blok bez znaczenia) · span (fragment w wierszu) · id jeden na stronie, class wiele, kilka klas po spacji · viewport w head.