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.
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie, pliki i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Rozwiązuję samodzielnie” chowa rozwiązanie kroku - najpierw własna próba, potem odsłonięcie.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
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;
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.
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.
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.txtTekstnowy plik
-- Zapytanie 1SELECT nazwa, styl, cenaFROM mebleWHERE czyNowy = 1 AND cena <= 1000ORDER BY cena ASC;
Podgląd strony po tym kroku
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.txtTekstzmienione: 6 linii
-- Zapytanie 1SELECT nazwa, styl, cenaFROM mebleWHERE czyNowy = 1 AND cena <= 1000ORDER BY cena ASC;-- Zapytanie 2CREATE VIEW komody ASSELECT idMeble, nazwa, kategoria, cenaFROM mebleWHERE kategoria = 3;
Podgląd strony po tym kroku
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.txtTekstzmienione: 6 linii
-- Zapytanie 1SELECT nazwa, styl, cenaFROM mebleWHERE czyNowy = 1 AND cena <= 1000ORDER BY cena ASC;-- Zapytanie 2CREATE VIEW komody ASSELECT idMeble, nazwa, kategoria, cenaFROM mebleWHERE kategoria = 3;-- Zapytanie 3SELECT ROUND(AVG(cena)) AS "Średnia cena komód", MIN(cena) AS "Minimalna", MAX(cena) AS "Maksymalna"FROM komody;
Podgląd strony po tym kroku
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.txtTekstzmienione: 5 linii
-- Zapytanie 1SELECT nazwa, styl, cenaFROM mebleWHERE czyNowy = 1 AND cena <= 1000ORDER BY cena ASC;-- Zapytanie 2CREATE VIEW komody ASSELECT idMeble, nazwa, kategoria, cenaFROM mebleWHERE kategoria = 3;-- Zapytanie 3SELECT ROUND(AVG(cena)) AS "Średnia cena komód", MIN(cena) AS "Minimalna", MAX(cena) AS "Maksymalna"FROM komody;-- Zapytanie 4DELETE FROM klienciWHERE imie = 'Tomasz' AND nazwisko = 'Nowak';
Podgląd strony po tym kroku
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 jakofotel1.png, cofnij przycięcie (Ctrl+Z) i tak samo dla kolejnych.
Podgląd strony po tym kroku
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ść.
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
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.htmlHTMLnowy plik
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="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)
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>.
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.
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.
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.
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.
// Skrypt karty produktu: galeria miniatur i okno z powiększeniem
Podgląd strony po tym kroku (kartaProduktu.html)
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.
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.
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.
R.2.9 Na stronie umieszczono blok (np. div ) a w nim element liniowy z zawartością × 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 ×, 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 × 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”.
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.htmlHTMLzmienione: 3 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Fotel</title> <linkrel="stylesheet"href="styl.css"> <scriptsrc="skrypt.js"defer></script></head><body> <header> <h1>Sklep meblowy</h1> <hr> </header> <main> <section> <imgsrc="fotel1.png"alt="fotel"class="obraz"id="mainImage"> <divclass="thumbnails"> <imgsrc="fotel1.png"alt="miniatura"class="miniatury"> <imgsrc="fotel2.png"alt="miniatura"class="miniatury"> <imgsrc="fotel3.png"alt="miniatura"class="miniatury"> </div> <divclass="okno"id="popup"> <spanclass="zamknij"title="Zamknij">×</span> <imgclass="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)
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.htmlHTMLzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Fotel</title> <linkrel="stylesheet"href="styl.css"> <scriptsrc="skrypt.js"defer></script></head><body> <header> <h1>Sklep meblowy</h1> <hr> </header> <main> <section> <imgsrc="fotel1.png"alt="fotel"class="obraz"id="mainImage"> <divclass="thumbnails"> <imgsrc="fotel1.png"alt="miniatura"class="miniatury"> <imgsrc="fotel2.png"alt="miniatura"class="miniatury"> <imgsrc="fotel3.png"alt="miniatura"class="miniatury"> </div> <divclass="okno"id="popup"> <spanclass="zamknij"title="Zamknij">×</span> <imgclass="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> <labelfor="variant"><strong>Wybierz wariant fotela</strong></label> </article> </main> <footer> </footer></body></html>
Podgląd strony po tym kroku (kartaProduktu.html)
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.htmlHTMLzmienione: 5 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Fotel</title> <linkrel="stylesheet"href="styl.css"> <scriptsrc="skrypt.js"defer></script></head><body> <header> <h1>Sklep meblowy</h1> <hr> </header> <main> <section> <imgsrc="fotel1.png"alt="fotel"class="obraz"id="mainImage"> <divclass="thumbnails"> <imgsrc="fotel1.png"alt="miniatura"class="miniatury"> <imgsrc="fotel2.png"alt="miniatura"class="miniatury"> <imgsrc="fotel3.png"alt="miniatura"class="miniatury"> </div> <divclass="okno"id="popup"> <spanclass="zamknij"title="Zamknij">×</span> <imgclass="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> <labelfor="variant"><strong>Wybierz wariant fotela</strong></label> <selectid="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)
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.htmlHTMLzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Fotel</title> <linkrel="stylesheet"href="styl.css"> <scriptsrc="skrypt.js"defer></script></head><body> <header> <h1>Sklep meblowy</h1> <hr> </header> <main> <section> <imgsrc="fotel1.png"alt="fotel"class="obraz"id="mainImage"> <divclass="thumbnails"> <imgsrc="fotel1.png"alt="miniatura"class="miniatury"> <imgsrc="fotel2.png"alt="miniatura"class="miniatury"> <imgsrc="fotel3.png"alt="miniatura"class="miniatury"> </div> <divclass="okno"id="popup"> <spanclass="zamknij"title="Zamknij">×</span> <imgclass="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> <labelfor="variant"><strong>Wybierz wariant fotela</strong></label> <selectid="variant"name="variant"> <option>wariant 1</option> <option>wariant 2</option> <option>wariant 3</option> </select> <p><buttontype="button">KUP TERAZ</button></p> </article> </main> <footer> </footer></body></html>
Podgląd strony po tym kroku (kartaProduktu.html)
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.htmlHTMLzmienione: 1 linia
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Fotel</title> <linkrel="stylesheet"href="styl.css"> <scriptsrc="skrypt.js"defer></script></head><body> <header> <h1>Sklep meblowy</h1> <hr> </header> <main> <section> <imgsrc="fotel1.png"alt="fotel"class="obraz"id="mainImage"> <divclass="thumbnails"> <imgsrc="fotel1.png"alt="miniatura"class="miniatury"> <imgsrc="fotel2.png"alt="miniatura"class="miniatury"> <imgsrc="fotel3.png"alt="miniatura"class="miniatury"> </div> <divclass="okno"id="popup"> <spanclass="zamknij"title="Zamknij">×</span> <imgclass="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> <labelfor="variant"><strong>Wybierz wariant fotela</strong></label> <selectid="variant"name="variant"> <option>wariant 1</option> <option>wariant 2</option> <option>wariant 3</option> </select> <p><buttontype="button">KUP TERAZ</button></p> <p><ahref="sklep.html">Do strony głównej</a></p> </article> </main> <footer> </footer></body></html>
Podgląd strony po tym kroku (kartaProduktu.html)
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.htmlHTMLzmienione: 2 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <metaname="viewport"content="width=device-width, initial-scale=1"> <title>Fotel</title> <linkrel="stylesheet"href="styl.css"> <scriptsrc="skrypt.js"defer></script></head><body> <header> <h1>Sklep meblowy</h1> <hr> </header> <main> <section> <imgsrc="fotel1.png"alt="fotel"class="obraz"id="mainImage"> <divclass="thumbnails"> <imgsrc="fotel1.png"alt="miniatura"class="miniatury"> <imgsrc="fotel2.png"alt="miniatura"class="miniatury"> <imgsrc="fotel3.png"alt="miniatura"class="miniatury"> </div> <divclass="okno"id="popup"> <spanclass="zamknij"title="Zamknij">×</span> <imgclass="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> <labelfor="variant"><strong>Wybierz wariant fotela</strong></label> <selectid="variant"name="variant"> <option>wariant 1</option> <option>wariant 2</option> <option>wariant 3</option> </select> <p><buttontype="button">KUP TERAZ</button></p> <p><ahref="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)
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.
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.
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).
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).
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).
R.3.3 Dla przynajmniej jednego obrazu lub elementu zawierającego × 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.
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.
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.
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.
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 podstawowa
wersja 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 strony
plik skrypt.js z defer
kliknięcia
atrybuty onclick w HTML-u
addEventListener w skrypcie
elementy
getElementById przy każdym kliknięciu
const i querySelector raz na początku
zamykanie okna
tylko 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”.
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.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
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: Bartosz Bryniarski. 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.