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

Rozwiązanie krok po kroku: Karta produktu sklepu meblowego (Wersja podstawowa)

Rozwiązanie buduje kartę produktu sklepu meblowego: baza sklep i cztery zapytania - SELECT z warunkiem i sortowaniem, widok (CREATE VIEW), funkcje agregujące z aliasami liczone na tym widoku i DELETE z dwoma warunkami - potem trzy fotele wycięte z jednej grafiki z zachowaniem przezroczystości, strony kartaProduktu.html i sklep.html, style w styl.css z oknem nakładanym na stronę (position: fixed, z-index, display: none) i skrypt JavaScript: miniatury podmieniają obraz główny, kliknięcie obrazu głównego otwiera okno z powiększeniem, a znak × je zamyka.

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, jak robi to większość zdających: funkcje wywoływane atrybutem onclick i document.getElementById z tabeli 1 arkusza, a na końcu zostaje przerobiony na wersję z prawdziwych projektów: nasłuchiwacze zdarzeń, zamykanie okna klawiszem Esc i kliknięciem w tło, opisy dla czytników ekranu. W tym arkuszu nie ma PHP.

To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, JS)” jest drugi sposób rozwiązania tego samego arkusza: sekcja i artykuł na siatce CSS, skrypt w osobnym pliku z addEventListener od pierwszej linii - obie wersje są zgodne z kluczem.

Baza i grafika pochodzą z prawdziwego archiwum pliki3 (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. Skrypt został sprawdzony w prawdziwej przeglądarce: kliknięcie trzeciej miniatury, obrazu głównego i znaku × daje dokładnie to, co pokazują ilustracje 3 i 6.

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 - można stracić 9 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 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 #Kart@ProduKtu - z krzyżykiem na początku, małpą i wielkim K) i załóż folder z numerem zdającego. W phpMyAdmin: Nowa, nazwa sklep, porównywanie 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, potem Import → sklep.sql → Wykonaj. Powstają trzy tabele z ilustracji 1: klienci (3 osoby), meble (11 mebli) i pusta zakupy, która łączy klientów z meblami w relacji m:n. W meble pole kategoria to 1 - sofy, 2 - fotele, 3 - komody, a czyNowy to 1 dla mebla nowego i 0 dla używanego.

  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

    Print Screen, wklejasz do edytora grafiki i zapisujesz jako import.png. W tym arkuszu wszystkie zrzuty są w PNG - także zrzut importu (w wielu innych arkuszach import idzie do JPEG).

    Typowe błędy

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

  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

    • SELECT nazwa, styl, cena - trzy pola,
    • FROM meble,
    • WHERE czyNowy = 1 AND cena <= 1000 - „nie przekracza” znaczy „mniejsza lub równa”, więc <=,
    • ORDER BY cena - rosnąco, to kierunek domyślny (ASC można dopisać).

    Wynik: trzy meble za 700, 800 i 1000 zł - jak w kluczu. Zapytanie zapisujesz w kwerendy.txt, zrzut jako kw1.png.

    Typowe błędy

    Warunek cena < 1000 gubi brązową sofę za dokładnie 1000 zł - na zrzucie są wtedy 2 wiersze zamiast 3.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT nazwa, styl, cena FROM meble WHERE czyNowy = 1 AND cena <= 1000 ORDER BY cena;
    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 można potem używać jak tabeli: CREATE VIEW komody AS i dalej zwykły SELECT z warunkiem kategoria = 3. Samo utworzenie widoku nie zwraca wierszy, dlatego arkusz każe pokazać na zrzucie jego zawartość: klikasz komody w lewym panelu (albo SELECT * FROM komody). Pięć komód o identyfikatorach 4 - 8. Zrzut: kw2.png.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT nazwa, styl, cena FROM meble WHERE czyNowy = 1 AND cena <= 1000 ORDER BY cena;
    
    -- 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

    • AVG, MIN, MAX - funkcje agregujące liczą jedną wartość z wielu wierszy,
    • ROUND - bez drugiego argumentu zaokrągla do całości; bez niego średnia wyszłaby jako 2180.0000,
    • AS "Średnia cena komód" - alias ze spacjami i polskimi literami musi być w cudzysłowach (albo odwróconych apostrofach),
    • FROM komody - widok zamiast tabeli, więc warunek na kategorię jest już w nim zaszyty.

    Wynik: 2180, 700, 4000. Zrzut: kw3.png.

    Typowe błędy

    FROM meble WHERE kategoria = 3 daje te same liczby, ale arkusz wymaga widoku - osobne kryterium (R.1.5) za użycie komody przepada.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT nazwa, styl, cena FROM meble WHERE czyNowy = 1 AND cena <= 1000 ORDER BY cena;
    
    -- 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 FROM klienci z dwoma warunkami połączonymi AND - sam warunek na nazwisko usunąłby każdego Nowaka. phpMyAdmin pyta, czy na pewno wykonać DELETE, i po potwierdzeniu pokazuje „Usuniętych rekordów: 1”. W tabeli zostają Anna Kowalska i Julita Nowakowska. Zrzut: kw4.png.

    Typowe błędy

    DELETE FROM klienci; bez WHERE usuwa wszystkich klientów - przed wykonaniem zawsze przeczytaj warunek.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT nazwa, styl, cena FROM meble WHERE czyNowy = 1 AND cena <= 1000 ORDER BY cena;
    
    -- 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-30 · 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 (1920 × 1814 px) ma już przezroczyste tło - dziewięć mebli w trzech kolumnach. W GIMP-ie Zaznaczenie prostokątne wokół górnego fotela z lewej kolumny, Obraz → Przytnij do zaznaczenia, potem Eksportuj jako fotel1.png. Cofnij przycięcie (Ctrl+Z) i powtórz dla kolejnych foteli z tej samej kolumny.

    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ć

    Ręczny prostokąt prawie zawsze zostawia pasek pustego tła. Po przycięciu do zaznaczenia wybierasz Obraz → Przytnij do zawartości - GIMP sam odcina przezroczyste brzegi i kadr dotyka fotela z każdej strony (biała ramka na ilustracji 4). Wymiary bierzesz takie, jakie wyjdą: fotel1.png ma 539 × 489 px, bo grafiki nie skalujesz. Eksport do PNG zachowuje kanał alfa.

    Typowe błędy

    Zapis do JPEG zamienia przezroczyste tło na białe - klucz wymaga przezroczystości (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 i dolny fotel z lewej kolumny: fotel2.png ma 543 × 488 px, fotel3.png (z guzikiem na oparciu) 554 × 552 px. Podgląd pokazuje trzy fotele na szachownicy przezroczystości, jak w GIMP-ie.

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

    ok. 2 min
    Polecenie z arkusza

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

    Deklaracja <!DOCTYPE html> i szkielet strony. Nazwa pliku z wielką literą P w środku: kartaProduktu.html - na serwerze z Linuksem wielkość liter w nazwie ma znaczenie.

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

    ok. 1 min
    Polecenie z arkusza

    Zadeklarowany polski język zawartości witryny

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

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

    ok. 1 min
    Polecenie z arkusza

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

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

    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)
  14. Krok 14: 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> w <head>.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  15. Krok 15: 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

    Nazwa: styl.css. Całe formatowanie ma pochodzić z tego pliku.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  16. Krok 16: Strona sklep.html w budowie

    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. 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”

    Druga strona to sam napis w poprawnym szkielecie HTML5 - zapisujesz ją od razu, żeby odnośnik „Do strony głównej” miał dokąd prowadzić. Klucz w jednym kryterium sprawdza, że oba pliki istnieją, oraz deklarację HTML5 i język strony kartaProduktu.html.

    sklep.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Sklep meblowy</title>
    </head>
    <body>
        <p>strona w trakcie budowy</p>
    </body>
    </html>
    Podgląd strony po tym kroku (sklep.html)
  17. Krok 17: Bloki: nagłówek, główny, stopka

    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

    Klucz wymaga header, main z section i article w środku oraz footer (R.2.4). Sekcja i artykuł staną obok siebie w CSS.

    kartaProduktu.html HTML zmienione: 10 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
        </header>
        <main>
            <section>
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  18. Krok 18: Nagłówek strony

    ok. 1 min
    Polecenie z arkusza

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

    <h1> w <header>.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
        </header>
        <main>
            <section>
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  19. Krok 19: Linia pozioma w nagłówku

    ok. 1 min
    Polecenie z arkusza

    Linia pozioma

    <hr> - element pusty, w HTML5 bez ukośnika zamykającego.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </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

    class="obraz" dla stylu, a id="mainImage" dla skryptu - po identyfikatorze document.getElementById znajdzie ten obraz, żeby zmienić jego źródło. Wywołanie funkcji po kliknięciu dopiszesz, gdy funkcja będzie gotowa.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </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 pod obrazem głównym

    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

    Obrazy są elementami liniowymi - po nadaniu szerokości w CSS (40% i 3 × 15%) wszystkie cztery zmieściłyby się w jednym wierszu. <br> po obrazie głównym przenosi miniatury do nowej linii, jak na ilustracji 2. Klasa miniatury przy każdym z trzech obrazów.

    kartaProduktu.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <img src="fotel1.png" alt="miniatura" class="miniatury">
                <img src="fotel2.png" alt="miniatura" class="miniatury">
                <img src="fotel3.png" alt="miniatura" class="miniatury">
            </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

    Blok <div class="okno"> z identyfikatorem popup - skrypt będzie go pokazywał i chował. W środku <span class="zamknij"> z encją &times;, którą przeglądarka rysuje jako znak mnożenia ×, i <img class="obrazOkno"> bez atrybutu src - źródło wstawi skrypt w chwili otwarcia okna. Na razie okno widać w sekcji jako znak × i pusty obraz; schowa je styl display: none. Z tym krokiem wszystkie siedem elementów ma klasy z arkusza.

    kartaProduktu.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </div>
            </section>
            <article>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  23. Krok 23: Nagłówek artykułu

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku artykułu: Nagłówek drugiego stopnia o treści: „Żółty Fotel”

    <h2> w <article>.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </div>
            </section>
            <article>
                <h2>Żółty Fotel</h2>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  24. Krok 24: Dwa akapity opisu

    ok. 2 min
    Polecenie z arkusza

    Dwa paragrafy z treścią przekopiowaną z pliku opisFotel.txt zgodnie z ilustracją 2

    Plik opisFotel.txt ma dwie linie i każda staje się osobnym <p>: długi opis wariantów i zdanie o bezpłatnej dostawie. Skopiuj tekst dokładnie, bez przepisywania z ilustracji.

    kartaProduktu.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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)
  25. Krok 25: Tekst ważny w znaczniku strong

    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

    Znacznik semantyczny tekstu ważnego to <strong> (nie <b>, który tylko pogrubia, bez znaczenia).

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  26. Krok 26: Lista wariantów

    ok. 1 min
    Polecenie z arkusza

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

    <select> z trzema <option>. <strong> i <select> są liniowe, więc stoją w jednym wierszu - jak na ilustracji 2.

    kartaProduktu.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <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)
  27. Krok 27: 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

    <button> w akapicie. Nie ma formularza ani skryptu, więc kliknięcie nic nie robi - tak chce arkusz.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><button>KUP TERAZ</button></p>
            </article>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  28. Krok 28: 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 sklep.html - oba pliki leżą w tym samym folderze. Podwójna spacja w poleceniu arkusza to literówka.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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)
  29. Krok 29: Linia pozioma w stopce

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku stopki: Linia pozioma

    Drugi <hr>, tym razem na początku stopki.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><button>KUP TERAZ</button></p>
                <p><a href="sklep.html">Do strony głównej</a></p>
            </article>
        </main>
        <footer>
            <hr>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  30. Krok 30: Stopka z numerem 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

    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

    Tekst uwypuklony to <em> - przeglądarka pokazuje go kursywą. Na egzaminie w <em> wpisujesz swój numer zdającego (PESEL); tutaj stoi imię i nazwisko autora rozwiązania.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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)
  31. Etap 3: Styl CSS

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

    Krok 31: Plik styl.css: krój czcionki

    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 kroju ze spacją musi być w cudzysłowie: "Century Gothic". Na końcu rodzina zapasowa sans-serif.

    styl.css CSS nowy plik
    * {
        font-family: "Century Gothic", sans-serif;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  32. Krok 32: 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: 4 linie
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  33. Krok 33: 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.

    styl.css CSS zmienione: 4 linie
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  34. Krok 34: Sekcja i artykuł

    ok. 1 min
    Polecenie z arkusza

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

    Dwa bloki po połowie szerokości. Na razie stoją jeden pod drugim - to bloki, każdy zaczyna się w nowej linii.

    styl.css CSS zmienione: 4 linie
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  35. Krok 35: Układ bloków zgodny z ilustracją 5

    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

    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

    Arkusz nie mówi, jak postawić sekcję obok artykułu - wybierasz display: flex na <main>: dzieci stają w rzędzie, 50% + 50% wypełnia szerokość, a stopka zostaje pod spodem bez clear. Klucz uznaje też float, grid albo position, byle bloki na siebie nie zachodziły (R.3.1).

    styl.css CSS zmienione: 3 linie
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    main {
        display: flex;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  36. Krok 36: 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 znacznika button. Ta reguła zamyka kryteria kolorów tła i rozmiarów czcionki.

    styl.css CSS zmienione: 6 linii
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    main {
        display: flex;
    }
    button {
        background-color: Tan;
        border-radius: 20px;
        padding: 10px;
        font-size: 150%;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  37. Krok 37: 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

    Selektor klasy z kropką. Margines wewnętrzny odsuwa fotel od ramki - na ilustracji 2 widać jasną ramkę wokół obrazu głównego.

    styl.css CSS zmienione: 5 linii
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    main {
        display: flex;
    }
    button {
        background-color: Tan;
        border-radius: 20px;
        padding: 10px;
        font-size: 150%;
    }
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid Tan;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  38. Krok 38: 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%

    Szerokość w procentach liczy się od sekcji; wysokość dopasuje się sama, z zachowaniem proporcji.

    styl.css CSS zmienione: 3 linie
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    main {
        display: flex;
    }
    button {
        background-color: Tan;
        border-radius: 20px;
        padding: 10px;
        font-size: 150%;
    }
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid Tan;
    }
    .miniatury {
        width: 15%;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  39. Krok 39: 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

    • rgba(0, 0, 0, 0.7) - czarne tło przepuszczające 30% tego, co pod spodem; opacity: 0.7 (klucz też je uznaje) zrobiłoby półprzezroczyste całe okno razem z fotelem, a na ilustracji 3 fotel jest pełny,
    • position: fixed z left: 0 i top: 0 - przyklejenie do lewego górnego rogu okna przeglądarki (tabela 3 arkusza),
    • z-index: 10 - dodatnia wartość, okno nad resztą strony,
    • display: none - „element jest usunięty”: okna nie ma, dopóki skrypt go nie pokaże. Dlatego znak × i pusty obraz właśnie zniknęły z podglądu.
    styl.css CSS zmienione: 9 linii
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    main {
        display: flex;
    }
    button {
        background-color: Tan;
        border-radius: 20px;
        padding: 10px;
        font-size: 150%;
    }
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid Tan;
    }
    .miniatury {
        width: 15%;
    }
    .okno {
        background-color: rgba(0, 0, 0, 0.7);
        width: 80%;
        position: fixed;
        left: 0;
        top: 0;
        z-index: 10;
        display: none;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  40. Krok 40: 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 o szerokości mniejszej niż rodzic - dlatego para display: block i margin: auto. Obraz liniowy zignorowałby automatyczne marginesy.

    styl.css CSS zmienione: 4 linie
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    main {
        display: flex;
    }
    button {
        background-color: Tan;
        border-radius: 20px;
        padding: 10px;
        font-size: 150%;
    }
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid Tan;
    }
    .miniatury {
        width: 15%;
    }
    .okno {
        background-color: rgba(0, 0, 0, 0.7);
        width: 80%;
        position: fixed;
        left: 0;
        top: 0;
        z-index: 10;
        display: none;
    }
    .obrazOkno {
        margin: auto;
        display: block;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  41. Krok 41: 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, nie strony.

    styl.css CSS zmienione: 8 linii
    * {
        font-family: "Century Gothic", sans-serif;
    }
    body {
        background-color: Beige;
        font-size: 140%;
    }
    header, footer {
        text-align: center;
        padding: 20px;
    }
    section, article {
        width: 50%;
        height: 600px;
    }
    main {
        display: flex;
    }
    button {
        background-color: Tan;
        border-radius: 20px;
        padding: 10px;
        font-size: 150%;
    }
    .obraz {
        width: 40%;
        padding: 20px;
        border: 1px solid Tan;
    }
    .miniatury {
        width: 15%;
    }
    .okno {
        background-color: rgba(0, 0, 0, 0.7);
        width: 80%;
        position: fixed;
        left: 0;
        top: 0;
        z-index: 10;
        display: none;
    }
    .obrazOkno {
        margin: auto;
        display: block;
    }
    .zamknij {
        position: absolute;
        top: 15px;
        right: 35px;
        color: Beige;
        font-weight: bold;
        font-size: 40px;
    }
    Podgląd strony po tym kroku (kartaProduktu.html)
  42. Krok 42: 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

    Pseudoklasa :hover i cursor: pointer - rączka podpowiada, że znak da się kliknąć. Samo cursor: pointer w regule .zamknij działa tak samo, ale arkusz opisuje to jako zachowanie pod kursorem.

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

    Kroki 43-48 · po tym etapie masz 39 z 39 kryteriów (pkt)

    Krok 43: Funkcja podmieniająca obraz główny

    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

    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

    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

    Skrypt w <script> na końcu <body> - wtedy wszystkie elementy strony są już w drzewie dokumentu (DOM) i getElementById je znajdzie (same pliki obrazów mogą się jeszcze pobierać, ale to skryptowi nie przeszkadza). Funkcja changeImage dostaje klikniętą miniaturę jako parametr i przepisuje jej src do obrazu głównego znalezionego po id. Jedna funkcja obsłuży wszystkie trzy miniatury, bo każda przekaże samą siebie.

    kartaProduktu.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  44. Krok 44: Miniatury wywołują funkcję po kliknięciu

    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

    ok. 2 min
    Polecenie z arkusza

    Kliknięcie każdej miniatury powoduje wywołanie funkcji JavaScript podmieniającej obraz główny

    Atrybut onclick="changeImage(this)" przy każdej miniaturze: słowo this oznacza element, który kliknięto. Kliknij trzecią miniaturę w podglądzie - obraz główny zmienia się na fotel z guzikiem, jak na ilustracji 6.

    kartaProduktu.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <img src="fotel1.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel2.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel3.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <div class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  45. Krok 45: 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

    Pojawienie się okna jest realizowane poprzez: Zmianę sposobu wyświetlania bloku okna na blokowy

    Styl .okno ma display: none. Skrypt nadpisuje to stylem wpisanym w sam element: style.display = "block" - okno się pojawia, a reszta reguły (tło, pozycja, z-index) działa dalej.

    kartaProduktu.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <img src="fotel1.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel2.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel3.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <div class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
            function openPopup() {
                document.getElementById("popup").style.display = "block";
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  46. Krok 46: 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

    Obraz w oknie dostaje to samo src, co obraz główny w chwili kliknięcia - jeśli wcześniej wybrano trzecią miniaturę, w oknie też będzie fotel3.png.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <img src="fotel1.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel2.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel3.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <div class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
            function openPopup() {
                document.getElementById("popup").style.display = "block";
                document.getElementById("popupImage").src = document.getElementById("mainImage").src;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  47. Krok 47: 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)

    onclick="openPopup()" przy obrazie głównym. W podglądzie kliknij fotel: na stronę nakłada się przyciemnione okno z fotelem w naturalnym rozmiarze - jak na ilustracji 3.

    kartaProduktu.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage" onclick="openPopup()">
                <br>
                <img src="fotel1.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel2.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel3.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <div class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
            function openPopup() {
                document.getElementById("popup").style.display = "block";
                document.getElementById("popupImage").src = document.getElementById("mainImage").src;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  48. Krok 48: 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

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

    Funkcja closePopup przywraca display: none, a onclick="closePopup()" przy znaku × ją wywołuje. Okno znika, strona pod spodem zostaje bez zmian.

    kartaProduktu.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage" onclick="openPopup()">
                <br>
                <img src="fotel1.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel2.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <img src="fotel3.png" alt="miniatura" class="miniatury" onclick="changeImage(this)">
                <div class="okno" id="popup">
                    <span class="zamknij" onclick="closePopup()">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
            function openPopup() {
                document.getElementById("popup").style.display = "block";
                document.getElementById("popupImage").src = document.getElementById("mainImage").src;
            }
            function closePopup() {
                document.getElementById("popup").style.display = "none";
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  49. Etap 5: Dobre praktyki (poza kluczem)

    Kroki 49-51 · po tym etapie masz 39 z 39 kryteriów (pkt)

    Krok 49: Nasłuchiwacze zdarzeń zamiast onclick

    ok. 3 min
    Polecenie z arkusza

    Kliknięcie każdej miniatury powoduje wywołanie funkcji JavaScript podmieniającej obraz główny

    Atrybuty onclick mieszają HTML ze skryptem. W prawdziwych projektach HTML zostaje czysty, a skrypt sam przypina obsługę zdarzeń: addEventListener("click", ...) dla każdej miniatury (znalezionych przez querySelectorAll(".miniatury")), dla obrazu głównego i dla znaku ×. Funkcje się nie zmieniły, a dawne wywołania zostały opisane w komentarzu. Sprawdzone w przeglądarce: te same kliknięcia dają ten sam wynik co wersja z onclick. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.

    kartaProduktu.html HTML zmienione: 14 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
            function openPopup() {
                document.getElementById("popup").style.display = "block";
                document.getElementById("popupImage").src = document.getElementById("mainImage").src;
            }
            function closePopup() {
                document.getElementById("popup").style.display = "none";
            }
            // Wersja z egzaminu: atrybuty onclick="changeImage(this)", onclick="openPopup()" i onclick="closePopup()" w znacznikach.
            var thumbnails = document.querySelectorAll(".miniatury");
            for (var i = 0; i < thumbnails.length; i++) {
                thumbnails[i].addEventListener("click", function () {
                    changeImage(this);
                });
            }
            document.getElementById("mainImage").addEventListener("click", openPopup);
            document.querySelector(".zamknij").addEventListener("click", closePopup);
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  50. Krok 50: Zamykanie okna klawiszem Esc i kliknięciem w tło

    ok. 3 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 z okna, a użytkownicy odruchowo wciskają Esc albo klikają obok obrazu. Dwa nasłuchiwacze: keydown na całym dokumencie sprawdza event.key === "Escape", a click na oknie zamyka je tylko wtedy, gdy kliknięto samo tło (event.target === this) - kliknięcie fotela okna nie zamyka. Sprawdzone w przeglądarce: Esc zamyka, klik w fotel zostawia okno, klik w tło zamyka. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.

    kartaProduktu.html HTML zmienione: 10 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="zamknij">&times;</span>
                    <img class="obrazOkno" id="popupImage">
                </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>
                <strong>Wybierz wariant fotela</strong>
                <select>
                    <option>wariant 1</option>
                    <option>wariant 2</option>
                    <option>wariant 3</option>
                </select>
                <p><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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
            function openPopup() {
                document.getElementById("popup").style.display = "block";
                document.getElementById("popupImage").src = document.getElementById("mainImage").src;
            }
            function closePopup() {
                document.getElementById("popup").style.display = "none";
            }
            // Wersja z egzaminu: atrybuty onclick="changeImage(this)", onclick="openPopup()" i onclick="closePopup()" w znacznikach.
            var thumbnails = document.querySelectorAll(".miniatury");
            for (var i = 0; i < thumbnails.length; i++) {
                thumbnails[i].addEventListener("click", function () {
                    changeImage(this);
                });
            }
            document.getElementById("mainImage").addEventListener("click", openPopup);
            document.querySelector(".zamknij").addEventListener("click", closePopup);
            document.addEventListener("keydown", function (event) {
                if (event.key === "Escape") {
                    closePopup();
                }
            });
            document.getElementById("popup").addEventListener("click", function (event) {
                if (event.target === this) {
                    closePopup();
                }
            });
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  51. Krok 51: Opisy dla czytników ekranu i walidatora

    ok. 2 min
    Polecenie z arkusza

    Obraz bez źródła formatowany klasą obrazOkno

    Trzy drobiazgi, które wychwytuje walidator HTML i czytnik ekranu. Obraz w oknie dostaje alt - bez niego czytnik przeczyta tylko „obraz” (sam brak src walidator też zgłasza, ale tu jest celowy: źródło wstawia skrypt). Napis „Wybierz wariant fotela” staje się etykietą listy (<label for> + id), więc kliknięcie napisu otwiera listę, a czytnik wie, czego dotyczy wybór. Przycisk bez działania dostaje type="button" - gdyby kiedyś trafił do formularza, nie wyśle go przypadkiem. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.

    kartaProduktu.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>Fotel</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <h1>Sklep meblowy</h1>
            <hr>
        </header>
        <main>
            <section>
                <img src="fotel1.png" alt="fotel" class="obraz" id="mainImage">
                <br>
                <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 class="okno" id="popup">
                    <span class="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>
        <script>
            function changeImage(thumbnail) {
                document.getElementById("mainImage").src = thumbnail.src;
            }
            function openPopup() {
                document.getElementById("popup").style.display = "block";
                document.getElementById("popupImage").src = document.getElementById("mainImage").src;
            }
            function closePopup() {
                document.getElementById("popup").style.display = "none";
            }
            // Wersja z egzaminu: atrybuty onclick="changeImage(this)", onclick="openPopup()" i onclick="closePopup()" w znacznikach.
            var thumbnails = document.querySelectorAll(".miniatury");
            for (var i = 0; i < thumbnails.length; i++) {
                thumbnails[i].addEventListener("click", function () {
                    changeImage(this);
                });
            }
            document.getElementById("mainImage").addEventListener("click", openPopup);
            document.querySelector(".zamknij").addEventListener("click", closePopup);
            document.addEventListener("keydown", function (event) {
                if (event.key === "Escape") {
                    closePopup();
                }
            });
            document.getElementById("popup").addEventListener("click", function (event) {
                if (event.target === this) {
                    closePopup();
                }
            });
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (kartaProduktu.html)
  52. Etap 6: Oddanie pracy

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

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

    ok. 5 min
    Polecenie z arkusza

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

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

    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. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.

    przeglądarka.txt Tekst nowy plik
    Google Chrome

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

Podgląd

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

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