Przejdź do głównej treści
INF.03-01-25.01-SGStyczeń 2025 · 47 kroków · ok. 88 min · 40 kryteriów z klucza

Rozwiązanie krok po kroku: Witryna firmy szkoleniowej (Wersja podstawowa)

Rozwiązanie buduje stronę firmy szkoleniowej z kursami programowania: baza obuwie (tak, w tym arkuszu baza dotyczy butów, a strona kursów - te części są od siebie niezależne) i cztery zapytania - warunek, złączenie tabel, utworzenie konta CREATE USER i nadanie uprawnień GRANT, potem baner wycięty ze zdjęcia klawiatury z napisem, dwie strony HTML - index.html z tabelą kursów i adresem oraz raty.html z kalkulatorem rat - i style w style.css. PHP tu nie ma: skrypt działa w przeglądarce, w JavaScripcie - sprawdza zaznaczone kursy, dzieli kwotę przez liczbę rat i wypisuje zdanie z miastem.

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 i innerHTML, a na końcu zostaje przerobiony na wersję z prawdziwych projektów: słuchacz zdarzenia, sprawdzenie liczby rat, zaokrąglenie do groszy 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, tabela z częścią nagłówkową, kalkulator ułożony siatką CSS zamiast <br> i skrypt w osobnym pliku z nasłuchiwaczem zdarzenia, sprawdzeniem danych i kwotami w polskim formacie od pierwszej linii - obie wersje są zgodne z kluczem.

Baza i zdjęcie pochodzą z prawdziwego archiwum pliki10 (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ę - zaznacz kursy, wpisz liczbę rat i kliknij „Oblicz”.

Jak liczą się punkty. Klucz ma 40 kryteriów (R.1.1 - R.5.8), 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 obuwie

    Kryteria:

    R.1.1 Wykonany import tabel do bazy danych obuwie , co jest udokumentowane w pliku import w formacie JPEG

    ok. 2 min
    Polecenie z arkusza

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

    Rozpakuj pliki10.7z z pulpitu (hasło KuRsyKompuTerow3&) do folderu z numerem zdającego: baza.sql i klawiatura.jpg. W phpMyAdmin: Nowa, nazwa obuwie, porównywanie z polskimi znakami, np. utf8_unicode_ci albo utf8mb4_polish_ci - w bazie są słowa „PÓŁBUTY” i „brązowy”.

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

    Kryteria:

    R.1.1 Wykonany import tabel do bazy danych obuwie , co jest udokumentowane w pliku import w formacie JPEG

    ok. 2 min
    Polecenie z arkusza

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

    Wybierz bazę obuwie w lewym drzewie, potem Import → baza.sql → Wykonaj. Powstają trzy tabele z ilustracji 1: kategorie (4 kategorie obuwia), buty (model, kategoria, nazwa, cena) i produkt (kolor, materiał, wysokość buta). Relacje: buty.id_kat → kategorie.id_kat i produkt.model → buty.model.

    Typowe błędy

    Import bez zaznaczonej bazy obuwie kończy się błędem „Nie wybrano bazy danych” - plik nie zawiera polecenia USE.

  3. Krok 3: Zrzut ekranu import.jpg

    Kryteria:

    R.1.1 Wykonany import tabel do bazy danych obuwie , co jest udokumentowane w pliku import w formacie JPEG

    ok. 2 min
    Polecenie z arkusza

    Wykonaj zrzut ekranu po imporcie. Zapisz zrzut w formacie JPEG 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, wklejasz do edytora grafiki i zapisujesz jako import.jpg - import w JPEG, a zrzuty zapytań w PNG. Na zrzucie widać komunikat o udanym imporcie i trzy 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: kolor i materiał wysokich butów

    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 kolor i materiał produktów, których wysokość buta jest większa niż 10. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10; oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 2 wiersze dla koloru brązowego i szarego

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 1: wybierające jedynie kolor i materiał produktów, których wysokość buta jest większa niż 10.

    Każdą część zdania z arkusza tłumaczysz na jedną klauzulę:

    • SELECT kolor, material - „jedynie kolor i materiał”, więc dwie kolumny, nie *,
    • FROM produkt - te pola są w tabeli produkt,
    • WHERE wysokosc_buta > 10 - „większa niż 10”, czyli ostrzej niż >=.

    Wynik: dwa wiersze - brązowy (skóra naturalna - zamsz, 12,5) i szary (skóra ekologiczna, 11,0), jak w kluczu. Zapytanie zapisujesz w kwerendy.txt, zrzut wyniku jako kw1.png.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 4
  5. Krok 5: Zapytanie 2: buty z nazwą kategorii

    Kryteria:

    R.1.4 Wykonane zapytanie 2 wybierające jedynie nazwę i cenę buta oraz odpowiadającą im nazwę kategorii. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat); (możliwe też porównanie kluczy po ON lub WHERE ) oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 4 rekordy dla nazw kategorii Półbuty, Trzewiki, Trampki, Obuwie sportowe

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 2: wybierające jedynie nazwę i cenę buta oraz odpowiadającą im nazwę kategorii. Należy posłużyć się relacją.

    Nazwa i cena są w buty, a nazwa kategorii w kategorie - łączysz tabele po polu, które je wiąże:

    • SELECT nazwa, cena, nazwa_kat - trzy kolumny z obu tabel,
    • FROM buty JOIN kategorie - złączenie dwóch tabel,
    • USING(id_kat) - warunek złączenia: pole id_kat ma tę samą nazwę w obu tabelach, więc wystarczy ją podać raz. Równoważnie: ON buty.id_kat = kategorie.id_kat.

    Wynik: cztery wiersze, po jednym dla kategorii Półbuty, Trzewiki, Trampki i Obuwie sportowe - jak w kluczu. Zrzut: kw2.png.

    Typowe błędy

    SELECT ... FROM buty, kategorie bez warunku złączenia daje iloczyn kartezjański: 16 wierszy zamiast 4, każdy but z każdą kategorią.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;
    
    -- Zapytanie 2
    SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat);
    Podgląd strony po tym kroku
    Podgląd strony po kroku 5
  6. Krok 6: Zapytanie 3: konto Marek

    Kryteria:

    R.1.5 Wykonane zapytanie 3 tworzące konto użytkownika Marek na localhost z hasłem M@reK W pliku z kwerendami lub na zrzucie istnieje zapis np. CREATE USER 'Marek'@'localhost' IDENTIFIED BY 'M@reK'; oraz wynik działania udokumentowany zrzutem, na którym jest widoczny komunikat o poprawnie wykonanym zapytaniu, dopuszczalny jest błąd informujący o niewybraniu bazy

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 3: tworzące konto użytkownika Marek na localhost z hasłem M@reK.

    Konto w MySQL to para nazwa i host: 'Marek'@'localhost' może łączyć się tylko z tego samego komputera. Hasło podajesz po IDENTIFIED BY, w apostrofach i z zachowaniem wielkości liter: M@reK. Wynik to komunikat o poprawnie wykonanym zapytaniu - klucz dopuszcza też błąd o niewybranej bazie, bo konto nie należy do żadnej bazy. Zrzut: kw3.png.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;
    
    -- Zapytanie 2
    SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat);
    
    -- Zapytanie 3
    CREATE USER 'Marek'@'localhost' IDENTIFIED BY 'M@reK';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 6
  7. Krok 7: Zapytanie 4: przeglądanie i aktualizacja tabeli produkt

    Kryteria:

    R.1.6 Wykonane zapytanie 4 nadające dla konta Marek prawa jedynie do przeglądania i aktualizacji danych jedynie w bazie danych obuwie, w tabeli produkt. W pliku z kwerendami lub na zrzucie istnieje zapis np. GRANT SELECT, UPDATE ON obuwie.produkt TO 'Marek'@'localhost'; oraz wynik działania udokumentowany zrzutem, na którym jest widoczny komunikat o poprawnie wykonanym zapytaniu

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 4: nadające kontu Marek prawa jedynie do przeglądania i aktualizacji danych jedynie w bazie danych obuwie, w tabeli produkt.

    • GRANT SELECT, UPDATE - „przeglądanie” to SELECT, „aktualizacja” to UPDATE; nic więcej (bez INSERT, DELETE, ALL),
    • ON obuwie.produkt - „jedynie w bazie obuwie, w tabeli produkt”: baza i tabela po kropce. obuwie.* dałoby prawa do wszystkich tabel bazy,
    • TO 'Marek'@'localhost' - to samo konto, co w zapytaniu 3, z tym samym hostem.

    Zrzut z komunikatem o poprawnym wykonaniu: kw4.png.

    Typowe błędy

    TO Marek bez hosta tworzy w MariaDB odwołanie do konta Marek@% - innego niż utworzone w zapytaniu 3 - i kończy się błędem.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;
    
    -- Zapytanie 2
    SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat);
    
    -- Zapytanie 3
    CREATE USER 'Marek'@'localhost' IDENTIFIED BY 'M@reK';
    
    -- Zapytanie 4
    GRANT SELECT, UPDATE ON obuwie.produkt TO 'Marek'@'localhost';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 7
  8. Etap 2: Grafika i strony HTML

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

    Krok 8: Kadr klawiatura.jpg: 1000 × 100 px

    Kryteria:

    R.2.1 Grafika baner.png ma szerokość 1000 px i wysokość 100 px, jest skadrowana tak, że po lewej stronie klawiatury nie widać cyfry 8, a po prawej stronie widać jedynie klawisze Insert i Delete

    ok. 4 min
    Polecenie z arkusza

    Na potrzeby witryny internetowej należy przygotować grafikę baner.png utworzoną na podstawie pliku klawiatura.jpg, który należy wykadrować do szerokości 1000 px i wysokości 100 px, zgodnie z kadrem przedstawionym na ilustracji 2.

    Zdjęcie ma 1500 × 300 px. W GIMP-ie wybierasz narzędzie Zaznaczenie prostokątne, w opcjach narzędzia wpisujesz rozmiar 1000 × 100, a położenie dobierasz tak, jak na ilustracji 2: kadr zaczyna się mniej więcej 37 px od lewej i 51 px od góry. Potem Obraz → Przytnij do zaznaczenia. Klucz sprawdza kadr po klawiszach: z lewej nie może być widać cyfry 8, a z prawej mają być widoczne tylko klawisze Insert i Delete (R.2.1).

    Typowe błędy

    Skalowanie zamiast kadrowania (Obraz → Skaluj) daje 1000 × 100, ale ze ściśniętym zdjęciem i całą klawiaturą w kadrze - kryterium R.2.1 nie jest spełnione.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Napis „Kursy komputerowe” i zapis baner.png

    Kryteria:

    R.2.2 W grafice jest widoczny napis "Kursy komputerowe" zapisany czcionką bezszeryfową, pochyloną, wypełnioną kolorem białym

    ok. 4 min
    Polecenie z arkusza

    Na środku umieszczony napis "Kursy komputerowe" czcionką Arial pochyloną i pogrubioną, o rozmiarze 60, wypełnioną kolorem białym.

    Narzędzie Tekst: czcionka Arial Bold Italic (pogrubiona i pochylona), rozmiar 60 px, kolor biały (ffffff). Kliknij na obrazie, wpisz napis, a potem wyrównaj warstwę tekstu do środka obrazu narzędziem Wyrównanie (względem obrazu, środek w poziomie i w pionie). Na koniec Plik → Eksportuj jako baner.png - format PNG, nie zapis .xcf (R.2.2).

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

    Kryteria:

    R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". Strona zawiera sekcje head i body

    ok. 2 min
    Polecenie z arkusza

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

    Zbuduj całą stronę index.html, a raty.html powstanie z jej kopii - różnią się tylko blokiem głównym. <!DOCTYPE html> mówi przeglądarce, że to HTML5.

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

    Kryteria:

    R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". 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)
  12. Krok 12: Kodowanie polskich znaków

    Kryteria:

    R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". 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)
  13. Krok 13: Tytuł strony

    Kryteria:

    R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". Strona zawiera sekcje head i body

    ok. 1 min
    Polecenie z arkusza

    Tytuł strony widoczny na karcie przeglądarki: „Kursy komputerowe”.

    <title> w <head> - to napis na karcie przeglądarki, nie na stronie.

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

    Kryteria:

    R.3.6 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.

    Uwaga na nazwę: w tym arkuszu style.css, z „e” na końcu (w wielu innych jest styl.css).

    Typowe błędy

    styl.css zamiast style.css odcina wszystkie style - kryterium R.3.6, 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>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  15. Krok 15: Bloki: nagłówek, menu, blok główny, stopka

    Kryteria:

    R.2.4 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.

    Każdy blok dostaje znacznik, który mówi, czym jest: <header> - nagłówek strony, <nav> - menu z odnośnikami, <main> - treść główna, <footer> - stopka. Klucz wymaga semantycznych znaczników, w tym wprost header i footer (R.2.4). Bloki stoją jeden pod drugim, więc nie potrzebują żadnego pozycjonowania.

    index.html HTML zmienione: 8 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</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)
  16. Krok 16: Nagłówek: baner

    Kryteria:

    R.2.6 W bloku nagłówkowym umieszczony obraz z pliku baner.png z tekstem alternatywnym "kursy komputerowe"

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku nagłówkowego: obraz baner.png z tekstem alternatywnym „kursy komputerowe”.

    <img> z przygotowanym banerem i tekstem alternatywnym z arkusza - małymi literami (R.2.6). Na razie obraz ma swoje 1000 px szerokości; dopasuje go styl.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
        </nav>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  17. Krok 17: Menu: trzy odnośniki

    Kryteria:

    R.3.2 Wybranie odnośnika "Strona główna" otwiera stronę index.html, "Koszt rat" otwiera raty.html , „Nasz partner” otwiera "https://moje-szkolenia.pl/"

    ok. 2 min
    Polecenie z arkusza

    Zawartość menu: Odnośnik o treści „Strona główna” prowadzący do strony index.html. Odnośnik o treści „Koszt rat” prowadzący do strony raty.html. Odnośnik o treści „Nasz partner” prowadzący do strony https://moje-szkolenia.pl/.

    Trzy znaczniki <a>. Do własnych podstron prowadzi ścieżka względna - sama nazwa pliku z tego samego folderu, a do serwisu partnera pełny adres z https:// (R.3.2). W podglądzie kliknięcia są zablokowane.

    Typowe błędy

    Adres partnera bez https:// (href="moje-szkolenia.pl") przeglądarka traktuje jak plik w bieżącym folderze - odnośnik prowadzi donikąd.

    index.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  18. Krok 18: Stopka

    Kryteria:

    R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego

    ok. 1 min
    Polecenie z arkusza

    Zawartość stopki: paragraf o treści „Autor strony: ”, dalej wstawiony numer zdającego.

    Akapit <p> w <footer>. 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>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  19. Krok 19: Blok główny: nagłówek trzeciego stopnia

    Kryteria:

    R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku głównego strony index.html: Nagłówek trzeciego stopnia o treści „Kursy komputerowe - programowanie”.

    Trzeci stopień to <h3>.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Kursy komputerowe - programowanie</h3>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  20. Krok 20: Tabela kursów

    Kryteria:

    R.2.7 Na stronie głównej w bloku głównym umieszczona tabela o 3 kolumnach i 3 wierszach, pierwszy wiersz zawiera komórki nagłówkowe, zastosowane znaczniki <table>, <tr>, <td>, <th>

    ok. 3 min
    Polecenie z arkusza

    Tabela składająca się z 3 kolumn i 3 wierszy przedstawiona na ilustracji 4, pierwszy wiersz zawiera komórki nagłówkowe.

    Każdy wiersz to <tr>. W pierwszym są komórki nagłówkowe <th> (Nazwa, Liczba godzin, Cena), w dwóch kolejnych zwykłe <td> z danymi z ilustracji 4 (R.2.7). Zapamiętaj ceny - 5000 za React.js i 3000 za JavaScript - skrypt na stronie rat będzie z nich liczył.

    index.html HTML zmienione: 17 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Kursy komputerowe - programowanie</h3>
            <table>
                <tr>
                    <th>Nazwa</th>
                    <th>Liczba godzin</th>
                    <th>Cena</th>
                </tr>
                <tr>
                    <td>Kurs React.js</td>
                    <td>220</td>
                    <td>5000</td>
                </tr>
                <tr>
                    <td>Kurs JavaScript</td>
                    <td>150</td>
                    <td>3000</td>
                </tr>
            </table>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  21. Krok 21: Nagłówek „Adres do korespondencji”

    Kryteria:

    R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego

    ok. 1 min
    Polecenie z arkusza

    Nagłówek trzeciego stopnia o treści „Adres do korespondencji”.

    Drugi <h3> w bloku głównym, pod tabelą.

    index.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Kursy komputerowe - programowanie</h3>
            <table>
                <tr>
                    <th>Nazwa</th>
                    <th>Liczba godzin</th>
                    <th>Cena</th>
                </tr>
                <tr>
                    <td>Kurs React.js</td>
                    <td>220</td>
                    <td>5000</td>
                </tr>
                <tr>
                    <td>Kurs JavaScript</td>
                    <td>150</td>
                    <td>3000</td>
                </tr>
            </table>
            <h3>Adres do korespondencji</h3>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  22. Krok 22: Lista z adresem i odnośnikiem pocztowym

    Kryteria: ,

    R.2.8 Na stronie głównej w bloku głównym umieszczona jedna lista punktowana z trzema elementami, zastosowane znaczniki <ul> i <li>

    R.3.3 Na stronie umieszczony odnośnik pocztowy „skontaktuj się” połączony z adresem mailto:[email protected]

    ok. 2 min
    Polecenie z arkusza

    Lista punktowana (nieuporządkowana) wypełniona zawartością: „Adres: Katowice, ul. Mariacka 5”, „Telefon: 32 888 88 88” oraz odnośnik pocztowy o treści „skontaktuj się” prowadzący do adresu [email protected].

    Lista nieuporządkowana to <ul>, a każdy punkt <li> (R.2.8). Odnośnik pocztowy ma w href przedrostek mailto: - kliknięcie otwiera program pocztowy z wpisanym adresatem (R.3.3).

    Typowe błędy

    href="[email protected]" bez mailto: przeglądarka traktuje jak nazwę pliku - to nie jest odnośnik pocztowy.

    index.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Kursy komputerowe - programowanie</h3>
            <table>
                <tr>
                    <th>Nazwa</th>
                    <th>Liczba godzin</th>
                    <th>Cena</th>
                </tr>
                <tr>
                    <td>Kurs React.js</td>
                    <td>220</td>
                    <td>5000</td>
                </tr>
                <tr>
                    <td>Kurs JavaScript</td>
                    <td>150</td>
                    <td>3000</td>
                </tr>
            </table>
            <h3>Adres do korespondencji</h3>
            <ul>
                <li>Adres: Katowice, ul. Mariacka 5</li>
                <li>Telefon: 32 888 88 88</li>
                <li><a href="mailto:[email protected]">skontaktuj się</a></li>
            </ul>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (index.html)
  23. Krok 23: Strona raty.html

    Kryteria: ,

    R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". Strona zawiera sekcje head i body

    R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego

    ok. 2 min
    Polecenie z arkusza

    Zawartość bloku głównego strony raty.html: Nagłówek trzeciego stopnia o treści „Oblicz miesięczną ratę”.

    Zapisz index.html jako raty.html - nagłówek, menu i stopka zostają takie same - i w bloku <main> zostaw tylko nowy nagłówek <h3>.

    raty.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  24. Krok 24: Pole wyboru „Kurs React.js”

    Kryteria: ,

    R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>

    R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki

    ok. 2 min
    Polecenie z arkusza

    Pole wyboru z etykietą „Kurs React.js”.

    Pole wyboru to <input type="checkbox">. Etykieta <label for="react"> jest powiązana z polem przez jego id - kliknięcie napisu też zaznacza pole (R.2.9). Klasa kontrolki od razu, bo arkusz przypisuje ją wszystkim kontrolkom tej strony (R.3.5). <br> przenosi następną kontrolkę do nowego wiersza, jak na ilustracji 5.

    raty.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  25. Krok 25: Pole wyboru „Kurs JavaScript”

    Kryteria: ,

    R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>

    R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki

    ok. 1 min
    Polecenie z arkusza

    Pole wyboru z etykietą „Kurs JavaScript”.

    Drugie pole wyboru z własnym id - skrypt będzie sprawdzał każde pole osobno.

    raty.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  26. Krok 26: Pole liczby rat

    Kryteria: , ,

    R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>

    R.3.4 Na stronie z ratami pole edycyjne jest typu number oraz jest zdefiniowane dla przycisku zdarzenie związane z jego wciśnięciem, które uruchamia funkcję skryptu (obsługa zdarzenia zdefiniowana w HTML np. onClick lub w skrypcie np.addEventListener zmienna.onClick = …)

    R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki

    ok. 1 min
    Polecenie z arkusza

    Pole edycyjne typu numerycznego poprzedzone etykietą: „Liczba rat: ”.

    Tym razem etykieta stoi przed polem. type="number" - pole numeryczne: przyjmie tylko liczbę i dostanie strzałki (R.3.4). Identyfikator installments (raty).

    raty.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  27. Krok 27: Lista rozwijana z miastami

    Kryteria: ,

    R.2.10 Na stronie z ratami w bloku głównym umieszczona jedna lista rozwijalna z 3 elementami, zastosowane znaczniki <select> i <option>

    R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki

    ok. 2 min
    Polecenie z arkusza

    Lista rozwijana z danymi: „Warszawa”, „Katowice”, „Gdańsk”.

    <select> z trzema <option> (R.2.10). Opcja bez atrybutu value ma za wartość swój tekst - skrypt dostanie wprost nazwę miasta.

    raty.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  28. Krok 28: Przycisk „Oblicz”

    Kryteria: , ,

    R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>

    R.3.4 Na stronie z ratami pole edycyjne jest typu number oraz jest zdefiniowane dla przycisku zdarzenie związane z jego wciśnięciem, które uruchamia funkcję skryptu (obsługa zdarzenia zdefiniowana w HTML np. onClick lub w skrypcie np.addEventListener zmienna.onClick = …)

    R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki

    ok. 1 min
    Polecenie z arkusza

    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.4). Na razie kliknięcie kończy się błędem w konsoli przeglądarki - funkcji jeszcze nie ma.

    raty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  29. Krok 29: Pusty akapit na wynik

    ok. 1 min
    Polecenie z arkusza

    Rozmieszczenie kontrolek zgodnie z ilustracją 5. Pusty paragraf do wyświetla wyniku działania skryptu.

    Pusty <p id="result"> pod przyciskiem - skrypt wpisze tu zdanie z wynikiem. Rozmieszczenie jak na ilustracji 5: oba pola wyboru, pole liczby rat, lista i przycisk - każde w osobnym wierszu dzięki <br>.

    raty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  30. Etap 3: Styl CSS

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

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

    Kryteria:

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

    ok. 1 min
    Polecenie z arkusza

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

    Utwórz style.css. Selektor * obejmuje wszystkie elementy strony (R.4.1).

    style.css CSS nowy plik
    * {
        font-family: Helvetica;
    }
    Podgląd strony po tym kroku (index.html)
  31. Krok 31: Tło strony

    Kryteria:

    R.4.2 Ustawiony kolor tła #EAEAEA dla selektora body oraz #625B5B dla bloków menu i stopki

    ok. 1 min
    Polecenie z arkusza

    Dla selektora ciała strony: kolor tła #EAEAEA.

    Selektor znacznika body - arkusz wymaga stylu ciała strony wyłącznie przez selektor znacznika (R.4.2).

    style.css CSS zmienione: 3 linie
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    Podgląd strony po tym kroku (index.html)
  32. Krok 32: Menu i stopka

    Kryteria: , , ,

    R.4.2 Ustawiony kolor tła #EAEAEA dla selektora body oraz #625B5B dla bloków menu i stopki

    R.4.3 Ustawiony biały kolor czcionki dla bloków menu i stopki

    R.4.6 Ustawione marginesy wewnętrzne (padding) 20px dla bloków menu i stopki oraz margines zewnętrzny lewy (margin-left) 40px dla listy punktowanej oraz tabeli

    R.4.7 Ustawione wyrównanie tekstu do środka dla bloków menu, stopki i tabeli oraz obramowanie tabeli: 1px dashed #625B5B

    ok. 2 min
    Polecenie z arkusza

    Wspólne dla bloków menu i stopki: kolor tła #625B5B, biały kolor czcionki, marginesy wewnętrzne 20 px, wyrównanie tekstu do środka.

    Jedna reguła dla dwóch selektorów oddzielonych przecinkiem: nav, footer.

    style.css CSS zmienione: 6 linii
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    nav, footer {
        background-color: #625B5B;
        color: white;
        padding: 20px;
        text-align: center;
    }
    Podgląd strony po tym kroku (index.html)
  33. Krok 33: Obraz: pełna szerokość

    Kryteria:

    R.4.4 Ustawiona szerokość 100% dla selektora img oraz 60% dla selektora table

    ok. 1 min
    Polecenie z arkusza

    Dla selektora obrazu: szerokość 100%.

    Baner wypełnia całą szerokość okna - przy każdej szerokości ekranu, z zachowaniem proporcji (R.4.4).

    style.css CSS zmienione: 3 linie
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    nav, footer {
        background-color: #625B5B;
        color: white;
        padding: 20px;
        text-align: center;
    }
    img {
        width: 100%;
    }
    Podgląd strony po tym kroku (index.html)
  34. Krok 34: Lista: margines i punktor okrąg

    Kryteria: ,

    R.4.5 Ustawiony typ punktora circle dla selektora ul

    R.4.6 Ustawione marginesy wewnętrzne (padding) 20px dla bloków menu i stopki oraz margines zewnętrzny lewy (margin-left) 40px dla listy punktowanej oraz tabeli

    ok. 1 min
    Polecenie z arkusza

    Dla selektora listy punktowanej: margines zewnętrzny lewy 40 px, typ punktora okrąg.

    Punktor „okrąg” to circle - puste kółko zamiast domyślnego pełnego disc (R.4.5, R.4.6).

    style.css CSS zmienione: 4 linie
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    nav, footer {
        background-color: #625B5B;
        color: white;
        padding: 20px;
        text-align: center;
    }
    img {
        width: 100%;
    }
    ul {
        margin-left: 40px;
        list-style-type: circle;
    }
    Podgląd strony po tym kroku (index.html)
  35. Krok 35: Odnośniki w menu

    Kryteria:

    R.4.9 Dla odsyłaczy jedynie w bloku menu: czcionka pogrubiona, kolor tła #EAEAEA, kolor czcionki #625B5B, marginesy wewnętrzne 10px, marginesy zewnętrzne 50px, zaokrąglenie rogów 20px

    ok. 2 min
    Polecenie z arkusza

    Dla odsyłaczy jedynie w bloku menu: czcionka pogrubiona, kolor tła #EAEAEA, kolor czcionki #625B5B, marginesy wewnętrzne 10 px, marginesy zewnętrzne 50 px, zaokrąglenie rogów 20 px.

    „Jedynie w bloku menu” to selektor potomka nav a - odnośnik pocztowy w bloku głównym zostaje zwykły, niebieski. border-radius: 20px zaokrągla rogi tła, więc odnośniki wyglądają jak przyciski z ilustracji 3 (R.4.9).

    Typowe błędy

    Sam selektor a zmieni też odnośnik „skontaktuj się” - kryterium R.4.9 mówi „jedynie w bloku menu”.

    style.css CSS zmienione: 8 linii
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    nav, footer {
        background-color: #625B5B;
        color: white;
        padding: 20px;
        text-align: center;
    }
    img {
        width: 100%;
    }
    ul {
        margin-left: 40px;
        list-style-type: circle;
    }
    nav a {
        font-weight: bold;
        background-color: #EAEAEA;
        color: #625B5B;
        padding: 10px;
        margin: 50px;
        border-radius: 20px;
    }
    Podgląd strony po tym kroku (index.html)
  36. Krok 36: Odnośnik pod kursorem

    Kryteria:

    R.4.10 Gdy kursor myszy znajdzie się na odsyłaczu w menu, jego kolor tła zmienia się na #625B5B, czcionki na #EAEAEA oraz pojawia się obramowanie 1px solid #EAEAEA

    ok. 2 min
    Polecenie z arkusza

    Gdy kursor myszy znajdzie się na odsyłaczu w menu jego kolor tła zmienia się na #625B5B, czcionki na #EAEAEA oraz pojawia się obramowanie linią ciągłą o szerokości 1 px i kolorze #EAEAEA.

    Pseudoklasa :hover działa, dopóki kursor jest nad elementem: kolory się odwracają, a ramka 1px solid obrysowuje zaokrąglony przycisk (R.4.10). Najedź na odnośnik w podglądzie.

    style.css CSS zmienione: 5 linii
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    nav, footer {
        background-color: #625B5B;
        color: white;
        padding: 20px;
        text-align: center;
    }
    img {
        width: 100%;
    }
    ul {
        margin-left: 40px;
        list-style-type: circle;
    }
    nav a {
        font-weight: bold;
        background-color: #EAEAEA;
        color: #625B5B;
        padding: 10px;
        margin: 50px;
        border-radius: 20px;
    }
    nav a:hover {
        background-color: #625B5B;
        color: #EAEAEA;
        border: 1px solid #EAEAEA;
    }
    Podgląd strony po tym kroku (index.html)
  37. Krok 37: Tabela: ramka kreskowa, szerokość, margines

    Kryteria: , ,

    R.4.4 Ustawiona szerokość 100% dla selektora img oraz 60% dla selektora table

    R.4.6 Ustawione marginesy wewnętrzne (padding) 20px dla bloków menu i stopki oraz margines zewnętrzny lewy (margin-left) 40px dla listy punktowanej oraz tabeli

    R.4.7 Ustawione wyrównanie tekstu do środka dla bloków menu, stopki i tabeli oraz obramowanie tabeli: 1px dashed #625B5B

    ok. 2 min
    Polecenie z arkusza

    Dla selektora tabeli: obramowanie linią kreskową o grubości 1 px i kolorze #625B5B, szerokość 60%, margines zewnętrzny lewy 40 px, wyrównanie tekstu do środka.

    Linia kreskowa to dashed (kropkowa byłaby dotted). Ramka dotyczy samej tabeli, więc - jak na ilustracji 4 - kreski biegną tylko dookoła, bez linii między komórkami (R.4.4, R.4.6, R.4.7).

    style.css CSS zmienione: 6 linii
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    nav, footer {
        background-color: #625B5B;
        color: white;
        padding: 20px;
        text-align: center;
    }
    img {
        width: 100%;
    }
    ul {
        margin-left: 40px;
        list-style-type: circle;
    }
    nav a {
        font-weight: bold;
        background-color: #EAEAEA;
        color: #625B5B;
        padding: 10px;
        margin: 50px;
        border-radius: 20px;
    }
    nav a:hover {
        background-color: #625B5B;
        color: #EAEAEA;
        border: 1px solid #EAEAEA;
    }
    table {
        border: 1px dashed #625B5B;
        width: 60%;
        margin-left: 40px;
        text-align: center;
    }
    Podgląd strony po tym kroku (index.html)
  38. Krok 38: Klasa kontrolki

    Kryteria:

    R.4.8 Zdefiniowana klasa kontrolki o cechach: marginesy zewnętrzne 5px

    ok. 1 min
    Polecenie z arkusza

    Dla klasy o nazwie kontrolki: marginesy zewnętrzne 5 px. Klasa jest przypisana do wszystkich kontrolek na stronie raty.html (pól wyboru, pola edycyjnego, listy rozwijalnej i przycisku).

    Selektor klasy zaczyna się kropką: .kontrolki (R.4.8). Klasa została już przypisana wszystkim kontrolkom przy budowie strony - teraz rozsuwają się o 5 px.

    style.css CSS zmienione: 3 linie
    * {
        font-family: Helvetica;
    }
    body {
        background-color: #EAEAEA;
    }
    nav, footer {
        background-color: #625B5B;
        color: white;
        padding: 20px;
        text-align: center;
    }
    img {
        width: 100%;
    }
    ul {
        margin-left: 40px;
        list-style-type: circle;
    }
    nav a {
        font-weight: bold;
        background-color: #EAEAEA;
        color: #625B5B;
        padding: 10px;
        margin: 50px;
        border-radius: 20px;
    }
    nav a:hover {
        background-color: #625B5B;
        color: #EAEAEA;
        border: 1px solid #EAEAEA;
    }
    table {
        border: 1px dashed #625B5B;
        width: 60%;
        margin-left: 40px;
        text-align: center;
    }
    .kontrolki {
        margin: 5px;
    }
    Podgląd strony po tym kroku (raty.html)
  39. Krok 39: 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, obrazu, listy i 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. Bloki stoją jeden pod drugim - tak układa je przeglądarka bez żadnego float czy flex, więc układ jest zgodny z ilustracją 3 (R.3.1). A zgodnie z uwagą arkusza style body, img, ul i table są zapisane selektorami znaczników, bez klas i identyfikatorów - klucz uznaje R.4.2, R.4.4 i R.4.5 tylko w tej postaci.

    Typowe błędy

    Styl tabeli zapisany jako klasa .tabela albo identyfikator #tabela wygląda tak samo, ale klucz go nie uznaje (uwaga przy R.4).

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

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

    Krok 40: Funkcja calculate wywoływana przyciskiem

    Kryteria:

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

    ok. 2 min
    Polecenie z arkusza

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

    Skrypt piszesz w <script> na końcu <body> strony raty.html - wykonuje się w przeglądarce, bez serwera. Funkcja ma tę samą nazwę, co w onclick przycisku: calculate (oblicz). Na razie jest pusta - kliknięcie „Oblicz” nie powoduje już błędu, ale niczego nie robi.

    raty.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
        <script>
            function calculate() {
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  41. Krok 41: Kwota za kurs React.js

    Kryteria:

    R.5.2 Skrypt pobiera dane z przynajmniej jednej kontrolki, np. funkcja document.getElementById z parametrem, który zdefiniowany jest w kontrolce jako id

    ok. 2 min
    Polecenie z arkusza

    Pobiera dane z kontrolek. Ustala całkowitą kwotę za wybrane kursy na podstawie cen z tabeli z ilustracji 4.

    Zmienna total (suma) zaczyna od zera. document.getElementById("react") znajduje pole wyboru, a jego właściwość checked ma wartość true, gdy pole jest zaznaczone. Wtedy doliczasz cenę z tabeli: 5000 (R.5.2).

    raty.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
        <script>
            function calculate() {
                let total = 0;
                if (document.getElementById("react").checked) {
                    total = total + 5000;
                }
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  42. Krok 42: Kwota za kurs JavaScript

    Kryteria:

    R.5.3 Skrypt ustala koszt wszystkich zaznaczonych w polu wyboru kursów np. poprzez sprawdzenie warunku zaznaczenia danego kursu (pole checked == true). Ceny: React.js - 5000, JavaScript 3000

    ok. 2 min
    Polecenie z arkusza

    Ustala całkowitą kwotę za wybrane kursy na podstawie cen z tabeli z ilustracji 4.

    Drugi warunek, niezależny od pierwszego (osobny if, nie else if): zaznaczone oba kursy dają 5000 + 3000 = 8000, jeden - jego cenę, żaden - 0 (R.5.3).

    Typowe błędy

    else if zamiast drugiego if liczy tylko pierwszy zaznaczony kurs - przy obu zaznaczonych wynik to 5000 zamiast 8000.

    raty.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
        <script>
            function calculate() {
                let total = 0;
                if (document.getElementById("react").checked) {
                    total = total + 5000;
                }
                if (document.getElementById("javascript").checked) {
                    total = total + 3000;
                }
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  43. Krok 43: Liczba rat i wysokość raty

    Kryteria:

    R.5.4 Skrypt pobiera wpisaną w pole edycyjne liczbę rat i oblicza koszt jednej raty dzieląc koszt kursów przez liczbę rat

    ok. 2 min
    Polecenie z arkusza

    Oblicza koszt jednej raty na podstawie kwoty całkowitej. Dla uproszczenia kwota całkowita jest dzielona przez podaną liczbę rat.

    .value pola liczbowego to wpisana liczba (jako tekst, np. „10”). Operator / w JavaScripcie sam zamienia ją na liczbę, więc total / installments od razu daje wysokość raty: 8000 / 10 = 800 (R.5.4).

    raty.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
        <script>
            function calculate() {
                let total = 0;
                if (document.getElementById("react").checked) {
                    total = total + 5000;
                }
                if (document.getElementById("javascript").checked) {
                    total = total + 3000;
                }
                let installments = document.getElementById("installments").value;
                let rate = total / installments;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  44. Krok 44: Wybrane miasto

    Kryteria:

    R.5.5 Pod przyciskiem jest wyświetlany efekt działania skryptu, którego fragment dotyczący miasta zawiera nazwę miasta pobraną z listy rozwijalnej (wystarczy sprawdzić dwa razy dla różnych miast)

    ok. 1 min
    Polecenie z arkusza

    <miasto> oznacza wybór z listy rozwijalnej.

    .value listy rozwijanej to wartość wybranej opcji - w tym rozwiązaniu tekst opcji, czyli nazwa miasta.

    raty.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
        <script>
            function calculate() {
                let total = 0;
                if (document.getElementById("react").checked) {
                    total = total + 5000;
                }
                if (document.getElementById("javascript").checked) {
                    total = total + 3000;
                }
                let installments = document.getElementById("installments").value;
                let rate = total / installments;
                let city = document.getElementById("city").value;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  45. Krok 45: Zdanie z wynikiem pod przyciskiem

    Kryteria: , , ,

    R.5.5 Pod przyciskiem jest wyświetlany efekt działania skryptu, którego fragment dotyczący miasta zawiera nazwę miasta pobraną z listy rozwijalnej (wystarczy sprawdzić dwa razy dla różnych miast)

    R.5.6 Pod przyciskiem jest wyświetlany efekt działania skryptu: obliczony w skrypcie koszt całkowity

    R.5.7 Pod przyciskiem jest wyświetlany efekt działania skryptu: liczba rat oraz koszt jednej raty (sprawdzić dla dwóch różnych liczb )

    R.5.8 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. 3 min
    Polecenie z arkusza

    Wyświetla pod przyciskiem w paragrafie treść: „Kurs odbędzie się w <miasto>. Koszt całkowity: <kwota> zł. Płacisz <liczba> rat po <rata> zł”, gdzie <kwota> oznacza obliczoną kwotę całkowitą, <liczba> oznacza podaną liczbę rat, a <rata> oznacza wyliczoną ratę.

    Zdanie sklejasz operatorem + ze stałych napisów i czterech zmiennych, a gotowe wpisujesz do pustego akapitu result przez innerHTML (tabela 1). Spacje i kropki są w napisach - po złożeniu nie może zabraknąć odstępu przed liczbą. Zaznacz w podglądzie oba kursy, wpisz 10, wybierz Katowice i kliknij „Oblicz”: „Kurs odbędzie się w Katowice. Koszt całkowity: 8000 zł. Płacisz 10 rat po 800 zł” - jak na ilustracji 5. Sprawdź też inne miasto i inną liczbę rat, tak jak zrobi to egzaminator (R.5.5 - R.5.7). Nazwy zmiennych i funkcji są po angielsku i mówią, co przechowują (R.5.8).

    raty.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" onclick="calculate()">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
        <script>
            function calculate() {
                let total = 0;
                if (document.getElementById("react").checked) {
                    total = total + 5000;
                }
                if (document.getElementById("javascript").checked) {
                    total = total + 3000;
                }
                let installments = document.getElementById("installments").value;
                let rate = total / installments;
                let city = document.getElementById("city").value;
                document.getElementById("result").innerHTML = "Kurs odbędzie się w " + city + ". Koszt całkowity: " + total
                    + " zł. Płacisz " + installments + " rat po " + rate + " zł";
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  46. Etap 5: Dobre praktyki (poza kluczem)

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

    Krok 46: Słuchacz zdarzenia, sprawdzenie liczby rat, grosze

    ok. 4 min
    Polecenie z arkusza

    Przycisk o treści „Oblicz”, którego wybranie uruchamia skrypt.

    Cztery poprawki z prawdziwych projektów:

    • addEventListener("click", calculate) zamiast atrybutu onclick w HTML: zachowanie przycisku jest w skrypcie, a HTML opisuje tylko treść. Przycisk dostaje identyfikator calculate.
    • Sprawdzenie liczby rat: puste pole dawało „rat po Infinity zł”, a 0 lub liczba ujemna - bzdurną ratę. Number() zamienia tekst na liczbę, a Number.isInteger z warunkiem >= 1 przepuszcza tylko sensowną liczbę rat.
    • toFixed(2) - rata w złotych i groszach: 8000 / 3 to 2666.67, a nie 2666.6666666666665.
    • textContent zamiast innerHTML - wpisujesz zwykły tekst, więc nic nie zostanie zinterpretowane jako HTML.

    Stare linie zostają w komentarzach. Na egzaminie wystarczy wersja wcześniejsza - klucz przyjmuje onclick (R.3.4), a zaokrąglenia i sprawdzania nie wymaga.

    raty.html HTML zmienione: 13 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Kursy komputerowe</title>
        <link rel="stylesheet" href="style.css">
    </head>
    <body>
        <header>
            <img src="baner.png" alt="kursy komputerowe">
        </header>
        <nav>
            <a href="index.html">Strona główna</a>
            <a href="raty.html">Koszt rat</a>
            <a href="https://moje-szkolenia.pl/">Nasz partner</a>
        </nav>
        <main>
            <h3>Oblicz miesięczną ratę</h3>
            <input type="checkbox" id="react" class="kontrolki">
            <label for="react">Kurs React.js</label><br>
            <input type="checkbox" id="javascript" class="kontrolki">
            <label for="javascript">Kurs JavaScript</label><br>
            <label for="installments">Liczba rat: </label>
            <input type="number" id="installments" class="kontrolki"><br>
            <select id="city" class="kontrolki">
                <option>Warszawa</option>
                <option>Katowice</option>
                <option>Gdańsk</option>
            </select><br>
            <button class="kontrolki" id="calculate">Oblicz</button>
            <p id="result"></p>
        </main>
        <footer>
            <p>Autor strony: Bartosz Bryniarski</p>
        </footer>
        <script>
            function calculate() {
                let total = 0;
                if (document.getElementById("react").checked) {
                    total = total + 5000;
                }
                if (document.getElementById("javascript").checked) {
                    total = total + 3000;
                }
                let installments = Number(document.getElementById("installments").value);
                let result = document.getElementById("result");
                if (!Number.isInteger(installments) || installments < 1) {
                    result.textContent = "Podaj liczbę rat - liczbę całkowitą większą od zera.";
                    return;
                }
                let rate = (total / installments).toFixed(2);
                // let rate = total / installments;
                let city = document.getElementById("city").value;
                result.textContent = "Kurs odbędzie się w " + city + ". Koszt całkowity: " + total
                    + " zł. Płacisz " + installments + " rat po " + rate + " zł";
                // document.getElementById("result").innerHTML = ...
            }
    
            document.getElementById("calculate").addEventListener("click", calculate);
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (raty.html)
  47. Etap 6: Oddanie pracy

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

    Krok 47: 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 folderze z numerem zdającego powinny znajdować się pliki: baner.png, import.jpg, index.html, kw1.png, kw2.png, kw3.png, kw4.png, kwerendy.txt, raty.html, przeglądarka.txt, style.css, ewentualnie inne przygotowane pliki.

    W przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz strony. Strony w tym arkuszu nie wymagają serwera - otwierają się wprost z dysku.

    Sprawdź listę plików z arkusza, 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 46.

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.