Przejdź do głównej treści
INF.03-03-26.06-SGCzerwiec 2026 · 49 kroków · ok. 87 min · 39 kryteriów z klucza

Rozwiązanie krok po kroku: Karta produktu sklepu meblowego (Nowoczesny kod (grid, JS))

To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza sklep z widokiem, cztery zapytania, trzy fotele wycięte z jednej grafiki, strony kartaProduktu.html i sklep.html, okno z powiększeniem - i tak samo spełnia każde kryterium klucza. Inna jest droga:

  • sekcja i artykuł na siatce CSS (grid-template-columns: 50% 50%) zamiast display: flex, kolory z arkusza w zmiennych CSS, miniatury w osobnym bloku zamiast znacznika <br>,
  • skrypt w osobnym pliku skrypt.js dołączonym z atrybutem defer: HTML nie zawiera ani jednego onclick, a skrypt sam przypina obsługę kliknięć (addEventListener) i trzyma elementy w stałych (const),
  • okno zamyka się także klawiszem Esc i kliknięciem w tło, a obrazy, etykieta i przycisk mają opisy dla czytników ekranu.

Dwie rzeczy zostają takie jak w wersji podstawowej, bo sprawdza je klucz: okno pokazuje i chowa zmiana style.display (R.5.4), a jego położenie to position: fixed z left, top i z-index (R.4.8).

Wersja podstawowa (zakładka obok) pisze skrypt atrybutami onclick i dopiero na końcu go poprawia; tu kod jest od razu taki, jak w prawdziwym projekcie. Na końcu jest krótkie porównanie obu wersji i podpowiedź, którą wybrać na egzaminie.

Baza i grafika pochodzą z prawdziwego archiwum pliki3 (załącznik na stronie arkusza, hasło w treści zadania). Skrypt został sprawdzony w prawdziwej przeglądarce: kliknięcie trzeciej miniatury, obrazu głównego, znaku ×, klawisza Esc i tła okna.

Jak liczą się punkty. Klucz ma 39 kryteriów (R.1.1 - R.5.7), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 30 punktów. Przy każdym kroku jest napisane, które kryteria spełnia.

  1. Etap 1: Baza danych

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

    Krok 1: Baza danych sklep

    ok. 2 min
    Polecenie z arkusza

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

    Rozpakuj pliki3.7z z pulpitu (hasło z treści zadania) i załóż folder z numerem zdającego. W phpMyAdmin: Nowa, nazwa sklep, porównywanie utf8_polish_ci. W SQL:

    CREATE DATABASE sklep CHARACTER SET utf8 COLLATE utf8_polish_ci;
    
  2. Krok 2: Import tabel z pliku sklep.sql

    ok. 2 min
    Polecenie z arkusza

    Do utworzonej bazy zaimportuj tabele z pliku sklep.sql.

    Zaznacz bazę sklep, Import → sklep.sql → Wykonaj. Trzy tabele z ilustracji 1: klienci, meble (pole kategoria: 1 - sofy, 2 - fotele, 3 - komody; czyNowy: 1 nowy, 0 używany) i pośrednicząca zakupy relacji m:n.

  3. Krok 3: Zrzut ekranu import.png

    Kryteria:

    R.1.1 Wykonany import tabel do bazy danych sklep - plik 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.

    Cały ekran, zapis jako import.png - w tym arkuszu wszystkie zrzuty są w PNG.

    Typowe błędy

    Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany.

  4. Krok 4: Zapytanie 1: nowe meble do 1000 zł

    Kryteria: ,

    R.1.2 W pliku kwerendy.txt zapisane co najmniej jedno zapytanie SQL, wynikające z treści zadania

    R.1.3 Wykonane zapytanie 1 wybierające jedynie nazwę, styl i cene tylko nowych mebli, których cena nie przekracza 1000 zł. Rekordy powinny być posortowane począwszy od ceny najniższej. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT nazwa, styl, cena FROM meble WHERE czyNowy = 1 AND cena <= 1000 ORDER BY cena; oraz na zrzucie widoczne są dokładnie 3 wiersze, kolejno ceny: 700, 800, 1000

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 1: wybierające jedynie nazwę, styl i cenę tylko nowych mebli, których cena nie przekracza 1000 zł. Rekordy powinny być posortowane począwszy od najniższej ceny.

    Każda klauzula w osobnej linii. „Nie przekracza” to <= - mebel za dokładnie 1000 zł też się liczy. ASC wpisane wprost pokazuje, że kierunek sortowania jest zamierzony. Wynik: 700, 800, 1000 (R.1.3), zrzut kw1.png.

    Typowe błędy

    cena < 1000 gubi sofę za dokładnie 1000 zł.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT nazwa, styl, cena
    FROM meble
    WHERE czyNowy = 1
      AND cena <= 1000
    ORDER BY cena ASC;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 4
  5. Krok 5: Zapytanie 2: widok komody

    Kryteria:

    R.1.4 Wykonane zapytanie 2 tworzące widok o nazwie komody zawierający jedynie pola idMeble, nazwa, kategoria, cena z tabeli meble jedynie dla kategorii równej 3. W pliku z kwerendami lub na zrzucie istnieje zapis np. CREATE VIEW komody AS SELECT idMeble, nazwa, kategoria, cena FROM meble WHERE kategoria = 3; oraz na zrzucie widoczny jest widok komody z 5 rekordami o idMeble: 4, 5, 6 ,7 ,8 lub komunikat o poprawnie wykonanym zapytaniu

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 2: tworzące widok (perspektywę) o nazwie komody zawierający jedynie pola idMeble, nazwa, kategoria, cena z tabeli meble jedynie dla kategorii równej 3. W pliku ze zrzutem należy przedstawić zawartość widoku komody.

    Widok to zapisane zapytanie, którego używa się jak tabeli. Samo CREATE VIEW nie zwraca wierszy, więc na zrzut trzeba pokazać zawartość: kliknij komody w lewym panelu albo wykonaj SELECT * FROM komody - pięć komód o identyfikatorach 4-8 (R.1.4). Zrzut kw2.png.

    Typowe błędy

    Drugie wykonanie CREATE VIEW kończy się błędem „Table komody already exists” - do poprawiania widoku służy CREATE OR REPLACE VIEW.

    kwerendy.txt Tekst zmienione: 6 linii
    -- Zapytanie 1
    SELECT nazwa, styl, cena
    FROM meble
    WHERE czyNowy = 1
      AND cena <= 1000
    ORDER BY cena ASC;
    
    -- Zapytanie 2
    CREATE VIEW komody AS
    SELECT idMeble, nazwa, kategoria, cena
    FROM meble
    WHERE kategoria = 3;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 5
  6. Krok 6: Zapytanie 3: średnia, najniższa i najwyższa cena komód

    Kryteria: ,

    R.1.5 W zapytaniu 3 zastosowano widok komody

    R.1.6 Wykonane zapytanie 3 zliczające cenę średnią, minimalną i maksymalną. Aliasy: „Średnia cena komód”, „Minimalna”, „Maksymalna”. Średnia cena dowolnie zaokrąglona do liczby całkowitej. Zapytanie stosuje widok lub warunek. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT ROUND(AVG(cena), 0) AS "Średnia cena komód", MIN(cena) AS "Minimalna", MAX(cena) AS "Maksymalna" FROM komody; lub ... FROM meble WHERE kategoria = 3;(AS opcjonalnie) oraz na zrzucie widoczne są wartości: 2180, 700, 4000

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 3: zliczające cenę średnią, minimalną i maksymalną. Nazwy kolumn (aliasy): Średnia cena - „Średnia cena komód”, minimalna cena - „Minimalna”, maksymalna cena - „Maksymalna”. Średnia cena powinna być dowolnie zaokrąglona do liczby całkowitej. W zapytaniu należy posłużyć się utworzonym widokiem.

    Trzy funkcje agregujące, każda w osobnej linii z aliasem w cudzysłowie (spacje i polskie litery). ROUND bez drugiego argumentu zaokrągla do całości - bez niego średnia to 2180.0000. FROM komody - widok, w którym warunek na kategorię już jest (R.1.5, R.1.6). Wynik: 2180, 700, 4000, zrzut kw3.png.

    Typowe błędy

    FROM meble WHERE kategoria = 3 daje te same liczby, ale arkusz każe użyć widoku - kryterium R.1.5 przepada.

    kwerendy.txt Tekst zmienione: 6 linii
    -- Zapytanie 1
    SELECT nazwa, styl, cena
    FROM meble
    WHERE czyNowy = 1
      AND cena <= 1000
    ORDER BY cena ASC;
    
    -- Zapytanie 2
    CREATE VIEW komody AS
    SELECT idMeble, nazwa, kategoria, cena
    FROM meble
    WHERE kategoria = 3;
    
    -- Zapytanie 3
    SELECT ROUND(AVG(cena)) AS "Średnia cena komód",
           MIN(cena) AS "Minimalna",
           MAX(cena) AS "Maksymalna"
    FROM komody;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 6
  7. Krok 7: Zapytanie 4: usunięcie klienta

    Kryteria:

    R.1.7 Wykonane zapytanie 4 usuwające z tabeli klienci rekord, dla którego imię to Tomasz, a nazwisko Nowak. W pliku z kwerendami lub na zrzucie istnieje zapis np. DELETE FROM klienci WHERE imie = "Tomasz" AND nazwisko = "Nowak"; oraz na zrzucie jest widoczny komunikat o poprawnie wykonanym zapytaniu lub w tabeli klienci są 2 rekordy bez Tomasza Nowaka (gdy kwerenda sprawdzana w bazie przy następnych pracach uwzględnić brak rekordu )

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 4: usuwające z tabeli klienci rekord, dla którego imię to Tomasz, a nazwisko Nowak.

    DELETE z dwoma warunkami (AND) i tekstem w apostrofach. phpMyAdmin pyta o potwierdzenie i pokazuje „Usuniętych rekordów: 1” - zostają dwie klientki (R.1.7). Zrzut kw4.png.

    Typowe błędy

    DELETE FROM klienci; bez WHERE usuwa wszystkich klientów. Przed wykonaniem DELETE dobrze jest uruchomić SELECT z tym samym warunkiem i zobaczyć, co zostanie usunięte.

    kwerendy.txt Tekst zmienione: 5 linii
    -- Zapytanie 1
    SELECT nazwa, styl, cena
    FROM meble
    WHERE czyNowy = 1
      AND cena <= 1000
    ORDER BY cena ASC;
    
    -- Zapytanie 2
    CREATE VIEW komody AS
    SELECT idMeble, nazwa, kategoria, cena
    FROM meble
    WHERE kategoria = 3;
    
    -- Zapytanie 3
    SELECT ROUND(AVG(cena)) AS "Średnia cena komód",
           MIN(cena) AS "Minimalna",
           MAX(cena) AS "Maksymalna"
    FROM komody;
    
    -- Zapytanie 4
    DELETE FROM klienci
    WHERE imie = 'Tomasz'
      AND nazwisko = 'Nowak';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 7
  8. Etap 2: Grafika i strona HTML

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

    Krok 8: Grafika fotel1.png: wycięcie pierwszego fotela

    ok. 3 min
    Polecenie z arkusza

    Z grafiki fotele.png należy wyciąć trzy fotele z pierwszej kolumny i nazwać kolejno fotel1.png, fotel2.png, fotel3.png.

    fotele.png ma przezroczyste tło. W GIMP-ie Zaznaczenie prostokątne wokół górnego fotela z lewej kolumny, Obraz → Przytnij do zaznaczenia, Eksportuj jako fotel1.png, cofnij przycięcie (Ctrl+Z) i tak samo dla kolejnych.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Kadr przy samych krawędziach, bez skalowania

    ok. 2 min
    Polecenie z arkusza

    Fotele powinny być obcięte bezpośrednio przy krawędziach, przezroczystość powinna być zachowana. Obrazów nie należy skalować.

    Obraz → Przytnij do zawartości odcina przezroczyste brzegi, więc kadr dotyka fotela z każdej strony. Bez skalowania: fotel1.png ma 539 × 489 px. Eksport do PNG zachowuje przezroczystość.

    Typowe błędy

    JPEG zamienia przezroczyste tło na białe (R.2.1).

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

  10. Krok 10: Grafiki fotel2.png i fotel3.png

    Kryteria:

    R.2.1 Utworzone 3 grafiki foteli (fotel1.png, fotel2.png, fotel3.png) zgodnie z ilustracją 4 arkusza egzaminacyjnego. Przynajmniej jedna grafika jest przycięta do wszystkich krawędzi fotela (sprawdzić bez powiększania grafiki) oraz jej tło jest przezroczyste

    ok. 3 min
    Polecenie z arkusza

    Z grafiki fotele.png należy wyciąć trzy fotele z pierwszej kolumny i nazwać kolejno fotel1.png, fotel2.png, fotel3.png.

    Tak samo środkowy (543 × 488 px) i dolny fotel (554 × 552 px) z lewej kolumny (R.2.1).

    Podgląd strony po tym kroku
    Podgląd strony po kroku 10
  11. Krok 11: Strona sklep.html w budowie

    ok. 2 min
    Polecenie z arkusza

    Witryna składa się z dwóch stron: kartaProduktu.html i sklep.html. Na stronie sklep.html znajduje się jedynie napis „strona w trakcie budowy”.

    Sam napis w pełnym szkielecie HTML5 - z językiem, kodowaniem i tytułem karty. Odnośnik „Do strony głównej” będzie miał dokąd prowadzić.

    sklep.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Sklep meblowy</title>
    </head>
    <body>
        <p>strona w trakcie budowy</p>
    </body>
    </html>
    Podgląd strony po tym kroku (sklep.html)
  12. Krok 12: Plik kartaProduktu.html w HTML5

    Kryteria:

    R.2.2 Istnieją pliki kartaProduktu.html i sklep.html oraz w pliku kartaProduktu.html znajduje się deklaracja HTML5 <!DOCTYPE HTML> i deklaracja języka zawartości: polski np. <html lang="pl">

    ok. 1 min
    Polecenie z arkusza

    Cechy strony kartaProduktu.html: zapisana w języku HTML5.

    Plik kartaProduktu.html w folderze zdającego. <!DOCTYPE html> włącza tryb standardów HTML5, dalej szkielet: <html>, <head> i <body>.

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

    Kryteria:

    R.2.2 Istnieją pliki kartaProduktu.html i sklep.html oraz w pliku kartaProduktu.html znajduje się deklaracja HTML5 <!DOCTYPE HTML> i deklaracja języka zawartości: polski np. <html lang="pl">

    ok. 1 min
    Polecenie z arkusza

    Zadeklarowany polski język zawartości witryny.

    lang="pl" w <html> - czytnik ekranu czyta polską wymową, przeglądarka dobiera słownik i dzielenie wyrazów.

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

    Kryteria:

    R.2.3 W sekcji head znajduje się jawnie podany standard kodowania polskich znaków i tytuł strony "Fotel"

    ok. 1 min
    Polecenie z arkusza

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

    <meta charset="UTF-8"> jako pierwszy element <head> - „jawnie” znaczy wpisane w kodzie, nie zostawione domysłowi przeglądarki. Plik zapisz też w UTF-8.

    kartaProduktu.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 (kartaProduktu.html)
  15. Krok 15: Tytuł strony

    Kryteria:

    R.2.3 W sekcji head znajduje się jawnie podany standard kodowania polskich znaków i tytuł strony "Fotel"

    ok. 1 min
    Polecenie z arkusza

    Tytuł strony „Fotel”.

    <title>Fotel</title> - napis na karcie przeglądarki. Obok <meta name="viewport">: bez niego telefon pokazałby stronę pomniejszoną jak na monitorze. Arkusz tego nie wymaga, a w każdym współczesnym szablonie ta linia jest.

    kartaProduktu.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  16. Krok 16: Podpięcie arkusza stylów

    Kryteria:

    R.3.2 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl.css formatowanie CSS pochodzi jedynie z tego arkusza

    ok. 1 min
    Polecenie z arkusza

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

    <link rel="stylesheet" href="styl.css"> - nazwa dokładnie z arkusza. Cały wygląd będzie w tym pliku, w HTML nie ma ani jednego atrybutu style.

    Typowe błędy

    Zła nazwa w href to brak stylów, a wtedy cały rezultat R.4 przepada.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  17. Krok 17: Plik skrypt.js dołączony z atrybutem defer

    ok. 2 min
    Polecenie z arkusza

    Skrypt działający po stronie klienta: zapisany w języku JavaScript.

    Skrypt w osobnym pliku skrypt.js - tak jak style w styl.css: HTML opisuje treść, CSS wygląd, a JavaScript zachowanie. Arkusz pozwala na dodatkowe pliki („ewentualnie inne przygotowane pliki”).

    <script src="skrypt.js" defer> stoi w <head>, a defer każe przeglądarce pobrać plik od razu, ale wykonać go dopiero, gdy cały HTML jest wczytany. Dzięki temu skrypt znajdzie wszystkie elementy strony, choć jest dołączony na górze, i nie wstrzymuje wyświetlania treści. Plik ma na razie tylko komentarz.

    Typowe błędy

    Skrypt w <head> bez defer wykona się przed wczytaniem <body> - document.querySelector nie znajdzie jeszcze obrazów i zwróci null.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
    </body>
    </html>
    skrypt.js JavaScript nowy plik
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    Podgląd strony po tym kroku (kartaProduktu.html)
  18. Krok 18: Bloki semantyczne

    Kryteria:

    R.2.4 W sekcji body zdefiniowany jest podział na bloki za pomocą semantycznych znaczników HTML5: header, main -> section + article, footer (dopuszcza się stosowanie bloków pomocniczych, nie należy brać pod uwagę bloku okna)

    ok. 2 min
    Polecenie z arkusza

    Podział strony na bloki: nagłówkowy, główny i stopkę. Blok główny zawiera blok sekcji i blok artykułu. Podział zrealizowany za pomocą semantycznych znaczników języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków był zgodny z ilustracją 5.

    header, main z section i article, footer (R.2.4). Okno z powiększeniem nie jest częścią układu - klucz go tu nie liczy.

    kartaProduktu.html HTML zmienione: 10 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
        </header>
        <main>
            <section>
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  19. Krok 19: Nagłówek strony i linia pozioma

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku nagłówkowego: nagłówek pierwszego stopnia o treści: „Sklep meblowy”. Linia pozioma.

    <h1> i <hr> (element pusty, bez ukośnika w HTML5).

    kartaProduktu.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  20. Krok 20: Obraz główny z klasą obraz

    ok. 2 min
    Polecenie z arkusza

    Zawartość bloku sekcji: obraz główny fotel1.png z tekstem alternatywnym „fotel”. Obraz jest formatowany klasą o nazwie obraz. Jego kliknięcie powoduje wywołanie funkcji JavaScript otwierającej okno.

    Klasa obraz dla stylu (nazwy klas narzuca arkusz), identyfikator mainImage dla skryptu. W HTML-u nie ma onclick - obsługę kliknięcia przypnie skrypt.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  21. Krok 21: Trzy miniatury w osobnym bloku

    Kryteria:

    R.2.6 W bloku sekcji znajdują się cztery obrazy: fotel1.png z tekstem alternatywnym "fotel" oraz trzy grafiki z fotelami z tekstem alternatywnym "miniatura" (w przypadku braku obrazów - sprawdzić w kodzie HTML)

    ok. 2 min
    Polecenie z arkusza

    Poniżej trzy obrazy miniatur fotel1.png, fotel2.png, fotel3.png z tekstem alternatywnym „miniatura”. Obrazy są formatowane klasą miniatury. Kliknięcie każdej miniatury powoduje wywołanie funkcji JavaScript podmieniającej obraz główny.

    Miniatury stoją w bloku <div class="thumbnails">. Blok zawsze zaczyna się w nowej linii, więc miniatury trafią pod obraz główny bez znacznika <br> - o układzie decyduje struktura, a nie łamanie wiersza wstawione w treść. Klasa miniatury przy każdym obrazie (R.2.6). div to tu blok pomocniczy - klucz R.2.4 je dopuszcza.

    kartaProduktu.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  22. Krok 22: Blok okna: znak × i obraz bez źródła

    Kryteria: ,

    R.2.9 Na stronie umieszczono blok (np. div ) a w nim element liniowy z zawartością &times; oraz obraz

    R.3.4 Klasy przypisane do 7 elementów: obraz do obrazu głównego w sekcji, miniatury do trzech obrazów miniatur, okno do bloku okna, zamknij do elementu zawierającego &times;, obrazOkno do obrazu w oknie

    ok. 3 min
    Polecenie z arkusza

    Blok okna z ilustracji 3 formatowany klasą o nazwie okno, zawierający: znacznik ogólny liniowy <span> z zawartością × i formatowany klasą zamknij. Kliknięcie znacznika powoduje wywołanie funkcji zamykającej okno. Obraz bez źródła formatowany klasą obrazOkno.

    <div class="okno"> z <span class="zamknij"> (encja &times; to znak ×) i obrazem bez src - źródło wstawi skrypt przy otwarciu (R.2.9, R.3.4).

    Dwa dodatki dla czytników ekranu: title="Zamknij" przy znaku × (sam symbol × nic nie mówi, a title pokazuje się też jako dymek) i alt przy obrazie w oknie - obraz bez alt czytnik nazwie tylko „obraz”.

    kartaProduktu.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
                <div class="okno" id="popup">
                    <span class="zamknij" title="Zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage" alt="powiększony fotel">
                </div>
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  23. Krok 23: Nagłówek artykułu i dwa akapity opisu

    ok. 2 min
    Polecenie z arkusza

    Zawartość bloku artykułu: nagłówek drugiego stopnia o treści: „Żółty Fotel”. Dwa paragrafy z treścią przekopiowaną z pliku opisFotel.txt zgodnie z ilustracją 2.

    <h2> i dwa <p> - każda linia opisFotel.txt to osobny akapit. Tekst kopiuj z pliku, nie przepisuj z ilustracji.

    kartaProduktu.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
                <div class="okno" id="popup">
                    <span class="zamknij" title="Zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage" alt="powiększony fotel">
                </div>
            </section>
            <article>
                <h2>Żółty Fotel</h2>
                <p>Nasz żółty fotel może być przygotowany w trzech wariantach, które można przeglądać na grafikach. Jest wygodny i elegancki. Wariant 1 polecamy do wnętrz klasycznych. Wariant 3 jest utrzymany w stylu glamour, a guzik na środku oparcia jest wykonany z kryształka. Wygodne podłokietniki sprawiają, że w tym fotelu naprawdę się odpoczywa. Wykonany z elastycznej pianki - materiału, który wyróżnia się plastycznością oraz sprężystością, zapewniając komfort siedzenia.</p>
                <p>Zorganizujemy dla Ciebie bezpłatną dostawę oraz wniesiemy towar.</p>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  24. Krok 24: Tekst ważny jako etykieta listy

    ok. 1 min
    Polecenie z arkusza

    Tekst „Wybierz wariant fotela” zapisany za pomocą znacznika semantycznego oznaczającego tekst ważny, formatowany domyślnie jako pogrubiony.

    Tekst ważny to <strong> (R.2.8). Napis opisuje listę wariantów, więc stoi w <label for="variant"> - kliknięcie napisu otwiera listę, a czytnik ekranu wie, czego dotyczy wybór. strong wewnątrz label zostaje - klucz go sprawdza.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
                <div class="okno" id="popup">
                    <span class="zamknij" title="Zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage" alt="powiększony fotel">
                </div>
            </section>
            <article>
                <h2>Żółty Fotel</h2>
                <p>Nasz żółty fotel może być przygotowany w trzech wariantach, które można przeglądać na grafikach. Jest wygodny i elegancki. Wariant 1 polecamy do wnętrz klasycznych. Wariant 3 jest utrzymany w stylu glamour, a guzik na środku oparcia jest wykonany z kryształka. Wygodne podłokietniki sprawiają, że w tym fotelu naprawdę się odpoczywa. Wykonany z elastycznej pianki - materiału, który wyróżnia się plastycznością oraz sprężystością, zapewniając komfort siedzenia.</p>
                <p>Zorganizujemy dla Ciebie bezpłatną dostawę oraz wniesiemy towar.</p>
                <label for="variant"><strong>Wybierz wariant fotela</strong></label>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  25. Krok 25: Lista wariantów

    ok. 1 min
    Polecenie z arkusza

    Lista rozwijana z elementami „wariant 1”, „wariant 2”, „wariant 3”.

    <select> z id równym for etykiety i trzema opcjami.

    kartaProduktu.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
                <div class="okno" id="popup">
                    <span class="zamknij" title="Zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage" alt="powiększony fotel">
                </div>
            </section>
            <article>
                <h2>Żółty Fotel</h2>
                <p>Nasz żółty fotel może być przygotowany w trzech wariantach, które można przeglądać na grafikach. Jest wygodny i elegancki. Wariant 1 polecamy do wnętrz klasycznych. Wariant 3 jest utrzymany w stylu glamour, a guzik na środku oparcia jest wykonany z kryształka. Wygodne podłokietniki sprawiają, że w tym fotelu naprawdę się odpoczywa. Wykonany z elastycznej pianki - materiału, który wyróżnia się plastycznością oraz sprężystością, zapewniając komfort siedzenia.</p>
                <p>Zorganizujemy dla Ciebie bezpłatną dostawę oraz wniesiemy towar.</p>
                <label for="variant"><strong>Wybierz wariant fotela</strong></label>
                <select id="variant" name="variant">
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  26. Krok 26: Przycisk „KUP TERAZ”

    Kryteria:

    R.2.7 W bloku artykułu znajduje się lista rozwijana z elementami „wariant 1”, „wariant 2”, „wariant 3” oraz przycisk "KUP TERAZ"

    ok. 1 min
    Polecenie z arkusza

    Paragraf z przyciskiem „KUP TERAZ”. Przycisk nie ma funkcjonalności.

    type="button" mówi wprost, że przycisk niczego nie wysyła - domyślny typ submit wysłałby formularz, gdyby przycisk kiedyś do niego trafił (R.2.7).

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
                <div class="okno" id="popup">
                    <span class="zamknij" title="Zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage" alt="powiększony fotel">
                </div>
            </section>
            <article>
                <h2>Żółty Fotel</h2>
                <p>Nasz żółty fotel może być przygotowany w trzech wariantach, które można przeglądać na grafikach. Jest wygodny i elegancki. Wariant 1 polecamy do wnętrz klasycznych. Wariant 3 jest utrzymany w stylu glamour, a guzik na środku oparcia jest wykonany z kryształka. Wygodne podłokietniki sprawiają, że w tym fotelu naprawdę się odpoczywa. Wykonany z elastycznej pianki - materiału, który wyróżnia się plastycznością oraz sprężystością, zapewniając komfort siedzenia.</p>
                <p>Zorganizujemy dla Ciebie bezpłatną dostawę oraz wniesiemy towar.</p>
                <label for="variant"><strong>Wybierz wariant fotela</strong></label>
                <select id="variant" name="variant">
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><button type="button">KUP TERAZ</button></p>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  27. Krok 27: Odnośnik do sklep.html

    Kryteria:

    R.3.5 Kliknięcie odnośnika „Do strony głównej” otwiera stronę sklep.html

    ok. 1 min
    Polecenie z arkusza

    Paragraf z odnośnikiem do pliku sklep.html o treści „Do strony głównej”.

    Ścieżka względna - oba pliki leżą w tym samym folderze (R.3.5).

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
                <div class="okno" id="popup">
                    <span class="zamknij" title="Zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage" alt="powiększony fotel">
                </div>
            </section>
            <article>
                <h2>Żółty Fotel</h2>
                <p>Nasz żółty fotel może być przygotowany w trzech wariantach, które można przeglądać na grafikach. Jest wygodny i elegancki. Wariant 1 polecamy do wnętrz klasycznych. Wariant 3 jest utrzymany w stylu glamour, a guzik na środku oparcia jest wykonany z kryształka. Wygodne podłokietniki sprawiają, że w tym fotelu naprawdę się odpoczywa. Wykonany z elastycznej pianki - materiału, który wyróżnia się plastycznością oraz sprężystością, zapewniając komfort siedzenia.</p>
                <p>Zorganizujemy dla Ciebie bezpłatną dostawę oraz wniesiemy towar.</p>
                <label for="variant"><strong>Wybierz wariant fotela</strong></label>
                <select id="variant" name="variant">
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><button type="button">KUP TERAZ</button></p>
                <p><a href="sklep.html">Do strony głównej</a></p>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  28. Krok 28: Stopka: linia pozioma i numer zdającego w em

    Kryteria: , ,

    R.2.5 W bloku nagłówkowym znajduje się <h1>: "Sklep meblowy", w bloku artykułu <h2>: "Żółty Fotel" oraz dwa paragrafy z opisem, w stopce <p> z numerem zdającego

    R.2.8 Tekst „Wybierz wariant fotela” znajduje się w znaczniku <strong> numer zdającego znajduje się w znaczniku <em>

    R.2.10 W bloku nagłówkowym i stopce znajduje się linia pozioma (<hr> lub za pomocą obramowania w CSS)

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku stopki: linia pozioma. Paragraf o treści „Autor strony: ”, dalej wstawiony numer zdającego. Numer zdającego jest zapisany za pomocą znacznika semantycznego oznaczającego tekst uwypuklony, formatowany domyślnie jako pochylony.

    <hr> i paragraf, tekst uwypuklony to <em> (R.2.5, R.2.8, R.2.10). Tu stoi nazwisko autora rozwiązania - na egzaminie w <em> wpisujesz swój numer zdającego (PESEL).

    kartaProduktu.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <div class="thumbnails">
                    <img src="fotel1.png" alt="miniatura" class="miniatury">
                    <img src="fotel2.png" alt="miniatura" class="miniatury">
                    <img src="fotel3.png" alt="miniatura" class="miniatury">
                </div>
                <div class="okno" id="popup">
                    <span class="zamknij" title="Zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage" alt="powiększony fotel">
                </div>
            </section>
            <article>
                <h2>Żółty Fotel</h2>
                <p>Nasz żółty fotel może być przygotowany w trzech wariantach, które można przeglądać na grafikach. Jest wygodny i elegancki. Wariant 1 polecamy do wnętrz klasycznych. Wariant 3 jest utrzymany w stylu glamour, a guzik na środku oparcia jest wykonany z kryształka. Wygodne podłokietniki sprawiają, że w tym fotelu naprawdę się odpoczywa. Wykonany z elastycznej pianki - materiału, który wyróżnia się plastycznością oraz sprężystością, zapewniając komfort siedzenia.</p>
                <p>Zorganizujemy dla Ciebie bezpłatną dostawę oraz wniesiemy towar.</p>
                <label for="variant"><strong>Wybierz wariant fotela</strong></label>
                <select id="variant" name="variant">
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><button type="button">KUP TERAZ</button></p>
                <p><a href="sklep.html">Do strony głównej</a></p>
            </article>
        </main>
        <footer>
            <hr>
            <p>Autor strony: <em>Bartosz Bryniarski</em></p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  29. Etap 3: Styl CSS

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

    Krok 29: Zmienne CSS z kolorami arkusza

    ok. 2 min
    Polecenie z arkusza

    Styl CSS zdefiniowany jest w całości w zewnętrznym pliku o nazwie styl.css.

    Zmienne w :root: Beige (tło strony i kolor znaku ×), Tan (przycisk i ramka obrazu) i tło okna. Tło okna zapisane nowszą składnią rgb(0 0 0 / 0.7) - trzy składowe po spacji, po ukośniku przezroczystość. To ten sam kolor co rgba(0, 0, 0, 0.7); inspektor przeglądarki pokazuje go właśnie w tej starszej postaci.

    styl.css CSS nowy plik
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  30. Krok 30: Krój czcionki dla wszystkich selektorów

    Kryteria:

    R.4.1 domyślne formatowanie selektorów (*): krój czcionki "Century Gothic" - jako pierwszy, sans-serif - jako ostatni

    ok. 1 min
    Polecenie z arkusza

    Domyślnie, dla wszystkich selektorów: krój czcionki „Century Gothic”, w przypadku braku sans-serif.

    Nazwa ze spacją w cudzysłowie, na końcu sans-serif (R.4.1).

    styl.css CSS zmienione: 4 linie
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  31. Krok 31: Ciało strony

    ok. 1 min
    Polecenie z arkusza

    Dla ciała strony: kolor tła Beige, rozmiar czcionki 140%.

    Selektor body.

    styl.css CSS zmienione: 5 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  32. Krok 32: Nagłówek i stopka

    Kryteria:

    R.4.5 wyrównanie tekstu: blok nagłówkowy, stopki - do środka

    ok. 1 min
    Polecenie z arkusza

    Dla bloku nagłówkowego i stopki: wyrównanie tekstu do środka, marginesy wewnętrzne 20 px.

    Jedna reguła dla dwóch selektorów (R.4.5).

    styl.css CSS zmienione: 6 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  33. Krok 33: Sekcja i artykuł na siatce

    Kryteria:

    R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 5 w arkuszu egzaminacyjnym (prawidłowo zastosowane właściwości CSS decydujące o układzie bloków na stronie, np. float i clear albo display flex albo grid albo position; żaden blok nie zachodzi na inne bloki - sprawdzić w inspektorze)

    ok. 2 min
    Polecenie z arkusza

    Dla bloku sekcji i bloku artykułu: szerokość 50%, wysokość 600 px.

    Blok główny to siatka o dwóch kolumnach po 50% - szerokość sekcji i artykułu z arkusza zapisana w grid-template-columns (klucz R.4.4 to przyjmuje). Bloki stają obok siebie, a stopka zostaje pod spodem bez clear (R.3.1). Wysokość 600 px w regule obu bloków.

    Typowe błędy

    width: 50% na sekcji wewnątrz siatki dałoby połowę kolumny, czyli 25% strony.

    styl.css CSS zmienione: 10 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  34. Krok 34: Przycisk

    Kryteria: ,

    R.4.2 kolor tła: dla ciała strony - Beige, przycisk - Tan

    R.4.3 rozmiar czcionki: dla ciała strony - 140%, przycisk - 150%

    ok. 1 min
    Polecenie z arkusza

    Dla przycisku: kolor tła Tan, zaokrąglenie rogów 20 px, marginesy wewnętrzne 10 px, rozmiar czcionki 150%.

    Selektor button (R.4.2, R.4.3).

    styl.css CSS zmienione: 7 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    
    button {
        padding: 10px;
        border-radius: 20px;
        font-size: 150%;
        background-color: var(--accent);
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  35. Krok 35: Klasa obraz

    Kryteria: ,

    R.4.6 marginesy wewnętrzne (padding ): blok nagłówkowy, stopka, .obraz - 20px, przycisk - 10px

    R.4.7 styl klasy .obraz: obramowanie - 1px Tan dowolna, pojedyncza linia ciągła; styl przycisku: zaokrąglenie rogów - 20px

    ok. 1 min
    Polecenie z arkusza

    Dla klasy obraz: szerokość 40%, marginesy wewnętrzne 20 px, obramowanie linią ciągłą o szerokości 1 px i kolorze Tan.

    Szerokość, odstęp od ramki i ramka (R.4.6, R.4.7). Dodatkowo cursor: zoom-in - kursor z lupą podpowiada, że kliknięcie powiększy obraz.

    styl.css CSS zmienione: 7 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    
    button {
        padding: 10px;
        border-radius: 20px;
        font-size: 150%;
        background-color: var(--accent);
    }
    
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid var(--accent);
        cursor: zoom-in;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  36. Krok 36: Klasa miniatury

    Kryteria:

    R.4.4 wysokość: blok sekcji, artykułu - 600px szerokość: blok sekcji, artykułu - 50% (width lub grid-template-columns lub flex ), .obraz - 40%, .miniatury - 15%

    ok. 1 min
    Polecenie z arkusza

    Dla klasy miniatury: szerokość 15%.

    15% szerokości bloku miniatur, czyli sekcji (R.4.4). Kursor rączki podpowiada, że miniaturę da się kliknąć.

    styl.css CSS zmienione: 5 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    
    button {
        padding: 10px;
        border-radius: 20px;
        font-size: 150%;
        background-color: var(--accent);
    }
    
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid var(--accent);
        cursor: zoom-in;
    }
    
    .miniatury {
        width: 15%;
        cursor: pointer;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  37. Krok 37: Klasa okno: nakładka ukryta na starcie

    Kryteria:

    R.4.8 styl klasy .okno : kolor tła czarny, przezroczystość (opacity lub RGBA) - 0.7, szerokość - 80%, oraz cechy position: fixed; left: 0; top: 0; display: none; element zawsze na wierzchu (z-index z wartością dodatnią)

    ok. 3 min
    Polecenie z arkusza

    Dla klasy okno: kolor tła czarny z przezroczystością 0.7, szerokość 80%, pozycjonowana względem okna przeglądarki, od lewej strony 0, od góry 0, zawsze na wierzchu, element jest usunięty.

    • display: none - okna nie ma, dopóki skrypt go nie pokaże,
    • position: fixed z top: 0 i left: 0 - przyklejone do lewego górnego rogu okna przeglądarki (tabela 3 arkusza), z-index: 10 - nad resztą strony,
    • tło ze zmiennej: przezroczyste jest samo tło, a fotel w oknie ma pełne kolory; opacity: 0.7 (też dopuszczalne) przyciemniłoby całe okno razem z fotelem.

    Tu nie ma nowocześniejszej drogi: klucz R.4.8 sprawdza dokładnie te właściwości, a skrypt będzie przełączał display (R.5.4).

    styl.css CSS zmienione: 10 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    
    button {
        padding: 10px;
        border-radius: 20px;
        font-size: 150%;
        background-color: var(--accent);
    }
    
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid var(--accent);
        cursor: zoom-in;
    }
    
    .miniatury {
        width: 15%;
        cursor: pointer;
    }
    
    .okno {
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 10;
        width: 80%;
        background-color: var(--overlay);
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  38. Krok 38: Klasa obrazOkno: obraz na środku okna

    ok. 1 min
    Polecenie z arkusza

    Dla klasy obrazOkno: marginesy zewnętrzne automatycznie wyliczane przez przeglądarkę, blokowy sposób wyświetlania.

    margin: auto wyśrodkowuje tylko element blokowy węższy od rodzica - stąd para display: block i margin: auto.

    styl.css CSS zmienione: 5 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    
    button {
        padding: 10px;
        border-radius: 20px;
        font-size: 150%;
        background-color: var(--accent);
    }
    
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid var(--accent);
        cursor: zoom-in;
    }
    
    .miniatury {
        width: 15%;
        cursor: pointer;
    }
    
    .okno {
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 10;
        width: 80%;
        background-color: var(--overlay);
    }
    
    .obrazOkno {
        display: block;
        margin: auto;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  39. Krok 39: Klasa zamknij: znak × w rogu okna

    Kryteria:

    R.4.9 styl klasy .obrazOkno : margin: auto; display: block; styl klasy .zamknij : position: absolute; top: 15px, right: 35px; czcionka koloru Beige, pogrubiona, o rozmiarze - 40px

    ok. 2 min
    Polecenie z arkusza

    Dla klasy zamknij: pozycjonowanie względem pierwszego rodzica, od góry 15 px, od prawej strony 35 px, czcionka koloru Beige, pogrubiona, o rozmiarze 40 px.

    position: absolute liczy top i right od najbliższego pozycjonowanego przodka - okno ma position: fixed, więc znak × trafia w prawy górny róg okna (R.4.9).

    styl.css CSS zmienione: 9 linii
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    
    button {
        padding: 10px;
        border-radius: 20px;
        font-size: 150%;
        background-color: var(--accent);
    }
    
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid var(--accent);
        cursor: zoom-in;
    }
    
    .miniatury {
        width: 15%;
        cursor: pointer;
    }
    
    .okno {
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 10;
        width: 80%;
        background-color: var(--overlay);
    }
    
    .obrazOkno {
        display: block;
        margin: auto;
    }
    
    .zamknij {
        position: absolute;
        top: 15px;
        right: 35px;
        font-size: 40px;
        font-weight: bold;
        color: var(--page-bg);
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  40. Krok 40: Kursor nad znakiem ×

    Kryteria:

    R.4.10 Gdy kursor znajdzie się na elemencie przypisanym do klasy .zamknij , zmienia się na pointer

    ok. 1 min
    Polecenie z arkusza

    Gdy kursor znajdzie się na elemencie przypisanym do klasy zamknij, zmienia się na pointer.

    :hover i cursor: pointer (R.4.10).

    styl.css CSS zmienione: 4 linie
    :root {
        --page-bg: Beige;
        --accent: Tan;
        --overlay: rgb(0 0 0 / 0.7);
    }
    
    * {
        font-family: "Century Gothic", sans-serif;
    }
    
    body {
        font-size: 140%;
        background-color: var(--page-bg);
    }
    
    header,
    footer {
        padding: 20px;
        text-align: center;
    }
    
    main {
        display: grid;
        grid-template-columns: 50% 50%;
    }
    
    section,
    article {
        height: 600px;
    }
    
    button {
        padding: 10px;
        border-radius: 20px;
        font-size: 150%;
        background-color: var(--accent);
    }
    
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid var(--accent);
        cursor: zoom-in;
    }
    
    .miniatury {
        width: 15%;
        cursor: pointer;
    }
    
    .okno {
        display: none;
        position: fixed;
        top: 0;
        left: 0;
        z-index: 10;
        width: 80%;
        background-color: var(--overlay);
    }
    
    .obrazOkno {
        display: block;
        margin: auto;
    }
    
    .zamknij {
        position: absolute;
        top: 15px;
        right: 35px;
        font-size: 40px;
        font-weight: bold;
        color: var(--page-bg);
    }
    
    .zamknij:hover {
        cursor: pointer;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  41. Etap 4: JavaScript

    Kroki 41-47 · po tym etapie masz 39 z 39 kryteriów (pkt)

    Krok 41: Elementy strony w stałych

    Kryteria: ,

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

    R.5.2 Zastosowana przynajmniej jedna zmienna lub funkcja oraz nazewnictwo jest w języku polskim lub angielskim i odzwierciedla cel zastosowania

    ok. 2 min
    Polecenie z arkusza

    Należy stosować znaczące nazewnictwo zmiennych i funkcji w języku polskim lub angielskim.

    Skrypt zaczyna od znalezienia elementów, z którymi będzie pracował, i zapisuje je w stałych (const): obraz główny, okno, obraz w oknie i znak ×. Stała nie może dostać nowej wartości, więc przypadkowe mainImage = … skończy się błędem zamiast cichej pomyłki; let zostaje dla zmiennych, które się zmieniają.

    document.querySelector (tabela 1 arkusza) przyjmuje selektor CSS - #mainImage to identyfikator, .zamknij klasa - więc jedna metoda zastępuje getElementById i getElementsByClassName. Elementy są szukane raz, a nie przy każdym kliknięciu (R.5.2).

    skrypt.js JavaScript zmienione: 4 linie
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    const mainImage = document.querySelector('#mainImage');
    const popup = document.querySelector('#popup');
    const popupImage = document.querySelector('#popupImage');
    const closeButton = document.querySelector('.zamknij');
    Podgląd strony po tym kroku (kartaProduktu.html)
  42. Krok 42: Miniatury podmieniają obraz główny

    Kryteria: , ,

    R.3.3 Dla przynajmniej jednego obrazu lub elementu zawierającego &times; zdefiniowane zdarzenie związane z jego kliknięciem, które uruchamia funkcję skryptu

    R.5.3 Po kliknięciu każdej miniatury obraz glówny zamieniany jest na grafikę z miniatury

    R.5.5 W skrypcie zmieniana jest wartość atrybutu src w elemencie DOM obrazu głównego lub obrazu w oknie, np. document.getElementById("obrazOkno").src = …

    ok. 3 min
    Polecenie z arkusza

    Funkcja podmieniająca obraz główny: po kliknięciu dowolnej miniatury jest podmieniany obraz główny na obraz z miniatury. Na ilustracji 6 kliknięto miniaturę fotel3.png, obraz główny zmienił się na fotel3.png.

    querySelectorAll('.miniatury') zwraca wszystkie trzy miniatury, a forEach wykonuje dla każdej tę samą funkcję. Każda dostaje addEventListener('click', …) - obsługę kliknięcia przypiętą ze skryptu, bez atrybutów onclick w HTML-u. Funkcja strzałkowa () => { … } pamięta swoją miniaturę (thumbnail), więc przepisuje do obrazu głównego jej src (R.3.3, R.5.3, R.5.5).

    Kliknij trzecią miniaturę w podglądzie - obraz główny zmienia się na fotel z guzikiem, jak na ilustracji 6.

    Typowe błędy

    addEventListener('click', changeImage()) z nawiasami wywołuje funkcję od razu, przy wczytaniu strony, a jako obsługę kliknięcia przypina jej wynik. Przekazuje się samą funkcję, bez nawiasów.

    skrypt.js JavaScript zmienione: 6 linii
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    const mainImage = document.querySelector('#mainImage');
    const popup = document.querySelector('#popup');
    const popupImage = document.querySelector('#popupImage');
    const closeButton = document.querySelector('.zamknij');
    
    document.querySelectorAll('.miniatury').forEach((thumbnail) => {
        thumbnail.addEventListener('click', () => {
            mainImage.src = thumbnail.src;
        });
    });
    Podgląd strony po tym kroku (kartaProduktu.html)
  43. Krok 43: Otwarcie okna: display block

    Kryteria:

    R.5.4 W skrypcie zmieniany jest styl CSS elementu DOM dla bloku okna, np. document.getElementById("okno").style.display = "block"; lub "none"

    ok. 2 min
    Polecenie z arkusza

    Funkcja otwierająca okno: pojawienie się okna jest realizowane poprzez zmianę sposobu wyświetlania bloku okna na blokowy.

    popup.style.display = 'block' wpisuje styl wprost w element i wygrywa z display: none z reguły .okno - okno się pojawia, a reszta reguły (tło, pozycja, warstwa) działa dalej (R.5.4).

    Tu forma jest narzucona: klucz R.5.4 sprawdza zmianę stylu elementu w skrypcie. W wielu projektach zamiast tego dodaje się klasę (popup.classList.add('open')) i trzyma wygląd w CSS - tutaj taka wersja nie dałaby tego punktu.

    skrypt.js JavaScript zmienione: 4 linie
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    const mainImage = document.querySelector('#mainImage');
    const popup = document.querySelector('#popup');
    const popupImage = document.querySelector('#popupImage');
    const closeButton = document.querySelector('.zamknij');
    
    document.querySelectorAll('.miniatury').forEach((thumbnail) => {
        thumbnail.addEventListener('click', () => {
            mainImage.src = thumbnail.src;
        });
    });
    
    function openPopup() {
        popup.style.display = 'block';
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  44. Krok 44: Otwarcie okna: obraz z obrazu głównego

    ok. 1 min
    Polecenie z arkusza

    Przypisanie do obrazu w bloku okna źródła grafiki z obrazu głównego.

    Najpierw obraz w oknie dostaje src obrazu głównego w chwili kliknięcia (jeśli wybrano trzecią miniaturę - fotel3.png), dopiero potem okno się pokazuje - nie mignie poprzednim obrazem.

    skrypt.js JavaScript zmienione: 1 linia
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    const mainImage = document.querySelector('#mainImage');
    const popup = document.querySelector('#popup');
    const popupImage = document.querySelector('#popupImage');
    const closeButton = document.querySelector('.zamknij');
    
    document.querySelectorAll('.miniatury').forEach((thumbnail) => {
        thumbnail.addEventListener('click', () => {
            mainImage.src = thumbnail.src;
        });
    });
    
    function openPopup() {
        popupImage.src = mainImage.src;
        popup.style.display = 'block';
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  45. Krok 45: Kliknięcie obrazu głównego otwiera okno

    Kryteria:

    R.5.6 Po kliknięciu głównego obrazu pojawia się blok okna z tą samą grafiką co w głównym obrazie

    ok. 1 min
    Polecenie z arkusza

    Po kliknięciu obrazu głównego otwiera się okno z tym obrazem (ilustracja 3).

    Funkcja openPopup przypięta do kliknięcia obrazu głównego - bez nawiasów, bo przekazuje się samą funkcję (R.5.6). Kliknij fotel w podglądzie: przyciemnione okno z fotelem w naturalnym rozmiarze, jak na ilustracji 3.

    skrypt.js JavaScript zmienione: 2 linie
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    const mainImage = document.querySelector('#mainImage');
    const popup = document.querySelector('#popup');
    const popupImage = document.querySelector('#popupImage');
    const closeButton = document.querySelector('.zamknij');
    
    document.querySelectorAll('.miniatury').forEach((thumbnail) => {
        thumbnail.addEventListener('click', () => {
            mainImage.src = thumbnail.src;
        });
    });
    
    function openPopup() {
        popupImage.src = mainImage.src;
        popup.style.display = 'block';
    }
    
    mainImage.addEventListener('click', openPopup);
    Podgląd strony po tym kroku (kartaProduktu.html)
  46. Krok 46: Znak × zamyka okno

    Kryteria:

    R.5.7 Po kliknięciu elementu &times; blok okna jest usuwany (np. okno.style.display = "none")

    ok. 2 min
    Polecenie z arkusza

    Funkcja zamykająca okno: po kliknięciu znaku × okno jest usuwane poprzez zastosowanie odpowiedniej właściwości CSS.

    closePopup przywraca display: none i jest przypięta do kliknięcia znaku × (R.5.7).

    skrypt.js JavaScript zmienione: 6 linii
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    const mainImage = document.querySelector('#mainImage');
    const popup = document.querySelector('#popup');
    const popupImage = document.querySelector('#popupImage');
    const closeButton = document.querySelector('.zamknij');
    
    document.querySelectorAll('.miniatury').forEach((thumbnail) => {
        thumbnail.addEventListener('click', () => {
            mainImage.src = thumbnail.src;
        });
    });
    
    function openPopup() {
        popupImage.src = mainImage.src;
        popup.style.display = 'block';
    }
    
    mainImage.addEventListener('click', openPopup);
    
    function closePopup() {
        popup.style.display = 'none';
    }
    
    closeButton.addEventListener('click', closePopup);
    Podgląd strony po tym kroku (kartaProduktu.html)
  47. Krok 47: Zamykanie klawiszem Esc i kliknięciem w tło

    ok. 2 min
    Polecenie z arkusza

    Po kliknięciu znaku × okno jest usuwane poprzez zastosowanie odpowiedniej właściwości CSS.

    Mały znak × to jedyna droga wyjścia, a użytkownicy odruchowo wciskają Esc albo klikają obok obrazu:

    • keydown na całym dokumencie z warunkiem event.key === 'Escape',
    • click na oknie zamyka je tylko wtedy, gdy kliknięto samo tło - event.target to element, w który trafił kursor; kliknięcie fotela okna nie zamyka.

    Obie drogi wołają tę samą funkcję closePopup. Klucz tego nie wymaga.

    skrypt.js JavaScript zmienione: 12 linii
    // Skrypt karty produktu: galeria miniatur i okno z powiększeniem
    const mainImage = document.querySelector('#mainImage');
    const popup = document.querySelector('#popup');
    const popupImage = document.querySelector('#popupImage');
    const closeButton = document.querySelector('.zamknij');
    
    document.querySelectorAll('.miniatury').forEach((thumbnail) => {
        thumbnail.addEventListener('click', () => {
            mainImage.src = thumbnail.src;
        });
    });
    
    function openPopup() {
        popupImage.src = mainImage.src;
        popup.style.display = 'block';
    }
    
    mainImage.addEventListener('click', openPopup);
    
    function closePopup() {
        popup.style.display = 'none';
    }
    
    closeButton.addEventListener('click', closePopup);
    
    document.addEventListener('keydown', (event) => {
        if (event.key === 'Escape') {
            closePopup();
        }
    });
    
    popup.addEventListener('click', (event) => {
        if (event.target === popup) {
            closePopup();
        }
    });
    Podgląd strony po tym kroku (kartaProduktu.html)
  48. Etap 5: Porównanie z wersją podstawową

    Krok 48 · po tym etapie masz 39 z 39 kryteriów (pkt)

    Krok 48: Co jest inaczej i którą wersję wybrać na egzaminie

    ok. 2 min
    Polecenie z arkusza

    Czas przeznaczony na wykonanie zadania wynosi 150 minut.

    Obie wersje dają komplet 39 punktów. Różnice:

    wersja podstawowawersja nowoczesna
    sekcja i artykułdisplay: flex, width: 50%siatka grid-template-columns: 50% 50%
    miniatury pod obrazem<br>blok div.thumbnails
    skrypt<script> na końcu stronyplik skrypt.js z defer
    kliknięciaatrybuty onclick w HTML-uaddEventListener w skrypcie
    elementygetElementById przy każdym kliknięciuconst i querySelector raz na początku
    zamykanie oknatylko znak ×znak ×, Esc, kliknięcie w tło

    Bez zmian zostały: style.display przy otwieraniu i zamykaniu okna (R.5.4) oraz position: fixed z z-index (R.4.8) - klucz sprawdza te właściwości wprost.

    Na egzaminie: onclick z wersji podstawowej jest krótszy i egzaminator widzi go od razu przy obrazie (R.3.3 mówi o „zdarzeniu związanym z kliknięciem”). addEventListener spełnia to samo kryterium, ale kod obsługi jest w innym pliku - przy sprawdzaniu trzeba do niego zajrzeć. W obu wersjach miniatury to obrazy, a nie przyciski, więc nie da się ich wybrać klawiaturą; prawdziwy sklep owinąłby je w <button> - tu przeszkadza reguła button z arkusza, która nadałaby im wygląd przycisku „KUP TERAZ”.

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

  49. Etap 6: Oddanie pracy

    Krok 49 · po tym etapie masz 39 z 39 kryteriów (pkt)

    Krok 49: 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: fotel1.png, fotel2.png, fotel3.png, import.png, kartaProduktu.html, kw1.png … kw4.png, kwerendy.txt, przeglądarka.txt, sklep.html, styl.css i skrypt.js - bez niego galeria i okno nie zadziałają. Płytę sprawdź po nagraniu i opisz numerem zdającego.

    przeglądarka.txt Tekst nowy plik
    Google Chrome

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

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.