Przejdź do głównej treści
INF.03-02-25.01-SGStyczeń 2025 · 52 kroki · ok. 97 min · 40 kryteriów z klucza

Rozwiązanie krok po kroku: Strona firmy montażu paneli (Wersja podstawowa)

Rozwiązanie buduje stronę firmy montującej panele podłogowe: baza przewozy z osobami i zadaniami (baza i strona dotyczą w tym arkuszu różnych tematów - to dwie niezależne części) i cztery zapytania - wzorzec LIKE, wzorzec z sortowaniem, grupowanie GROUP BY z licznikiem i aliasem oraz usunięcie kolumny ALTER TABLE, potem grafika z napisem na przezroczystym tle i trzy zdjęcia paneli przeskalowane do 500 × 70 px, trzy strony HTML - index.html z rodzajami paneli, oferta.html z tabelą o scalonych komórkach i koszty.html z kalkulatorem - i style w style.css, z gradientami w nagłówku i stopce. PHP tu nie ma: skrypt działa w przeglądarce, w JavaScripcie - mnoży szerokość przez długość, dobiera stawkę do zaznaczonego rodzaju panelu i sprawdza, czy pola są wypełnione.

Kroki idą zdanie po zdaniu za treścią arkusza - przy każdym jest polecenie z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Skrypt jest najpierw pisany najprościej, z atrybutem onclick, warunkami if i innerHTML, a na końcu zostaje przerobiony na wersję z prawdziwych projektów: słuchacz zdarzenia, stawki w obiekcie zamiast drabinki warunków, sprawdzenie liczb i textContent.

To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, osobny skrypt)” jest drugi sposób rozwiązania tego samego arkusza: kolory w zmiennych CSS, kalkulator ułożony siatką CSS zamiast <br>, stawki w obiekcie zamiast drabinki if i skrypt w osobnym pliku z nasłuchiwaczem zdarzenia i sprawdzeniem danych od pierwszej linii - obie wersje są zgodne z kluczem.

Baza i zdjęcia pochodzą z prawdziwego archiwum pliki12 (załącznik do arkusza, hasło w treści zadania). Zrzuty wyników zapytań są odtworzone z tej bazy - na egzaminie robisz je sam, z całego ekranu. Kalkulator w podglądzie działa naprawdę - wpisz wymiary, zaznacz rodzaj panelu i kliknij „Oblicz”.

Jak liczą się punkty. Klucz ma 40 kryteriów (R.1.1 - R.5.9), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 30 punktów - można stracić 10 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.

  1. Etap 1: Baza danych

    Kroki 1-7 · po tym etapie masz 6 z 40 kryteriów (pkt)

    Krok 1: Baza danych przewozy

    Kryteria:

    R.1.1 Wykonany import tabel do bazy danych przewozy, co jest udokumentowane w pliku import.png

    ok. 2 min
    Polecenie z arkusza

    Utwórz bazę danych o nazwie przewozy, z zestawem polskich znaków (np. utf8_unicode_ci).

    Rozpakuj pliki12.7z z pulpitu (hasło P@neLePodLoGowe!+, ze znakami na końcu) do folderu z numerem zdającego: baza.sql i trzy zdjęcia paneli. W phpMyAdmin: Nowa, nazwa przewozy, porównywanie z polskimi znakami, np. utf8_unicode_ci albo utf8mb4_polish_ci.

  2. Krok 2: Import tabel z pliku baza.sql

    Kryteria:

    R.1.1 Wykonany import tabel do bazy danych przewozy, co jest udokumentowane w pliku import.png

    ok. 2 min
    Polecenie z arkusza

    Do utworzonej bazy zaimportuj tabele z pliku baza.sql z rozpakowanego archiwum.

    Wybierz bazę przewozy w lewym drzewie, potem Import → baza.sql → Wykonaj. Powstają dwie tabele z ilustracji 1: osoby (6 osób z imieniem, nazwiskiem i telefonem) i zadania (7 zadań z datą). Relacja 1..n: zadania.osoba_id → osoby.id_osoba - jedna osoba może mieć wiele zadań.

  3. Krok 3: Zrzut ekranu import.png

    Kryteria:

    R.1.1 Wykonany import tabel do bazy danych przewozy, co jest udokumentowane w pliku import.png

    ok. 2 min
    Polecenie z arkusza

    Wykonaj zrzut ekranu po imporcie. Zapisz zrzut w formacie PNG pod nazwą import. Nie kadruj zrzutu. Powinien on obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel.

    Print Screen i zapis jako import.png - tu wszystkie zrzuty są w PNG. Na zrzucie widać komunikat o udanym imporcie i dwie tabele w drzewie bazy.

    Typowe błędy

    Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).

  4. Krok 4: Zapytanie 1: osoby z imieniem na literę A

    Kryteria: ,

    R.1.2 Zapisany plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania

    R.1.3 Wykonane zapytanie 1 wybierające jedynie imiona i nazwiska osób, których imiona rozpoczynają się od litery A. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%"; oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 2 wiersze z danymi Anna A. oraz Arkadiusz G.

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 1: wybierające jedynie imiona i nazwiska osób, których imiona rozpoczynają się od litery A.

    • SELECT imie, nazwisko - „jedynie imiona i nazwiska”,
    • FROM osoby,
    • WHERE imie LIKE "A%" - LIKE porównuje ze wzorcem: A na początku, a % zastępuje dowolny ciąg znaków (także pusty). „Rozpoczynają się od A” to właśnie A%.

    Wynik: Anna A. i Arkadiusz G. - dwa wiersze, jak w kluczu. Zapytanie zapisujesz w kwerendy.txt, zrzut jako kw1.png.

    Typowe błędy

    WHERE imie = "A%" szuka imienia dosłownie „A%” - znak % działa jako wzorzec tylko z LIKE.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";
    Podgląd strony po tym kroku
    Podgląd strony po kroku 4
  5. Krok 5: Zapytanie 2: zadania z meblami według daty

    Kryteria:

    R.1.4 Wykonane zapytanie 2 wybierające jedynie nazwy zadań (pole zadanie ) i daty, w których nazwie zadania zawiera się słowo „mebli”, posortowane rosnąco według daty. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data; (opcjonalnie ASC ) oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 2 rekordy z datami 2019-11-06 i 2021-01-26

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 2: wybierające jedynie nazwy zadań (pole zadanie) i daty, w których w nazwie zadania zawiera się słowo „mebli”, posortowane rosnąco według daty.

    • SELECT zadanie, data FROM zadania,
    • WHERE zadanie LIKE "%mebli%" - „zawiera się”: % z obu stron, więc słowo może stać w dowolnym miejscu,
    • ORDER BY data - sortowanie rosnące jest domyślne, ASC można dopisać.

    Wynik: dwa przewozy mebli, z datami 2019-11-06 i 2021-01-26 - jak w kluczu. Zrzut: kw2.png.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";
    
    -- Zapytanie 2
    SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 5
  6. Krok 6: Zapytanie 3: liczba zadań każdej osoby

    Kryteria:

    R.1.5 Wykonane zapytanie 3 wybierające jedynie pogrupowane nazwiska osób i odpowiadającą im liczbę zadań. Kolumna z liczbą zadań jest nazwana „Liczba zadań” (alias). W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT nazwisko, COUNT(zadania.id_zadania) AS "Liczba zadań" FROM osoby JOIN zadania ON id_osoba = osoba_id GROUP BY nazwisko; (możliwe również LEFTJOIN oraz porównanie kluczy po WHERE ) oraz wynik działania udokumentowany zrzutem, na którym są widoczne dokładnie 4 rekordy z danymi: A. 2; G. 2; K. 1; W. 2 lub 6 rekordów A. 2; C. 0; G. 2; K. 1; L. 0; W. 2

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 3: wybierające jedynie pogrupowane nazwiska osób i odpowiadającą im liczbę zadań. Kolumnie z liczbą zadań należy nadać nazwę (alias) „Liczba zadań”. Należy posłużyć się relacją.

    • FROM osoby JOIN zadania ON id_osoba = osoba_id - relacja: każde zadanie łączysz z osobą, która je wykonuje,
    • GROUP BY nazwisko - wiersze z tym samym nazwiskiem zwijają się w jeden,
    • COUNT(zadania.id_zadania) - w każdej grupie liczy, ile było zadań,
    • AS "Liczba zadań" - alias ze spacją i polską literą, więc w cudzysłowie.

    Wynik: A. 2, G. 2, K. 1, W. 2 - cztery wiersze, jak w kluczu. Osoby bez zadań (C. i L.) przy zwykłym JOIN nie pojawiają się; z LEFT JOIN byłyby z liczbą 0 - klucz uznaje obie wersje. Zrzut: kw3.png.

    Typowe błędy

    COUNT(*) z LEFT JOIN liczy też wiersz osoby bez zadań - C. i L. dostałyby 1 zamiast 0. Przy LEFT JOIN licz kolumnę z tabeli zadania.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";
    
    -- Zapytanie 2
    SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data;
    
    -- Zapytanie 3
    SELECT nazwisko, COUNT(zadania.id_zadania) AS "Liczba zadań" FROM osoby JOIN zadania ON id_osoba = osoba_id GROUP BY nazwisko;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 6
  7. Krok 7: Zapytanie 4: usunięcie kolumny telefon

    Kryteria:

    R.1.6 Wykonane zapytanie 4 usuwające kolumnę telefon z tabeli osoby . W pliku z kwerendami lub na zrzucie istnieje zapis np. ALTER TABLE osoby DROP COLUMN telefon; oraz wynik działania udokumentowany zrzutem, na którym jest widoczny komunikat o poprawnie wykonanym zapytaniu lub tabela osoby bez kolumny telefon

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 4: usuwające kolumnę telefon z tabeli osoby.

    Zmiana budowy tabeli to ALTER TABLE, a usunięcie kolumny - DROP COLUMN z jej nazwą. Kolumna znika razem z danymi wszystkich wierszy, bez pytania o potwierdzenie. Na zrzucie kw4.png wystarczy komunikat o poprawnym wykonaniu albo podgląd tabeli osoby z trzema kolumnami.

    Typowe błędy

    DELETE telefon FROM osoby nie działa - DELETE usuwa wiersze, nie kolumny. Kolumny zmienia się tylko przez ALTER TABLE.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";
    
    -- Zapytanie 2
    SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data;
    
    -- Zapytanie 3
    SELECT nazwisko, COUNT(zadania.id_zadania) AS "Liczba zadań" FROM osoby JOIN zadania ON id_osoba = osoba_id GROUP BY nazwisko;
    
    -- Zapytanie 4
    ALTER TABLE osoby DROP COLUMN telefon;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 7
  8. Etap 2: Grafika i strony HTML

    Kroki 8-32 · po tym etapie masz 20 z 40 kryteriów (pkt)

    Krok 8: Kolor napisu pobrany z laminowane.png

    Kryteria:

    R.2.2 Na grafice znajduje się napis "Montaż paneli podłogowych" zapisany czcionką bezszeryfową o dowolnym odcieniu koloru brązowego

    ok. 3 min
    Polecenie z arkusza

    Kolor wypełnienia liter obrazu otrzymany z grafiki laminowane.png. Czynność tą udokumentuj zrzutem ekranu o nazwie kolor.png.

    Otwórz laminowane.png w GIMP-ie i narzędziem Pipeta (klawisz O) kliknij w brązowe pole deski - pobrany kolor staje się kolorem pierwszoplanowym. Tu wyszedł #a26f3a. Teraz Print Screen z widocznym obrazem i oknem koloru i zapis jako kolor.png. Klucz uzna dowolny odcień brązu (R.2.2).

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Grafika montaz_paneli.png

    Kryteria: ,

    R.2.1 Grafika z pliku montaz_paneli.png ma wymiary dokładnie: szerokość 400 px i wysokość 50 px oraz przezroczyste tło

    R.2.2 Na grafice znajduje się napis "Montaż paneli podłogowych" zapisany czcionką bezszeryfową o dowolnym odcieniu koloru brązowego

    ok. 4 min
    Polecenie z arkusza

    Przygotowanie grafiki o nazwie montaz_paneli.png: szerokość obrazu 400 px, wysokość 50 px, tło przezroczyste, napis "Montaż paneli podłogowych", pogrubioną czcionką bezszeryfową (sans-serif), w rozmiarze 27.

    Plik → Nowy: 400 × 50 px, w opcjach zaawansowanych Wypełnienie: Przezroczystość. Narzędzie Tekst: czcionka bezszeryfowa pogrubiona, np. Arial Bold albo Sans-serif Bold, rozmiar 27 px, kolor - ten pobrany pipetą. Wpisz napis i wyrównaj go do środka obrazu. Eksportuj jako montaz_paneli.png - format PNG zachowuje przezroczystość, JPEG by ją zamienił na biel (R.2.1, R.2.2).

    Typowe błędy

    Nowy obraz z domyślnym białym wypełnieniem nie ma przezroczystego tła - na stronie z gradientem widać biały prostokąt, a kryterium R.2.1 nie jest spełnione.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 9
  10. Krok 10: Trzy zdjęcia paneli: dokładnie 500 × 70 px

    Kryteria:

    R.2.3 Grafiki laminowane.png , winylowe.png, deska.png mają wymiary dokładnie: szerokość 500 px i wysokość 70 px

    ok. 4 min
    Polecenie z arkusza

    Przygotowanie grafik laminowane.png, winylowe.png, deska.png: Obrazy należy przeskalować dokładnie do szerokości 500 px i wysokości 70 px.

    Każde zdjęcie ma 480 × 300 px. Obraz → Skaluj obraz, rozpinasz łańcuch proporcji i wpisujesz 500 i 70 - zdjęcie się spłaszczy, ale arkusz wymaga dokładnie tych wymiarów. Eksportuj jako pod tą samą nazwą. Trzy razy, dla każdego pliku (R.2.3).

    Typowe błędy

    Przy zamkniętym łańcuchu po wpisaniu szerokości 500 GIMP sam wylicza wysokość 313 - obraz ma złe wymiary i kryterium R.2.3 przepada.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 10
  11. Krok 11: Plik index.html w HTML5

    Kryteria:

    R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body

    ok. 2 min
    Polecenie z arkusza

    Cechy witryny: Składa się z podstron o nazwach index.html, oferta.html i koszty.html. Cechy wspólne dla stron: Zapisane w języku HTML5.

    Zbuduj całą stronę index.html, a oferta.html i koszty.html powstaną z jej kopii - różnią się tylko blokiem głównym.

    index.html HTML nowy plik
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  12. Krok 12: Język strony

    Kryteria:

    R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body

    ok. 1 min
    Polecenie z arkusza

    Zadeklarowany polski język zawartości witryny.

    Atrybut lang="pl" w znaczniku <html>.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  13. Krok 13: Kodowanie polskich znaków

    Kryteria:

    R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body

    ok. 1 min
    Polecenie z arkusza

    Jawnie zastosowany właściwy standard kodowania polskich znaków.

    <meta charset="UTF-8"> jako pierwszy element <head>.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  14. Krok 14: Tytuł strony

    Kryteria:

    R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body

    ok. 1 min
    Polecenie z arkusza

    Tytuł strony widoczny na karcie przeglądarki: „Montaż paneli podłogowych”.

    <title> w <head> - napis na karcie przeglądarki.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  15. Krok 15: Podpięcie arkusza stylów

    Kryteria:

    R.3.5 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie style.css formatowanie CSS pochodzi jedynie z tego arkusza. Uwaga: kryterium to nie jest spełnione również, gdy zdający źle przypisał co najmniej jeden selektor do bloku (np. kropka zamiast #)

    ok. 1 min
    Polecenie z arkusza

    Arkusz stylów w pliku o nazwie style.css prawidłowo połączony z kodem strony.

    Nazwa w tym arkuszu: style.css, z „e” na końcu.

    Typowe błędy

    styl.css zamiast style.css odcina wszystkie style - kryterium R.3.5, a rezultat R.4 jest wtedy oceniany tylko z kodu.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  16. Krok 16: Bloki: nagłówek, menu, blok główny, stopka

    Kryteria:

    R.2.5 Zdefiniowany układ strony dzielący ją na bloki: nagłówkowy, menu, główny i stopki przy pomocy semantycznych znaczników sekcji języka HTML5 zgodnie z ich znaczeniem, w tym do części nagłówkowej - header, do stopki - footer. Dopuszcza się dodatkowe użycie bloków div lub section

    ok. 2 min
    Polecenie z arkusza

    Podział strony na bloki: nagłówkowy, poniżej menu, poniżej główny, na dole stopka. Podział zrealizowany za pomocą semantycznych znaczników sekcji języka HTML5 tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z ilustracją 3.

    <header> - nagłówek strony, <nav> - menu, <main> - treść główna, <footer> - stopka. Klucz wymaga znaczników semantycznych, w tym wprost header i footer (R.2.5). Bloki stoją jeden pod drugim bez żadnego pozycjonowania.

    index.html HTML zmienione: 8 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
        </header>
        <nav>
        </nav>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  17. Krok 17: Nagłówek: grafika z napisem

    Kryteria:

    R.2.7 W bloku nagłówkowym umieszczony obraz z pliku montaz_paneli.png z tekstem alternatywnym "firma usługowa"

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku nagłówkowego: obraz montaz_paneli.png z tekstem alternatywnym "firma usługowa".

    <img> z tekstem alternatywnym z arkusza (R.2.7). Przezroczyste tło grafiki pokaże gradient nagłówka, gdy dodasz style.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
        </nav>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  18. Krok 18: Menu: trzy odnośniki

    Kryteria:

    R.3.2 Wybranie odnośnika "Strona Główna" otwiera stronę index.html , "Oferta" - oferta.html , "Kalkulator kosztów" - koszty.html

    ok. 2 min
    Polecenie z arkusza

    Zawartość Menu: Odnośnik "Strona Główna" prowadzący do strony index.html. Odnośnik "Oferta" prowadzący do strony oferta.html. Odnośnik "Kalkulator kosztów" prowadzący do strony koszty.html.

    Trzy znaczniki <a> ze ścieżkami względnymi - same nazwy plików z tego samego folderu (R.3.2). W podglądzie kliknięcia są zablokowane.

    index.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  19. Krok 19: Stopka

    Kryteria:

    R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym

    ok. 1 min
    Polecenie z arkusza

    Zawartość stopki: nagłówek piątego stopnia o treści "Autor strony: ", dalej wstawiony numer zdającego.

    Tym razem nie akapit, lecz nagłówek <h5>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL) - tutaj stoi imię i nazwisko autora rozwiązania.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  20. Krok 20: Blok główny: nagłówek pierwszego stopnia

    Kryteria:

    R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku głównego strony index.html: Nagłówek pierwszego stopnia o treści "Panele podłogowe".

    <h1> w bloku <main>.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Panele podłogowe</h1>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  21. Krok 21: Panele laminowane: obraz i akapit

    Kryteria: ,

    R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym

    R.2.8 W bloku głównym strony głównej umieszczone 3 obrazy z plików laminowane.png , winylowe.png i deska.png , każdy z nich zawiera tekst alternatywny

    ok. 1 min
    Polecenie z arkusza

    Obraz laminowane.png, z tekstem alternatywnym „Laminowane”. Akapit o treści "Panele laminowane".

    Obraz i pod nim akapit <p> z podpisem.

    index.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Panele podłogowe</h1>
            <img src="laminowane.png" alt="Laminowane">
            <p>Panele laminowane</p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  22. Krok 22: Panele winylowe: obraz i akapit

    Kryteria:

    R.2.8 W bloku głównym strony głównej umieszczone 3 obrazy z plików laminowane.png , winylowe.png i deska.png , każdy z nich zawiera tekst alternatywny

    ok. 1 min
    Polecenie z arkusza

    Obraz winylowe.png, z tekstem alternatywnym „Winylowe”. Akapit o treści "Panele winylowe".

    Ta sama para dla drugiego rodzaju paneli.

    index.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Panele podłogowe</h1>
            <img src="laminowane.png" alt="Laminowane">
            <p>Panele laminowane</p>
            <img src="winylowe.png" alt="Winylowe">
            <p>Panele winylowe</p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  23. Krok 23: Deska podłogowa: obraz i akapit

    Kryteria: ,

    R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym

    R.2.8 W bloku głównym strony głównej umieszczone 3 obrazy z plików laminowane.png , winylowe.png i deska.png , każdy z nich zawiera tekst alternatywny

    ok. 1 min
    Polecenie z arkusza

    Obraz deska.png, z tekstem alternatywnym „Deska”. Akapit o treści "Deska podłogowa".

    Trzecia para. Klucz sprawdza trzy obrazy z tekstami alternatywnymi i trzy akapity w bloku głównym (R.2.6, R.2.8).

    index.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Panele podłogowe</h1>
            <img src="laminowane.png" alt="Laminowane">
            <p>Panele laminowane</p>
            <img src="winylowe.png" alt="Winylowe">
            <p>Panele winylowe</p>
            <img src="deska.png" alt="Deska">
            <p>Deska podłogowa</p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  24. Krok 24: Strona oferta.html

    Kryteria:

    R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym

    ok. 2 min
    Polecenie z arkusza

    Zawartość bloku głównego strony oferta.html: Nagłówek pierwszego stopnia o treści "Koszt montażu paneli podłogowych".

    Zapisz index.html jako oferta.html - nagłówek, menu i stopka zostają - i w <main> zostaw tylko nowy <h1>.

    oferta.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Koszt montażu paneli podłogowych</h1>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (oferta.html)
  25. Krok 25: Tabela: dwa wiersze nagłówka ze scalonymi komórkami

    Kryteria:

    R.2.9 W bloku głównym strony z ofertą umieszczona tabela o 4 kolumnach i 5 wierszach, zastosowane znaczniki <table>, <tr>, <td> oraz układ tabeli jest zgodny z ilustracją 4 arkusza egzaminacyjnego, zastosowane atrybuty rowspan i colspan

    ok. 4 min
    Polecenie z arkusza

    Tabela o 4 kolumnach i 5 wierszach, z czego niektóre wiersze / kolumny są scalone. Treść i wygląd tabeli przedstawiony jest na ilustracji 4.

    Na ilustracji 4 nagłówek tabeli zajmuje dwa wiersze:

    • „Rodzaj paneli” i „Koszt montażu” sięgają przez oba wiersze - rowspan="2" scala komórki w pionie,
    • „Rozmiar” zajmuje dwie kolumny - colspan="2" scala w poziomie,
    • drugi wiersz ma więc tylko dwie komórki: „Szerokość” i „Długość” - pozostałe miejsca zajmują już komórki scalone z pierwszego wiersza.

    Na ilustracji napisy nie są pogrubione, więc to zwykłe komórki <td> (R.2.9).

    Typowe błędy

    Dopisanie w drugim wierszu czterech komórek, mimo scalenia, wypycha tabelę o kolumnę w prawo - komórka scalona rowspan już zajmuje swoje miejsce w wierszu poniżej.

    oferta.html HTML zmienione: 11 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Koszt montażu paneli podłogowych</h1>
            <table>
                <tr>
                    <td rowspan="2">Rodzaj paneli</td>
                    <td colspan="2">Rozmiar</td>
                    <td rowspan="2">Koszt montażu</td>
                </tr>
                <tr>
                    <td>Szerokość</td>
                    <td>Długość</td>
                </tr>
            </table>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (oferta.html)
  26. Krok 26: Tabela: trzy wiersze z danymi

    Kryteria:

    R.2.9 W bloku głównym strony z ofertą umieszczona tabela o 4 kolumnach i 5 wierszach, zastosowane znaczniki <table>, <tr>, <td> oraz układ tabeli jest zgodny z ilustracją 4 arkusza egzaminacyjnego, zastosowane atrybuty rowspan i colspan

    ok. 3 min
    Polecenie z arkusza

    Treść i wygląd tabeli przedstawiony jest na ilustracji 4.

    Trzy zwykłe wiersze po cztery komórki, z danymi z ilustracji 4. Razem 5 wierszy i 4 kolumny - jak w arkuszu (R.2.9). Ostatnia kolumna to stawki za m², których użyje skrypt: 12, 14 i 18 zł.

    oferta.html HTML zmienione: 18 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Koszt montażu paneli podłogowych</h1>
            <table>
                <tr>
                    <td rowspan="2">Rodzaj paneli</td>
                    <td colspan="2">Rozmiar</td>
                    <td rowspan="2">Koszt montażu</td>
                </tr>
                <tr>
                    <td>Szerokość</td>
                    <td>Długość</td>
                </tr>
                <tr>
                    <td>Laminowane</td>
                    <td>30</td>
                    <td>200</td>
                    <td>12</td>
                </tr>
                <tr>
                    <td>Winylowe</td>
                    <td>20</td>
                    <td>200</td>
                    <td>14</td>
                </tr>
                <tr>
                    <td>Deska</td>
                    <td>10</td>
                    <td>100</td>
                    <td>18</td>
                </tr>
            </table>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (oferta.html)
  27. Krok 27: Strona koszty.html

    Kryteria:

    R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku głównego strony koszty.html: Nagłówek pierwszego stopnia o treści "Kalkulator kosztów montażu".

    Trzecia kopia, koszty.html, z nowym <h1> w bloku głównym.

    koszty.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  28. Krok 28: Dwa pola liczbowe obok siebie

    Kryteria: ,

    R.2.10 W bloku głównym strony z kosztami umieszczone dwa pola edycyjne, trzy pola opcji i przycisk "Oblicz". Przynajmniej z jednym polem powiązana etykieta <label>

    R.3.4 Na stronie koszty pola edycyjne są typu number, a pola opcji typu radio. W jednym momencie może być zaznaczona tylko jedna opcja (np. mają ustawioną tę samą wartość atrybutu name )

    ok. 2 min
    Polecenie z arkusza

    Obok siebie dwa pola edycyjne typu numerycznego poprzedzone etykietami: „Szerokość pomieszczenia [m]: ", "Długość pomieszczenia [m]: ".

    Etykieta <label for> i pole <input type="number"> - dwa razy. Etykiety i pola są elementami liniowymi, więc bez <br> stoją obok siebie w jednym wierszu, jak na ilustracji 5 (R.2.10, R.3.4). Identyfikatory po angielsku: width i length.

    koszty.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  29. Krok 29: Akapit „Typ panelu”

    ok. 1 min
    Polecenie z arkusza

    Paragraf o treści "Typ panelu".

    Akapit <p> - jako element blokowy zaczyna nowy wiersz pod polami.

    koszty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  30. Krok 30: Trzy pola opcji w jednej grupie

    Kryteria: ,

    R.2.10 W bloku głównym strony z kosztami umieszczone dwa pola edycyjne, trzy pola opcji i przycisk "Oblicz". Przynajmniej z jednym polem powiązana etykieta <label>

    R.3.4 Na stronie koszty pola edycyjne są typu number, a pola opcji typu radio. W jednym momencie może być zaznaczona tylko jedna opcja (np. mają ustawioną tę samą wartość atrybutu name )

    ok. 3 min
    Polecenie z arkusza

    Jedno pod drugim trzy pola opcji z etykietami o treści: "Panele laminowane", "Panele winylowe", "Deska podłogowa". Pola są zgrupowane tak, że w jednym momencie można zaznaczyć tylko jedno pole.

    Pole opcji to <input type="radio">. Grupę tworzy wspólna wartość atrybutu name: wszystkie trzy mają name="panel", więc zaznaczenie jednego odznacza pozostałe (R.3.4). Każde ma własne id - po nim skrypt sprawdzi, które jest zaznaczone. <br> układa je jedno pod drugim. Kliknij kolejne opcje w podglądzie.

    Typowe błędy

    Różne wartości name (albo brak name) robią z pól trzy niezależne przełączniki - da się zaznaczyć wszystkie naraz i kryterium R.3.4 przepada.

    koszty.html HTML zmienione: 6 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  31. Krok 31: Przycisk „Oblicz”

    Kryteria: ,

    R.2.10 W bloku głównym strony z kosztami umieszczone dwa pola edycyjne, trzy pola opcji i przycisk "Oblicz". Przynajmniej z jednym polem powiązana etykieta <label>

    R.3.3 Na stronie koszty zdefiniowane dla przycisku zdarzenie związane z jego wciśnięciem, uruchamiające funkcję skryptu (obsługa zdarzenia zdefiniowana w HTML np. onClick lub w skrypcie np.addEventListener zmienna.onClick = …)

    ok. 1 min
    Polecenie z arkusza

    Poniżej przycisk o treści "Oblicz", którego wybranie uruchamia skrypt.

    <button> z onclick="calculate()" - kliknięcie wywoła funkcję JavaScript, którą napiszesz w części o skrypcie (R.3.3). Na razie kliknięcie kończy się błędem w konsoli - funkcji jeszcze nie ma.

    koszty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  32. Krok 32: Pusty akapit na wynik

    ok. 1 min
    Polecenie z arkusza

    Pusty paragraf, przeznaczony do wyświetlenia wyników działania skryptu.

    Pusty <p id="result"> pod przyciskiem - tu skrypt wpisze wynik albo komunikat o błędzie.

    koszty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  33. Etap 3: Styl CSS

    Kroki 33-44 · po tym etapie masz 31 z 40 kryteriów (pkt)

    Krok 33: Plik style.css: krój czcionki

    Kryteria:

    R.4.1 Ustawiony styl domyślny dla wszystkich selektorów (*): krój czcionki Georgia

    ok. 1 min
    Polecenie z arkusza

    Domyślnie, dla wszystkich selektorów: krój czcionki Georgia.

    Utwórz style.css. Selektor * obejmuje wszystkie elementy (R.4.1). Georgia to czcionka szeryfowa - stąd ozdobne litery na ilustracji 3.

    style.css CSS nowy plik
    * {
        font-family: Georgia;
    }
    Podgląd strony po tym kroku (index.html)
  34. Krok 34: Tekst wyśrodkowany

    Kryteria:

    R.4.8 Ustawione wyrównanie tekstu do środka dla selektora body

    ok. 1 min
    Polecenie z arkusza

    Dla selektora ciała strony: wyrównanie tekstu do środka.

    Właściwość dziedziczą wszystkie bloki: nagłówki, akapity, obrazy i odnośniki w menu stają na środku (R.4.8).

    style.css CSS zmienione: 3 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    Podgląd strony po tym kroku (index.html)
  35. Krok 35: Nagłówek: gradient pionowy

    Kryteria: ,

    R.4.3 Ustawione gradienty liniowe pionowe: dla bloku nagłówkowego od koloru #A0522D do #F5DEB3 np. linear-gradient(#A0522D, #F5DEB3) oraz dla stopki od koloru #F5DEB3 do #A0522D np. linear-gradient(#F5DEB3, #A0522D)

    R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td

    ok. 2 min
    Polecenie z arkusza

    Dla bloku nagłówkowego: marginesy wewnętrzne 30 px, gradient pionowy od koloru #A0522D do koloru #F5DEB3.

    Gradient to w CSS obraz tła: background-image: linear-gradient(kolor1, kolor2). Bez podanego kierunku przejście biegnie z góry na dół - czyli jest pionowe (opis w ramce „CSS Linear Gradients” arkusza). Od rdzawego #A0522D u góry do pszenicznego #F5DEB3 na dole (R.4.3, R.4.6).

    Typowe błędy

    background-color: linear-gradient(#A0522D, #F5DEB3) nie działa - gradient jest obrazem, więc należy do background-image (albo skrótu background).

    style.css CSS zmienione: 4 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    Podgląd strony po tym kroku (index.html)
  36. Krok 36: Menu

    Kryteria: ,

    R.4.2 Ustawiony kolor tła Wheat dla bloku menu i głównego oraz kolor tła Sienna i kolor czcionki biały dla selektora a

    R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td

    ok. 1 min
    Polecenie z arkusza

    Dla bloku menu: kolor tła Wheat, marginesy wewnętrzne 14 px.

    Wheat to nazwa koloru w CSS - ten sam pszeniczny odcień, co #F5DEB3, w którym kończy się gradient nagłówka.

    style.css CSS zmienione: 4 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    Podgląd strony po tym kroku (index.html)
  37. Krok 37: Blok główny

    Kryteria: ,

    R.4.2 Ustawiony kolor tła Wheat dla bloku menu i głównego oraz kolor tła Sienna i kolor czcionki biały dla selektora a

    R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td

    ok. 1 min
    Polecenie z arkusza

    Dla bloku głównego: kolor tła Wheat, marginesy wewnętrzne 50 px.

    To samo tło, co menu - na ilustracji 3 oba bloki zlewają się w jedno pole.

    style.css CSS zmienione: 4 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    main {
        background-color: Wheat;
        padding: 50px;
    }
    Podgląd strony po tym kroku (index.html)
  38. Krok 38: Stopka: gradient w drugą stronę

    Kryteria: ,

    R.4.3 Ustawione gradienty liniowe pionowe: dla bloku nagłówkowego od koloru #A0522D do #F5DEB3 np. linear-gradient(#A0522D, #F5DEB3) oraz dla stopki od koloru #F5DEB3 do #A0522D np. linear-gradient(#F5DEB3, #A0522D)

    R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td

    ok. 1 min
    Polecenie z arkusza

    Dla stopki: marginesy wewnętrzne 30 px, gradient pionowy od koloru #F5DEB3 do koloru #A0522D.

    Kolory zamienione miejscami: jasny u góry przechodzi w ciemny na dole strony (R.4.3, R.4.6).

    style.css CSS zmienione: 4 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    main {
        background-color: Wheat;
        padding: 50px;
    }
    footer {
        padding: 30px;
        background-image: linear-gradient(#F5DEB3, #A0522D);
    }
    Podgląd strony po tym kroku (index.html)
  39. Krok 39: Odnośniki

    Kryteria: , , ,

    R.4.2 Ustawiony kolor tła Wheat dla bloku menu i głównego oraz kolor tła Sienna i kolor czcionki biały dla selektora a

    R.4.5 Ustawione cechy czcionki dla odnośnika: czcionka pogrubiona, bez podkreślenia

    R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td

    R.4.7 Ustawione marginesy zewnętrzne (margin) auto dla tabeli, 20px dla odnośnika

    ok. 2 min
    Polecenie z arkusza

    Dla selektora odnośnika: kolor tła Sienna, biały kolor czcionki, czcionka pogrubiona, bez podkreślenia, marginesy wewnętrzne 10 px, zewnętrzne 20 px.

    Tym razem selektor znacznika a - arkusz wymaga go wprost. „Bez podkreślenia” to text-decoration: none (R.4.2, R.4.5, R.4.6, R.4.7).

    style.css CSS zmienione: 8 linii
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    main {
        background-color: Wheat;
        padding: 50px;
    }
    footer {
        padding: 30px;
        background-image: linear-gradient(#F5DEB3, #A0522D);
    }
    a {
        background-color: Sienna;
        color: white;
        font-weight: bold;
        text-decoration: none;
        padding: 10px;
        margin: 20px;
    }
    Podgląd strony po tym kroku (index.html)
  40. Krok 40: Odnośnik pod kursorem

    Kryteria:

    R.4.10 Gdy kursor myszy znajdzie się na odnośniku pojawia się podkreślenie tekstu

    ok. 1 min
    Polecenie z arkusza

    Gdy kursor myszy znajdzie się na odnośniku pojawia się podkreślenie tekstu.

    Pseudoklasa :hover przywraca podkreślenie, dopóki kursor jest nad odnośnikiem - jak przy „Oferta” na ilustracji 3 (R.4.10).

    style.css CSS zmienione: 3 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    main {
        background-color: Wheat;
        padding: 50px;
    }
    footer {
        padding: 30px;
        background-image: linear-gradient(#F5DEB3, #A0522D);
    }
    a {
        background-color: Sienna;
        color: white;
        font-weight: bold;
        text-decoration: none;
        padding: 10px;
        margin: 20px;
    }
    a:hover {
        text-decoration: underline;
    }
    Podgląd strony po tym kroku (index.html)
  41. Krok 41: Tabela i komórki: wspólna ramka

    Kryteria:

    R.4.9 Ustawione dla tabeli i komórki tabeli obramowanie 1px solid Sienna oraz dla tabeli obramowanie połączone border-collapse: collapse;

    ok. 2 min
    Polecenie z arkusza

    Wspólne dla selektora tabeli i selektora komórki tabeli: obramowanie o szerokości 1px linią ciągłą koloru Sienna, obramowanie połączone w jedną linię.

    Jedna reguła dla dwóch selektorów: table, td. border-collapse: collapse łączy podwójne ramki sąsiednich komórek w jedną linię, jak na ilustracji 4 (R.4.9).

    style.css CSS zmienione: 4 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    main {
        background-color: Wheat;
        padding: 50px;
    }
    footer {
        padding: 30px;
        background-image: linear-gradient(#F5DEB3, #A0522D);
    }
    a {
        background-color: Sienna;
        color: white;
        font-weight: bold;
        text-decoration: none;
        padding: 10px;
        margin: 20px;
    }
    a:hover {
        text-decoration: underline;
    }
    table, td {
        border: 1px solid Sienna;
        border-collapse: collapse;
    }
    Podgląd strony po tym kroku (oferta.html)
  42. Krok 42: Tabela: szerokość i wyśrodkowanie

    Kryteria: ,

    R.4.4 Ustawiona szerokość 70% dla selektora table

    R.4.7 Ustawione marginesy zewnętrzne (margin) auto dla tabeli, 20px dla odnośnika

    ok. 1 min
    Polecenie z arkusza

    Dodatkowo dla selektora tabeli: szerokość 70%, marginesy zewnętrzne automatycznie wyliczane przez przeglądarkę.

    margin: auto - przy ustalonej szerokości 70% przeglądarka dzieli wolne miejsce po równo na lewo i prawo, więc tabela staje na środku. Samo text-align: center z body tabeli nie przesunie, bo wyrównuje tylko zawartość linii (R.4.4, R.4.7).

    style.css CSS zmienione: 4 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    main {
        background-color: Wheat;
        padding: 50px;
    }
    footer {
        padding: 30px;
        background-image: linear-gradient(#F5DEB3, #A0522D);
    }
    a {
        background-color: Sienna;
        color: white;
        font-weight: bold;
        text-decoration: none;
        padding: 10px;
        margin: 20px;
    }
    a:hover {
        text-decoration: underline;
    }
    table, td {
        border: 1px solid Sienna;
        border-collapse: collapse;
    }
    table {
        width: 70%;
        margin: auto;
    }
    Podgląd strony po tym kroku (oferta.html)
  43. Krok 43: Komórki: margines wewnętrzny

    Kryteria:

    R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td

    ok. 1 min
    Polecenie z arkusza

    Dla selektora komórki tabeli: marginesy wewnętrzne 5 px.

    Odstęp napisu od ramki komórki (R.4.6).

    style.css CSS zmienione: 3 linie
    * {
        font-family: Georgia;
    }
    body {
        text-align: center;
    }
    header {
        padding: 30px;
        background-image: linear-gradient(#A0522D, #F5DEB3);
    }
    nav {
        background-color: Wheat;
        padding: 14px;
    }
    main {
        background-color: Wheat;
        padding: 50px;
    }
    footer {
        padding: 30px;
        background-image: linear-gradient(#F5DEB3, #A0522D);
    }
    a {
        background-color: Sienna;
        color: white;
        font-weight: bold;
        text-decoration: none;
        padding: 10px;
        margin: 20px;
    }
    a:hover {
        text-decoration: underline;
    }
    table, td {
        border: 1px solid Sienna;
        border-collapse: collapse;
    }
    table {
        width: 70%;
        margin: auto;
    }
    td {
        padding: 5px;
    }
    Podgląd strony po tym kroku (oferta.html)
  44. Krok 44: Układ bloków zgodny z ilustracją 3

    Kryteria:

    R.3.1 Układ bloków po uruchomieniu w przeglądarce jest zgodny z ilustracją 3 w arkuszu egzaminacyjnym

    ok. 2 min
    Polecenie z arkusza

    Uwaga: styl CSS ciała strony, odnośnika, tabeli i komórki tabeli należy zdefiniować wyłącznie przy pomocy selektora tych znaczników. Jest to uwarunkowane projektem późniejszej rozbudowy witryny.

    Sprawdź całość na index.html: nagłówek z gradientem, menu i blok główny w kolorze Wheat, stopka z odwróconym gradientem - bloki stoją jeden pod drugim, zgodnie z ilustracją 3 (R.3.1). Style body, a, table i td są zapisane selektorami znaczników, bez klas - klucz uznaje R.4.2, R.4.4, R.4.6 i R.4.8 tylko w tej postaci.

    Podgląd strony po tym kroku (index.html)
  45. Etap 4: Skrypt JavaScript

    Kroki 45-50 · po tym etapie masz 40 z 40 kryteriów (pkt)

    Krok 45: Funkcja calculate wywoływana przyciskiem

    Kryteria:

    R.5.1 Skrypt jest napisany w języku JavaScript i zawiera przynajmniej jedną poprawną składniowo instrukcję wynikającą z treści zadania

    ok. 1 min
    Polecenie z arkusza

    Wykonywany po stronie klienta, na stronie koszty.html po kliknięciu przycisku „Oblicz”.

    Skrypt w <script> na końcu <body> strony koszty.html - wykonuje się w przeglądarce. Funkcja ma tę samą nazwę, co w onclick przycisku: calculate. Na razie jest pusta.

    koszty.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
        <script>
            function calculate() {
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  46. Krok 46: Odczyt szerokości i długości

    Kryteria:

    R.5.2 Skrypt pobiera dane z przynajmniej jednego pola edycyjnego oraz wykorzystuje pole .value obiektu

    ok. 2 min
    Polecenie z arkusza

    Skrypt pobiera dane z pól edycyjnych i pól opcji.

    document.getElementById znajduje pole po identyfikatorze, a .value to jego zawartość - wpisany tekst, np. „4”. Puste pole daje pusty napis "" - z tego skorzystasz przy sprawdzaniu (R.5.2).

    koszty.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
        <script>
            function calculate() {
                let width = document.getElementById("width").value;
                let length = document.getElementById("length").value;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  47. Krok 47: Warunek: oba pola wypełnione

    Kryteria: ,

    R.5.6 Jeżeli jedno z pól edycyjnych jest puste, skrypt wyświetla dowolną metodą tekst: "Wprowadź poprawne dane."

    R.5.8 Przynajmniej jeden tekst jest wyświetlany w paragrafie pod przyciskiem

    ok. 2 min
    Polecenie z arkusza

    Jeżeli oba pola edycyjne zostały wypełnione, skrypt oblicza pole powierzchni pomieszczenia i koszt montażu. W przeciwnym wypadku skrypt wyświetla komunikat "Wprowadź poprawne dane."

    && (i) - oba pola muszą być niepuste. Gdy któregoś brakuje, gałąź else wpisuje komunikat do akapitu result przez innerHTML. Kliknij „Oblicz” w podglądzie przy pustych polach (R.5.6, R.5.8).

    Typowe błędy

    || (lub) zamiast && przepuszcza jedno puste pole - skrypt liczy wtedy pole powierzchni 0.

    koszty.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
        <script>
            function calculate() {
                let width = document.getElementById("width").value;
                let length = document.getElementById("length").value;
                if (width != "" && length != "") {
                } else {
                    document.getElementById("result").innerHTML = "Wprowadź poprawne dane.";
                }
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  48. Krok 48: Pole powierzchni

    Kryteria:

    R.5.4 Pole powierzchni policzone jako wynik mnożenia podanych w kontrolkach wartości szerokości i długości

    ok. 1 min
    Polecenie z arkusza

    Oblicza pole powierzchni pomieszczenia.

    Szerokość razy długość. Operator * sam zamienia napisy „4” i „3” na liczby, więc wynik to 12 (R.5.4).

    koszty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
        <script>
            function calculate() {
                let width = document.getElementById("width").value;
                let length = document.getElementById("length").value;
                if (width != "" && length != "") {
                    let area = width * length;
                } else {
                    document.getElementById("result").innerHTML = "Wprowadź poprawne dane.";
                }
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  49. Krok 49: Koszt według rodzaju panelu

    Kryteria: ,

    R.5.3 Skrypt pobiera dane z przynajmniej jednego pola opcji oraz wykorzystuje pole .checked obiektu

    R.5.5 Koszt montażu policzony jako wynik mnożenia pola powierzchni przez 12, jeśli wybrano panel laminowany lub przez 14, jeśli wybrano panel winylowy, lub przez 18, jeśli wybrano deskę podłogową

    ok. 3 min
    Polecenie z arkusza

    Oblicza koszt montażu uwzględniając pole powierzchni oraz typ panelu i koszt z tabeli 1.

    Właściwość checked pola opcji ma wartość true, gdy pole jest zaznaczone. Z grupy zaznaczone może być tylko jedno, więc wystarczy drabinka if ... else if: stawka z tabeli 1 - 12 zł/m² za laminowane, 14 za winylowe, 18 za deskę - razy pole powierzchni (R.5.3, R.5.5).

    koszty.html HTML zmienione: 8 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
        <script>
            function calculate() {
                let width = document.getElementById("width").value;
                let length = document.getElementById("length").value;
                if (width != "" && length != "") {
                    let area = width * length;
                    let cost = 0;
                    if (document.getElementById("laminated").checked) {
                        cost = area * 12;
                    } else if (document.getElementById("vinyl").checked) {
                        cost = area * 14;
                    } else if (document.getElementById("board").checked) {
                        cost = area * 18;
                    }
                } else {
                    document.getElementById("result").innerHTML = "Wprowadź poprawne dane.";
                }
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  50. Krok 50: Wynik pod przyciskiem

    Kryteria: , ,

    R.5.7 Jeżeli oba pola edycyjne są wypełnione, skrypt wyświetla tekst: "Pole powierzchni pomieszczenia: <pole>, koszt montażu <koszt>”, gdzie pola <> oznaczają wartości obliczone skryptem

    R.5.8 Przynajmniej jeden tekst jest wyświetlany w paragrafie pod przyciskiem

    R.5.9 W skryptach zastosowana przynajmniej jedna zmienna lub funkcja oraz nazwy wszystkich funkcji i zmiennych są w języku polskim lub angielskim i odzwierciedlają cel zastosowania

    ok. 2 min
    Polecenie z arkusza

    W paragrafie pod przyciskiem wyświetla napis: „Pole powierzchni pomieszczenia: <pole>, koszt montażu <koszt>”, gdzie pola <> oznaczają wartości obliczone skryptem.

    Napis składasz operatorem + i wpisujesz do akapitu result. Wpisz w podglądzie 4 i 3, zaznacz „Deska podłogowa” i kliknij „Oblicz”: „Pole powierzchni pomieszczenia: 12, koszt montażu 216” (12 × 18) - jak na ilustracji 5 (R.5.7, R.5.8). Zmienne nazwane po angielsku mówią, co przechowują (R.5.9).

    koszty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board">
            <label for="board">Deska podłogowa</label><br>
            <button onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
        <script>
            function calculate() {
                let width = document.getElementById("width").value;
                let length = document.getElementById("length").value;
                if (width != "" && length != "") {
                    let area = width * length;
                    let cost = 0;
                    if (document.getElementById("laminated").checked) {
                        cost = area * 12;
                    } else if (document.getElementById("vinyl").checked) {
                        cost = area * 14;
                    } else if (document.getElementById("board").checked) {
                        cost = area * 18;
                    }
                    document.getElementById("result").innerHTML = "Pole powierzchni pomieszczenia: " + area + ", koszt montażu " + cost;
                } else {
                    document.getElementById("result").innerHTML = "Wprowadź poprawne dane.";
                }
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  51. Etap 5: Dobre praktyki (poza kluczem)

    Krok 51 · po tym etapie masz 40 z 40 kryteriów (pkt)

    Krok 51: Stawki w obiekcie, sprawdzenie danych, słuchacz zdarzenia

    ok. 5 min
    Polecenie z arkusza

    Przycisk "Oblicz", którego wybranie uruchamia skrypt.

    Poprawki z prawdziwych projektów:

    • Stawki w obiekcie RATES zamiast drabinki if: pola opcji dostają value, a querySelector('input[name="panel"]:checked') od razu zwraca zaznaczone. Nowy rodzaj paneli to jedna linia w obiekcie i jedno pole w HTML.
    • Sprawdzenie danych: wersja z egzaminu przepuszczała ujemne wymiary i brak zaznaczonego panelu (koszt 0). Number() zamienia tekst na liczbę, a warunek odrzuca wymiary nie większe od zera i brak wyboru.
    • addEventListener zamiast onclick w HTML i textContent zamiast innerHTML.

    Wersja z egzaminu zostaje w komentarzu pod nową. Na egzaminie wystarczy wersja wcześniejsza - klucz sprawdza .value, .checked i komunikat dla pustego pola (R.5.2, R.5.3, R.5.6), a dodatkowych zabezpieczeń nie wymaga.

    koszty.html HTML zmienione: 24 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Montaż paneli podłogowych</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="montaz_paneli.png" alt="firma usługowa">
        </header>
        <nav>
            <a href="index.html">Strona Główna</a>
            <a href="oferta.html">Oferta</a>
            <a href="koszty.html">Kalkulator kosztów</a>
        </nav>
        <main>
            <h1>Kalkulator kosztów montażu</h1>
            <label for="width">Szerokość pomieszczenia [m]: </label>
            <input type="number" id="width">
            <label for="length">Długość pomieszczenia [m]: </label>
            <input type="number" id="length">
            <p>Typ panelu</p>
            <input type="radio" name="panel" id="laminated" value="laminated">
            <label for="laminated">Panele laminowane</label><br>
            <input type="radio" name="panel" id="vinyl" value="vinyl">
            <label for="vinyl">Panele winylowe</label><br>
            <input type="radio" name="panel" id="board" value="board">
            <label for="board">Deska podłogowa</label><br>
            <button id="calculate">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <h5>Autor strony: Bartosz Bryniarski</h5>
        </footer>
        <script>
            const RATES = { laminated: 12, vinyl: 14, board: 18 };
    
            function calculate() {
                let width = Number(document.getElementById("width").value);
                let length = Number(document.getElementById("length").value);
                let panel = document.querySelector('input[name="panel"]:checked');
                let result = document.getElementById("result");
                if (width <= 0 || length <= 0 || panel == null) {
                    result.textContent = "Wprowadź poprawne dane.";
                    return;
                }
                let area = width * length;
                let cost = area * RATES[panel.value];
                result.textContent = "Pole powierzchni pomieszczenia: " + area + ", koszt montażu " + cost;
            }
    
            document.getElementById("calculate").addEventListener("click", calculate);
    
            /* Wersja z egzaminu:
            function calculate() {
                let width = document.getElementById("width").value;
                let length = document.getElementById("length").value;
                if (width != "" && length != "") {
                    let area = width * length;
                    let cost = 0;
                    if (document.getElementById("laminated").checked) {
                        cost = area * 12;
                    } else if (document.getElementById("vinyl").checked) {
                        cost = area * 14;
                    } else if (document.getElementById("board").checked) {
                        cost = area * 18;
                    }
                    document.getElementById("result").innerHTML = "Pole powierzchni pomieszczenia: " + area + ", koszt montażu " + cost;
                } else {
                    document.getElementById("result").innerHTML = "Wprowadź poprawne dane.";
                }
            }
            */
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (koszty.html)
  52. Etap 6: Oddanie pracy

    Krok 52 · po tym etapie masz 40 z 40 kryteriów (pkt)

    Krok 52: Plik przeglądarka.txt i nagranie płyty

    ok. 5 min
    Polecenie z arkusza

    Po zakończeniu pracy utwórz plik tekstowy o nazwie przeglądarka.txt. Zapisz w nim nazwę przeglądarki internetowej, w której weryfikowana była poprawność działania witryny. Nagraj płytę z rezultatami pracy.

    W przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz strony.

    W folderze z numerem zdającego muszą być: trzy strony HTML, style.css, kwerendy.txt, zrzuty import.png, kw1.png - kw4.png i kolor.png, grafika montaz_paneli.png i trzy przeskalowane zdjęcia paneli. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.

    przeglądarka.txt Tekst nowy plik
    Google Chrome

    Podgląd strony bez zmian - taki jak po kroku 51.

Podgląd

To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.

Autor rozwiązania: . Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.