INF.03-09-26.01-SGStyczeń 2026 · 48 kroków · ok. 83 min · 39 kryteriów z klucza
Rozwiązanie krok po kroku: Witryna salonu stylizacji paznokci (Wersja podstawowa)
Rozwiązanie buduje witrynę salonu stylizacji paznokci: baza paznokcie (klienci, kształty i wzory) i cztery zapytania - warunek na polu logicznym, wybór dnia z pola daty i godziny, złączenie z warunkiem na nazwę kształtu i ALTER TABLE dodający kolumnę - potem grafika z pięcioma butelkami lakieru wycięta z większego obrazu, strona paznokcie.html z blokiem bocznym, trzema przyciskami i trzema sekcjami (w jednej chwili widać tylko jedną), style w styl.css oraz dwa skrypty JavaScript: przełączanie sekcji po najechaniu kursorem na przycisk (zdarzenie onmouseover) i galeria dziesięciu wzorów generowana pętlą.
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ą. Skrypty są najpierw pisane najprościej, metodami z tabeli 1 arkusza (getElementById, style, document.write, atrybut onmouseover), a na końcu zostają przerobione na wersję z prawdziwych projektów: obsługa zdarzeń w skrypcie (addEventListener) także dla klawiatury, pętla zamiast trzech kopii i obrazy tworzone przez createElement.
Baza i grafiki pochodzą z prawdziwego archiwum pliki15 (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. Każda wersja skryptu była uruchomiona w przeglądarce Chrome z symulowanym najechaniem kursorem na każdy przycisk; w podglądzie najedź kursorem na „Kształt” albo „Wzór”, żeby przełączyć sekcję.
To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, JS)” jest drugi sposób rozwiązania tego samego arkusza: układ na siatce CSS, skrypt w osobnym pliku, zdarzenia przypinane przez addEventListener, stan zakładek w klasach CSS i atrybutach ARIA, a wzory tworzone przez createElement od pierwszej linii - obie wersje są zgodne z kluczem.
Jak liczą się punkty. Klucz ma 39 kryteriów (R.1.1 - R.5.8), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 30 punktów - można stracić 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.
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 6 z 39 kryteriów (pkt)
Krok 1: Baza danych paznokcie
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie paznokcie, z zestawem polskich znaków (np. utf8_polish_ci)
Rozpakuj pliki15.7z z pulpitu (hasło P@znoKcie? - z małpą zamiast „a” i pytajnikiem na końcu) i załóż folder z numerem zdającego. W archiwum są paznokcie.sql, zdjęcie manicure.jpg, grafiki kolory.png i ksztalt.png oraz dziesięć wzorów 1.jpg - 10.jpg. W phpMyAdmin: Nowa, nazwa paznokcie, porównywanie utf8_polish_ci.
Krok 2: Import tabel z pliku paznokcie.sql
ok. 2 min
Polecenie z arkusza
Z rozpakowanego archiwum zaimportuj tabele z pliku paznokcie.sql do utworzonej bazy
Zaznacz bazę paznokcie, potem Import → paznokcie.sql → Wykonaj. Powstają trzy tabele z ilustracji 1: klienci (z kluczami obcymi ksztalty_id i wzory_id, polem topKlient - 1 dla ważnego klienta - i terminem wizyty z datą i godziną), ksztalty i wzory.
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonany import tabel do bazy danych paznokcie - obraz 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. Wszystkie zrzuty w tym arkuszu są w formacie PNG.
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).
Krok 4: Zapytanie 1: ważni klienci
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 imię, kolor i cenę tylko dla ważnych klientów. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT imie, kolor, cena FROM klienci WHERE topKlient = 1; oraz na zrzucie widocznych jest dokładnie 6 wierszy z imionami: Anna, Monika, Ewelina, Joanna, Małgorzata i Jagna
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie imię, kolor i cenę tylko dla ważnych klientów
SELECT imie, kolor, cena - trzy pola,
FROM klienci - jedna tabela,
WHERE topKlient = 1 - ważny klient to wartość 1 (treść arkusza pod ilustracją 1).
Wynik: sześć wierszy - Anna, Monika, Ewelina, Joanna, Małgorzata i Jagna. Zapytanie zapisujesz w kwerendy.txt, zrzut jako kw1.png (cały ekran z paskiem zadań).
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT imie, kolor, cena FROM klienci WHERE topKlient = 1;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: klienci umówieni na 23 maja
Kryteria:
R.1.4 Wykonane zapytanie 2 wybierające jedynie imię i cenę dla klientów umówionych na dzień 2024-05-23. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT imie, cena FROM klienci WHERE termin LIKE "2024-05-23%"; (termin = "2024-05-23" jest błędem ) oraz na zrzucie widocznych jest dokładnie 6 wierszy z imionami: Marta, Agnieszka, Zuza, Roma, Małgorzata, Jagna
ok. 2 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie imię i cenę dla klientów umówionych na dzień 2024-05-23
Pole termin przechowuje datę z godziną (2024-05-23 12:00:00). Funkcja DATE(termin) odcina godzinę i zostawia sam dzień, który porównujesz z '2024-05-23'. Klucz podaje też wariant termin LIKE '2024-05-23%' - procent zastępuje dowolną godzinę; oba dają ten sam wynik: Marta, Agnieszka, Zuza, Roma, Małgorzata, Jagna. Zrzut: kw2.png.
Typowe błędy
WHERE termin = '2024-05-23' porównuje z północą tego dnia i zwraca 0 wierszy - klucz wprost nazywa ten zapis błędem.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, kolor, cena FROM klienci WHERE topKlient = 1;-- Zapytanie 2SELECT imie, cena FROM klienci WHERE DATE(termin) = '2024-05-23';
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: klienci z kształtem „migdał”
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające jedynie imię i kolor z tabeli klienci oraz odpowiadającą im nazwę kształtu z tabeli ksztalty dla kształtu „migdał”. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT imie, kolor, ksztalt FROM klienci JOIN ksztalty ON ksztalty_id = ksztalty.id WHERE ksztalt = "migdał"; (lub porównanie kluczy po WHERE ) oraz na zrzucie widocznych jest dokładnie 5 wierszy z imionami: Urszula, Anna, Ewa, Monika, Sylwia
ok. 3 min
Polecenie z arkusza
Zapytanie 3: wybierające jedynie imię i kolor z tabeli klienci oraz odpowiadającą im nazwę kształtu z tabeli ksztalty dla kształtu „migdał”. Należy posłużyć się relacją
SELECT klienci.imie, klienci.kolor, ksztalty.ksztalt - dwa pola klientów i nazwa kształtu,
FROM klienci JOIN ksztalty ON klienci.ksztalty_id = ksztalty.id - relacja: kształt wybrany przez klienta,
WHERE ksztalty.ksztalt = 'migdał' - warunek na nazwie, nie na numerze kształtu.
-- Zapytanie 1SELECT imie, kolor, cena FROM klienci WHERE topKlient = 1;-- Zapytanie 2SELECT imie, cena FROM klienci WHERE DATE(termin) = '2024-05-23';-- Zapytanie 3SELECT klienci.imie, klienci.kolor, ksztalty.ksztalt FROM klienci JOIN ksztalty ON klienci.ksztalty_id = ksztalty.id WHERE ksztalty.ksztalt = 'migdał';
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: nowa kolumna doplata
Kryteria:
R.1.6 Wykonane zapytanie 4 modyfikujące strukturę tabeli wzory , poprzez dodanie kolumny o nazwie doplata, dowolnego typu całkowitego. W pliku z kwerendami lub na zrzucie istnieje zapis np. ALTER TABLE wzory ADD COLUMN doplata INT; (dowolny typ całkowity, COLUMN opcjonalne ) oraz na zrzucie widoczny jest komunikat o poprawnie wykonanym zapytaniu lub zmieniona struktura tabeli
ok. 2 min
Polecenie z arkusza
Zapytanie 4: modyfikujące strukturę tabeli wzory, poprzez dodanie kolumny o nazwie doplata, dowolnego typu całkowitego
Struktury tabeli nie zmienia UPDATE (ten zmienia dane), tylko ALTER TABLE: ADD COLUMN doplata INT dopisuje kolumnę na końcu tabeli. Słowo COLUMN można pominąć, a zamiast INT może stać inny typ całkowity (TINYINT, SMALLINT). Zapytanie niczego nie wyświetla, więc na zrzucie kw4.png widać komunikat o wykonaniu albo zakładkę Struktura z nową kolumną.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, kolor, cena FROM klienci WHERE topKlient = 1;-- Zapytanie 2SELECT imie, cena FROM klienci WHERE DATE(termin) = '2024-05-23';-- Zapytanie 3SELECT klienci.imie, klienci.kolor, ksztalty.ksztalt FROM klienci JOIN ksztalty ON klienci.ksztalty_id = ksztalty.id WHERE ksztalty.ksztalt = 'migdał';-- Zapytanie 4ALTER TABLE wzory ADD COLUMN doplata INT;
Podgląd strony po tym kroku
Etap 2: Grafika i strona HTML
Kroki 8-28 · po tym etapie masz 19 z 39 kryteriów (pkt)
Krok 8: Grafika kolory.png: kadr do butelek
ok. 3 min
Polecenie z arkusza
Cechy grafiki kolory.png (ilustracja 3): Grafikę należy skadrować tak, aby były widoczne jedynie butelki lakierów do paznokci. Grafikę należy przyciąć dokładnie do kształtów butelek.
kolory.png ma przezroczyste tło i trzy rzędy kosmetyków: pędzelki, paletki cieni i na dole pięć butelek lakieru. W GIMP-ie zaznaczasz prostokątem dolny rząd z zapasem, Obraz → Przytnij do zaznaczenia, a potem Obraz → Przytnij do zawartości - krawędzie dosuwają się do butelek. Kadr: 566 × 182 px.
Krok 9: Grafika kolory.png: wysokość 70 px
Kryteria:
R.2.1 Grafika kolory.png przedstawia jedynie 5 butelek z lakierami. Jest przycięta do wszystkich krawędzi (sprawdzić bez powiększania obrazu ). Jej wysokość to 70 px
ok. 2 min
Polecenie z arkusza
Grafikę należy przeskalować z zachowaniem proporcji do wysokości 70 px
Obraz → Skaluj obraz, łańcuch zamknięty, wysokość 70 px - szerokość wychodzi sama: 218 px. Wyeksportuj pod tą samą nazwą do PNG, żeby zostało przezroczyste tło.
Podgląd strony po tym kroku
Krok 10: Plik paznokcie.html w HTML5
ok. 2 min
Polecenie z arkusza
Nazwa pliku paznokcie w formacie HTML lub PHP w zależności od implementacji skryptów. Zapisana w języku HTML5
Oba skrypty piszesz w JavaScripcie (arkusz pozwala na skrypt 1 w PHP, ale nie ma potrzeby - nie korzysta z bazy), więc plik ma rozszerzenie .html i otwiera się w przeglądarce bez serwera. Na początek deklaracja <!DOCTYPE html> i szkielet.
Krok 15: Bloki: boczny i główny z nagłówkiem, menu, trzema sekcjami i stopką
Kryteria:
R.2.4 W sekcji body zdefiniowany jest podział na bloki za pomocą semantycznych znaczników HTML5: aside, main->header+nav+section+section+section, footer (dopuszcza się zastosowanie bloków pomocniczych, poprawne również gdy stopka znajduje się w bloku main )
ok. 2 min
Polecenie z arkusza
Podział strony na bloki zrealizowany za pomocą semantycznych znaczników bloków języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków na stronie był zgodny z ilustracją 4
Na ilustracji 4 blok boczny zajmuje całą wysokość z lewej, a po prawej jeden pod drugim stoją: nagłówek, menu, trzy nałożone na siebie sekcje i stopka. Wszystko z prawej kolumny wkładasz więc do <main> - klucz uznaje stopkę w bloku głównym (R.2.4). Sekcje dostają identyfikatory section1 - section3: skrypt będzie je pokazywał i chował po numerze.
Zawartość bloku głównego: blok nagłówkowy, blok nawigacyjny, bloki: sekcja 1, sekcja 2, sekcja 3 (w jednym momencie tylko jedna sekcja jest widoczna). Zawartość bloku nagłówkowego: Nagłówek pierwszego stopnia o treści „Twoje wymarzone paznokcie”
Pierwszego stopnia, czyli <h1>. To, że widać tylko jedną sekcję, zrobisz w CSS i skrypcie 2 - w HTML-u są wszystkie trzy.
Zawartość bloku nawigacyjnego: Przycisk o treści „Kolor”
Znacznik <button>. Przyciski nie wysyłają tu żadnego formularza - posłużą do przełączania sekcji, dlatego dostają identyfikatory button1 - button3, numerowane tak samo jak sekcje.
R.2.6 W bloku bocznym znajduje się obraz manicure.jpg z tekstem alternatywnym "Stylizacja paznokci", oraz w blokach sekcji przynajmniej jeden obraz z kolorami, alt = "Kolory paznokci" lub ksztalt.png , alt = "Kształty paznokci"
ok. 1 min
Polecenie z arkusza
Obraz kolory.png z tekstem alternatywnym „Kolory paznokci”
Grafika przygotowana na początku. Z nią są już oba obrazy z kryterium R.2.6: zdjęcie w bloku bocznym i obraz w sekcji.
R.2.8 W blokach sekcji znajduje się przynajmniej jedno pole edycyjne
R.3.4 W bloku sekcji 1 pole input jest typu color oraz zastosowany atrybut value="#FF0000"
ok. 2 min
Polecenie z arkusza
Poniżej pole edycyjne pozwalające wybrać kolor, wartość początkowa pola: #FF0000 (ilustracja 5)
Pole type="color" to w przeglądarce kolorowy prostokąt; kliknięcie otwiera okno wyboru barwy (ilustracja 5). Wartość początkową podajesz w value zapisem szesnastkowym: #FF0000 to czerwony. „Poniżej” obrazu, więc przed polem stawiasz <br> - obraz i pole są elementami liniowymi i bez złamania stanęłyby obok siebie.
R.2.9 Zdefiniowana jest jedna lista rozwijana z 5 opcjami, użyte znaczniki <select> i <option>
ok. 2 min
Polecenie z arkusza
Poniżej pole listy rozwijanej z opcjami: „migdał”, „zaokrąglony”, „kwadratowy”, „balerina”, „zaokrąglony kwadrat”
<select> z pięcioma <option> w kolejności z arkusza (R.2.9). Lista jest wpisana w HTML-u, nie pobierana z bazy - w tabeli ksztalty są tylko cztery kształty, „zaokrąglonego kwadratu” tam nie ma.
R.3.5 W bloku sekcji 3 pole input jest typu number oraz zastosowane atrybuty min=1 i max=10
ok. 2 min
Polecenie z arkusza
Zawartość bloku sekcja 3: Nagłówek drugiego stopnia o treści „Wzór”. Efekt działania skryptu 1. Poniżej pole edycyjne przeznaczone do wpisywania wartości całkowitych jedynie od 1 do 10
Pole type="number" przyjmuje liczby, a atrybuty min="1" i max="10" ograniczają zakres - strzałkami nie wyjdziesz poza 1 - 10 (R.3.5). Między nagłówkiem a polem zostawiasz miejsce na skrypt 1: tam pojawi się dziesięć wzorów, a <br> przeniesie pole pod nie.
R.2.5 W bloku nagłówkowym znajduje się <h1> "Twoje wymarzone paznokcie", w blokach sekcji przynajmniej jeden <h2>: "Kolor", "Kształt" lub "Wzór", w stopce <p> z numerem zdającego
R.2.10 Numer zdającego formatowany jest znacznikiem <em>
ok. 1 min
Polecenie z arkusza
Zawartość bloku stopki: 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
Znacznik semantyczny tekstu uwypuklonego to <em> (emphasis) - przeglądarka domyślnie pisze go kursywą (R.2.10). <i> też daje kursywę, ale nie jest znacznikiem semantycznym. Na egzaminie w <em> wpisujesz swój numer zdającego (PESEL) - tutaj stoi imię i nazwisko autora rozwiązania. Z tym krokiem są wszystkie nagłówki z klucza: <h1>, trzy <h2> i akapit w stopce (R.2.5).
R.4.8 styl jedynie dla obrazu w bloku bocznym: szerokość 100%
ok. 1 min
Polecenie z arkusza
Jedynie dla obrazu w bloku bocznym: szerokość 100%
„Jedynie w bloku bocznym” to selektor potomkaaside img - butelki i kształty w sekcjach zostają w swoim rozmiarze. Wysokość dopasuje się sama z proporcji zdjęcia.
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 4 w arkuszu egzaminacyjnym (prawidłowo zastosowano 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, bloki sekcji nie są uwzględniane, stopka może być w bloku main lub poza nim)
ok. 2 min
Polecenie z arkusza
Podział strony na bloki zrealizowany za pomocą semantycznych znaczników bloków języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków na stronie był zgodny z ilustracją 4
Na stronie są tylko dwa bloki najwyższego poziomu: <aside> i <main>. display: flex na <body> stawia je obok siebie, a reszta (nagłówek, menu, sekcje, stopka) i tak leży jedna pod drugą wewnątrz <main>. To osobna reguła dla body - można ją też dopisać do poprzedniej (R.3.1).
R.4.5 wyrównanie tekstu: dla ciała strony do środka, blok nawigacyjny do lewej strony
ok. 1 min
Polecenie z arkusza
Dla bloku nawigacyjnego: wyrównanie tekstu do lewej strony, jedynie margines zewnętrzny lewy 10%
text-align: left nadpisuje środkowanie z body - przyciski są elementami liniowymi, więc ustawiają się do lewej. „Jedynie lewy” to margin-left. To zamyka kryterium wyrównań (R.4.5).
R.4.6 marginesy wewnętrzne (padding ): bloki sekcji - 10px margines zewnętrzny lewy (margin-left ): blok nawigacyjny, bloki sekcji - 10%
ok. 2 min
Polecenie z arkusza
Dla trzech bloków sekcji: kolor tła Salmon, jedynie margines zewnętrzny lewy 10%, marginesy wewnętrzne 10 px, wysokość 250 px
Selektor section obejmuje wszystkie trzy sekcje. Ten sam lewy margines co w menu - przyciski i sekcja zaczynają się w jednej linii, jak zakładki w segregatorze. Komplet marginesów z klucza (R.4.6).
R.4.9 sposób wyświetlania: pierwszy blok sekcji display: block; pozostałe display: none; (visibility jest błędem )
ok. 1 min
Polecenie z arkusza
Dodatkowo blok sekcji 1 jest wyświetlany w sposób blokowy, natomiast bloki sekcji 2 i 3 są usunięte z układu
Tabela 3 arkusza: display: block - element wyświetlany w bloku, display: none - element usunięty. Usunięty element nie zajmuje miejsca, więc stopka podjeżdża pod pierwszą sekcję. Po starcie strony widać zakładkę „Kolor”, jak na ilustracji 2.
Typowe błędy
visibility: hidden tylko ukrywa element, ale zostawia po nim puste miejsce - klucz wprost uznaje to za błąd.
Krok 38: Przyciski: szerokość, czcionka, bez obramowania
Kryteria: , ,
R.4.3 kolor czcionki: przyciski - biały
R.4.4 wysokość: bloki sekcji - 250px szerokość: blok boczny 20%, blok główny 80% (width lub grid-template-columns lub flex ), przycisk 26%
R.4.7 styl przycisków: brak obramowania, np. border: none, rozmiar czcionki 200%
ok. 2 min
Polecenie z arkusza
Dla przycisków: szerokość 26%, biały kolor czcionki, brak obramowania, rozmiar czcionki 200%
border: none usuwa szarą ramkę przycisku z przeglądarki. Biały tekst na razie słabo widać - tła przycisków dodasz w następnym kroku. Z szerokością przycisków masz komplet wysokości i szerokości z klucza (R.4.4).
R.4.10 styl klasy .wzory : szerokość 70px, marginesy zewnętrzne (margin ) 5px, zaokrąglenie rogów 100%
ok. 1 min
Polecenie z arkusza
Dla klasy wzory: szerokość 70 px, marginesy zewnętrzne 5 px, zaokrąglenie rogów 100%
Wzory są kwadratowe (100 × 100 px), a border-radius: 100% (wystarczy też 50%) zaokrągla rogi tak mocno, że z kwadratu robi się koło - jak na ilustracji 6. Obrazów z tą klasą jeszcze nie ma; wygeneruje je skrypt 1 (R.4.10).
Kroki 41-45 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 41: Skrypt 2: zdarzenie onmouseover na przyciskach
Kryteria:
R.3.3 Zdefiniowane dla przynajmniej jednego przycisku zdarzenie onmouseover, które uruchamia funkcję skryptu (obsługa zdarzenia zdefiniowana w HTML np. onmouseover=... lub w skrypcie np. addEventListener element.mouseover = … lub element.addEventListener("mouseover", (event) => {});) (lub zdarzenia focus, focusin, mouseenter )
ok. 2 min
Polecenie z arkusza
Zdarzenie najechania kursorem myszy na dowolny przycisk uruchamia skrypt 2. Skrypt 2: Wykonywany po stronie klienta, po najechaniu kursorem na przycisk
Zacznij od skryptu 2, bo bez niego sekcja 3 jest stale ukryta (display: none) i nie byłoby widać wyniku skryptu 1. Najechanie kursorem to zdarzenie onmouseover (tabela 1 arkusza). Każdy przycisk wywołuje tę samą funkcję showSection ze swoim numerem - jedna funkcja zamiast trzech. Funkcję piszesz w <script> na końcu <body>; na razie jest pusta.
Krok 42: Skrypt 2: wybrana sekcja widoczna, pozostałe usunięte
Kryteria:
R.5.4 Skrypt 2 stosuje przynajmniej jedną metodę DOM aby zmienić cechy bloku sekcji lub przycisku
ok. 3 min
Polecenie z arkusza
Działanie w przypadku zdarzenia, gdy kursor najedzie na przycisk „Kolor” (ilustracja 2): Pierwszy blok sekcji jest wyświetlany w postaci blokowej. Pozostałe bloki są usunięte
Najprościej: najpierw usuwasz wszystkie trzy sekcje (style.display = "none"), potem pokazujesz jedną. getElementById szuka elementu po identyfikatorze, a identyfikator składasz z tekstu i liczby: "section" + number daje "section2" dla przycisku „Kształt”. Tak samo działa dla „Kolor” i „Wzór” - nie trzeba osobnego if na każdy przycisk. Najedź w podglądzie na „Kształt”: widać drugą sekcję, ale przycisk „Kolor” jest nadal jasny.
R.5.5 Podczas aktywowania zakładki "Kolor": kolor pierwszego przycisku zmienia się na Salmon, pozostałe - Crimson, tylko pierwszy blok sekcji jest widoczny
R.5.6 Podczas aktywowania zakładki "Kształt": kolor drugiego przycisku zmienia się na Salmon, pozostałe - Crimson, tylko drugi blok sekcji jest widoczny
R.5.7 Podczas aktywowania zakładki "Wzór": kolor trzeciego przycisku zmienia się na Salmon, pozostałe - Crimson, tylko trzeci blok sekcji jest widoczny
ok. 3 min
Polecenie z arkusza
Pierwszy przycisk ma kolor tła Salmon. Pozostałe przyciski mają kolor tła Crimson. Działanie w przypadku zdarzenia, gdy kursor najedzie na przycisk „Kształt” (ilustracja 7): Drugi blok sekcji jest wyświetlany w postaci blokowej. Pozostałe bloki są usunięte. Drugi przycisk ma kolor tła Salmon. Pozostałe przyciski mają kolor tła Crimson. Działanie w przypadku zdarzenia, gdy kursor najedzie na przycisk „Wzór” (ilustracja 6): Trzeci blok sekcji jest wyświetlany w postaci blokowej. Pozostałe bloki są usunięte. Trzeci przycisk ma kolor tła Salmon. Pozostałe przyciski mają kolor tła Crimson
Ten sam wzór dla przycisków: wszystkie trzy dostają Crimson, a wskazany - Salmon. W JavaScripcie właściwość CSS background-color nazywa się backgroundColor (bez myślnika, druga część wielką literą - tabela 1 arkusza). Sprawdzone w Chrome dla każdego przycisku: „Kolor” pokazuje sekcję 1 i jest jasny, „Kształt” - sekcję 2, „Wzór” - sekcję 3, pozostałe przyciski są ciemne (R.5.5 - R.5.7).
R.5.1 Skrypt 1 napisany w języku JavaScript lub PHP oraz skrypt 2 w języku JavaScript. Przynajmniej jeden skrypt zawiera przynajmniej jedną poprawną składniowo instrukcję wynikającą z treści zadania
R.5.2 Na stronie jest wyświetlanych za pomocą pętli 10 obrazów o nazwach 1.jpg ÷ 10.jpg
ok. 2 min
Polecenie z arkusza
Skrypt 1: Zapisany w języku JavaScript lub PHP (w przypadku PHP plik musi nazywać się paznokcie.php). Wyświetla za pomocą pętli 10 obrazów o nazwach, kolejno: 1.jpg, 2.jpg, 3.jpg ... 10.jpg
Skrypt 1 stoi dokładnie tam, gdzie mają się pojawić obrazy - w sekcji 3, między nagłówkiem a polem liczbowym. document.write (tabela 1 arkusza) wpisuje tekst w miejscu, w którym przeglądarka właśnie czyta stronę. Pętla for liczy od 1 do 10, a nazwę pliku sklejasz z liczby i tekstu: i + ".jpg". Najedź na „Wzór”: dziesięć dużych kwadratów, jeszcze bez stylu klasy.
R.5.3 Każdy generowany skryptem obraz ma przypisaną klasę wzory oraz atrybut title z nazwą (numerem) pliku
R.5.8 W skryptach zastosowana przynajmniej jedna zmienna lub funkcja oraz nazwy wszystkich funkcji i zmiennych są w języku polskim lub angielskim i odzwierciedlają cel zastosowania
ok. 2 min
Polecenie z arkusza
Każdy obraz ma przypisaną klasę wzory. Po najechaniu kursorem na obraz jest wyświetlany dymek z nazwą (numerem) obrazu (na ilustracji 6 wskazano obraz3.jpg, więc dymek zawiera liczbę 3)
Klasa w atrybucie class="wzory" - teraz działa reguła .wzory z CSS i obrazy robią się okrągłe. Dymek po najechaniu kursorem to atrybut title: przeglądarka pokazuje jego treść po chwili bezruchu kursora. W title wpisujesz samą liczbę i (R.5.3). Napis HTML jest w apostrofach, więc cudzysłowy atrybutów mieszczą się w nim bez ukośników. W skryptach są funkcja showSection i zmienne number oraz i - nazwy mówią, do czego służą (R.5.8).
Kroki 46-47 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 46: Zdarzenia w skrypcie, pętla i obsługa klawiatury
ok. 4 min
Polecenie z arkusza
Zdarzenie najechania kursorem myszy na dowolny przycisk uruchamia skrypt 2
Trzy zmiany naraz, bo dotyczą tych samych linii. addEventListener przypina obsługę zdarzenia w skrypcie, więc HTML przycisków zostaje czysty (bez onmouseover). querySelectorAll zbiera przyciski i sekcje do list, a jedna pętla ustawia każdemu elementowi stan „wybrany” albo „ukryty” - sześć linii getElementById zamieniło się w dwie, a czwarta zakładka nie wymagałaby zmian w skrypcie. Do tego zdarzenie focus: osoba bez myszy przechodzi po przyciskach klawiszem Tab i sekcje też się przełączają (sprawdzone w Chrome). Klucz uznaje addEventListener i focus za równoważne. Stara wersja jest opisana w komentarzu. Na egzaminie wystarczy wersja wcześniejsza.
paznokcie.htmlHTMLzmienione: 17 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Stylizacja paznokci</title> <linkrel="stylesheet"href="styl.css"></head><body> <aside> <imgsrc="manicure.jpg"alt="Stylizacja paznokci"> </aside> <main> <header> <h1>Twoje wymarzone paznokcie</h1> </header> <nav> <buttonid="button1">Kolor</button> <buttonid="button2">Kształt</button> <buttonid="button3">Wzór</button> </nav> <sectionid="section1"> <h2>Kolor</h2> <imgsrc="kolory.png"alt="Kolory paznokci"> <br> <inputtype="color"value="#FF0000"> </section> <sectionid="section2"> <h2>Kształt</h2> <imgsrc="ksztalt.png"alt="Kształty paznokci"> <br> <select> <option>migdał</option> <option>zaokrąglony</option> <option>kwadratowy</option> <option>balerina</option> <option>zaokrąglony kwadrat</option> </select> </section> <sectionid="section3"> <h2>Wzór</h2> <script>for (let i = 1; i <= 10; i++) {document.write('<img src="' + i + '.jpg" class="wzory" title="' + i + '">'); } </script> <br> <inputtype="number"min="1"max="10"> </section> <footer> <p>Autor strony: <em>Bartosz Bryniarski</em></p> </footer> </main> <script>const buttons = document.querySelectorAll("nav button");const sections = document.querySelectorAll("main section");function showSection(number) {for (let i = 0; i < sections.length; i++) { sections[i].style.display = (i + 1 == number) ? "block" : "none"; buttons[i].style.backgroundColor = (i + 1 == number) ? "Salmon" : "Crimson"; } } buttons.forEach(function (button, index) { button.addEventListener("mouseover", function () { showSection(index + 1); }); button.addEventListener("focus", function () { showSection(index + 1); }); });/* Wersja z egzaminu: atrybut onmouseover w każdym przycisku i po trzy linie getElementById dla sekcji oraz dla przycisków. */ </script></body></html>
Podgląd strony po tym kroku (paznokcie.html)
Krok 47: Obrazy tworzone przez createElement
ok. 3 min
Polecenie z arkusza
Wyświetla za pomocą pętli 10 obrazów o nazwach, kolejno: 1.jpg, 2.jpg, 3.jpg ... 10.jpg
document.write działa tylko w trakcie wczytywania strony - wywołane później (np. po kliknięciu) skasowałoby całą stronę, dlatego w nowym kodzie się go nie używa. Zamiast tego createElement("img") tworzy obraz jako obiekt, ustawiasz mu właściwości (src, alt, className, title) i appendChild dokłada go do pustego <div> w sekcji. Przy okazji obrazy dostają tekst alternatywny. Wygląd strony się nie zmienia. Na egzaminie wystarczy wersja wcześniejsza - klucz tego nie sprawdza.
paznokcie.htmlHTMLzmienione: 9 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Stylizacja paznokci</title> <linkrel="stylesheet"href="styl.css"></head><body> <aside> <imgsrc="manicure.jpg"alt="Stylizacja paznokci"> </aside> <main> <header> <h1>Twoje wymarzone paznokcie</h1> </header> <nav> <buttonid="button1">Kolor</button> <buttonid="button2">Kształt</button> <buttonid="button3">Wzór</button> </nav> <sectionid="section1"> <h2>Kolor</h2> <imgsrc="kolory.png"alt="Kolory paznokci"> <br> <inputtype="color"value="#FF0000"> </section> <sectionid="section2"> <h2>Kształt</h2> <imgsrc="ksztalt.png"alt="Kształty paznokci"> <br> <select> <option>migdał</option> <option>zaokrąglony</option> <option>kwadratowy</option> <option>balerina</option> <option>zaokrąglony kwadrat</option> </select> </section> <sectionid="section3"> <h2>Wzór</h2> <divid="patterns"></div> <script>const patterns = document.getElementById("patterns");for (let i = 1; i <= 10; i++) {const image = document.createElement("img"); image.src = i + ".jpg"; image.alt = "wzór " + i; image.className = "wzory"; image.title = i; patterns.appendChild(image); }// wersja z egzaminu: document.write('<img src="' + i + '.jpg" class="wzory" title="' + i + '">'); </script> <br> <inputtype="number"min="1"max="10"> </section> <footer> <p>Autor strony: <em>Bartosz Bryniarski</em></p> </footer> </main> <script>const buttons = document.querySelectorAll("nav button");const sections = document.querySelectorAll("main section");function showSection(number) {for (let i = 0; i < sections.length; i++) { sections[i].style.display = (i + 1 == number) ? "block" : "none"; buttons[i].style.backgroundColor = (i + 1 == number) ? "Salmon" : "Crimson"; } } buttons.forEach(function (button, index) { button.addEventListener("mouseover", function () { showSection(index + 1); }); button.addEventListener("focus", function () { showSection(index + 1); }); });/* Wersja z egzaminu: atrybut onmouseover w każdym przycisku i po trzy linie getElementById dla sekcji oraz dla przycisków. */ </script></body></html>
Podgląd strony po tym kroku (paznokcie.html)
Etap 6: Oddanie pracy
Krok 48 · po tym etapie masz 39 z 39 kryteriów (pkt)
Krok 48: Plik przeglądarka.txt i nagranie płyty
ok. 5 min
Polecenie z arkusza
UWAGA: 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: 1.jpg - 10.jpg, import.png, kolory.png, ksztalt.png, kw1.png - kw4.png, kwerendy.txt, manicure.jpg, paznokcie.html, przeglądarka.txt, styl.css. Nagraj płytę, sprawdź jej odczyt i opisz ją 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.