Przejdź do treści

Temat 15 · 2 × 45 minINF.03

Zmiana stylów, klas i atrybutów

Druga wielka grupa zadań egzaminacyjnych nie liczy nic – zmienia wygląd strony: ukrywa i pokazuje bloki, podmienia obrazek, koloruje aktywny przycisk, nakłada filtr na zdjęcie. W próbie 26 analizowanych zadań z JavaScriptem prawie co drugie wymagało zmiany element.style, a co piąte – pokazania i ukrycia sekcji (te ostatnie wyłącznie w latach 2024–2026). W tej lekcji poznasz trzy narzędzia: właściwość style (pojedyncza cecha), classList (gotowy zestaw cech z CSS) i atrybuty (src, alt, title, setAttribute). Znajdowanie elementów znasz z lekcji 11, zdarzenia z lekcji 12.

element.style – jedna właściwość naraz

Każdy element ma obiekt style, którego pola odpowiadają właściwościom CSS. Przypisanie element.style.color = 'red' działa tak, jakbyś dopisał do znacznika atrybut style="color: red" – czyli styl inline, który wygrywa z arkuszem CSS. Wartości podajesz jako napisy, dokładnie tak, jak pisałbyś je w CSS, razem z jednostką: '16px', '100%', '2px solid black'.

Nazwy z myślnikiem zamieniasz na camelCase: myślnik znika, a następna litera jest wielka.

CSSJavaScriptPrzykład
colorstyle.colorp.style.color = 'Navy';
background-colorstyle.backgroundColordiv.style.backgroundColor = '#FFAEA5';
font-sizestyle.fontSizep.style.fontSize = '20px';
font-weightstyle.fontWeightp.style.fontWeight = 'bold';
text-decorationstyle.textDecorationli.style.textDecoration = 'line-through';
displaystyle.displaysekcja.style.display = 'none';
widthstyle.widthpasek.style.width = '40%';
borderstyle.borderimg.style.border = '3px solid red';
filterstyle.filterimg.style.filter = 'sepia(100%)';
list-style-typestyle.listStyleTypeul.style.listStyleType = 'square';
Sprawdź się

Co się stanie po załadowaniu strony z tym skryptem?

var p = document.getElementById('info');
p.style.background-color = 'yellow';
Formatowanie akapitu
// jedna funkcja z parametrem zamiast trzech kopii – jak w arkuszu E.14 ze stycznia 2019
function formatuj(kolor) {
  const akapit = document.getElementById('tekst');
  const rozmiar = document.getElementById('rozmiar').value;        // napis, np. "150"
  akapit.style.fontSize = rozmiar + '%';                           // jednostka doklejona do napisu
  akapit.style.fontStyle = document.getElementById('krój').value;  // "normal" / "italic"
  akapit.style.color = kolor;
}
Podgląd

Zwróć uwagę na rozmiar + '%' – bez jednostki (style.fontSize = 150) przeglądarka zignoruje przypisanie (wyjątek: 0 i właściwości bez jednostek jak opacity czy zIndex). Jeśli wolisz zapis z myślnikiem, działa też akapit.style['background-color'] = 'yellow' oraz akapit.style.setProperty('background-color', 'yellow') – ale camelCase jest najkrótszy i tak piszą arkusze.

Pokaż / ukryj – display

Najczęstszy mechanizm w arkuszach 2024–2026: kliknięcie chowa jeden blok i pokazuje drugi. Służy do tego właściwość display: 'none' ukrywa element całkowicie (nie zajmuje miejsca), 'block' pokazuje go jako blok. Dla elementów liniowych (span, img) wracasz do 'inline' lub 'inline-block'; można też przypisać pusty napis '', co usuwa styl inline i przywraca wartość z CSS.

Sprawdź się

Akapit #p1 ma w CSS kolor niebieski. Co będzie po DRUGIM kliknięciu przycisku?

<button onclick="document.getElementById('p1').style.color = 'red'">Zmień</button>

Rotacja cytatów z arkusza INF.03-10-24.06 (kliknięcie cytatu 1 ukrywa go i pokazuje cytat 2, potem 2→3 i 3→1; arkusz dopuszczał jedną funkcję parametrową lub trzy osobne) w jednej funkcji:

Rotacja cytatów jedną funkcją
function pokazNastepny(numer) {
  const nastepny = numer === 3 ? 1 : numer + 1;       // zawijanie 3 → 1
  document.getElementById('cytat' + numer).style.display = 'none';
  document.getElementById('cytat' + nastepny).style.display = 'block';
}
Podgląd

Zauważ dwa chwyty: 'cytat' + numer buduje id z liczby (dlatego warto nazywać elementy cytat1, cytat2…), a ukrycie startowe jest w CSS, więc skrypt nadpisuje je stylem inline. To działa, bo styl inline ma pierwszeństwo przed arkuszem.

Alternatywa dla prostego ukrywania: atrybut HTML hidden – element.hidden = true chowa, false pokazuje. Działa jak display: none, ale krócej. Na egzaminie style.display jest bezpieczniejsze, bo bywa, że arkusz wymaga tego wprost („przez zmianę wartości odpowiedniej właściwości CSS”).

Jedna funkcja dla wielu przycisków – zakładki

Klasyk z czerwca 2024 (INF.03-08-24.06) i stycznia 2026 (INF.03-09-26.01): trzy przyciski, trzy sekcje. Kliknięcie (albo najechanie – onmouseover) ukrywa wszystkie sekcje, pokazuje wybraną i koloruje aktywny przycisk. Zamiast trzech funkcji pisz jedną z parametrem – arkusze (np. INF.03-10-24.06, INF.03-08-25.06) wprost dopuszczają jedną funkcję parametrową lub trzy osobne, a jedna to mniej literówek.

Kluczowa sztuczka: najpierw wyłącz wszystko (pętlą lub trzema liniami), potem włącz jedno. Dzięki temu nie musisz pamiętać, co było aktywne wcześniej.

Zakładki jedną funkcją
function pokazSekcje(nazwa) {
  // 1. ukryj wszystkie sekcje i „zgaś” wszystkie przyciski
  const sekcje = document.querySelectorAll('.zakladka');
  for (const sekcja of sekcje) {
    sekcja.style.display = 'none';
  }
  const przyciski = document.querySelectorAll('nav button');
  for (const przycisk of przyciski) {
    przycisk.style.backgroundColor = 'Crimson';
  }
  // 2. pokaż wybraną sekcję i podświetl jej przycisk
  document.getElementById(nazwa).style.display = 'block';
  document.getElementById('btn-' + nazwa).style.backgroundColor = 'Salmon';
}
pokazSekcje('kolor');   // stan początkowy: także przycisk ma właściwy kolor
Podgląd

Jeśli arkusz żąda reakcji na najechanie, zamieniasz tylko onclick na onmouseover (lub 'click' na 'mouseover' w addEventListener). Gdy nie chcesz nadawać przyciskom id, przekaż do funkcji sam przycisk: onclick="pokazSekcje('kolor', this)" – this w atrybucie to kliknięty element, więc przycisk.style.backgroundColor = 'Salmon'.

classList – gotowy zestaw cech

Gdy zmiana wyglądu to więcej niż jedna właściwość (tło + kolor + ramka + przekreślenie), zamiast pięciu linii style.* zdefiniuj klasę w CSS i dodaj ją ze skryptu. Służy do tego classList:

MetodaCo robiPrzykład
classList.add('x')dodaje klasę (nic nie robi, jeśli już jest)li.classList.add('wykonane')
classList.remove('x')usuwa klasęimg.classList.remove('ramka')
classList.toggle('x')dodaje, jeśli nie ma; usuwa, jeśli jest; zwraca true, gdy po operacji klasa jestbody.classList.toggle('ciemny')
classList.toggle('x', warunek)wymusza: true = dodaj, false = usuńimg.classList.toggle('ramka', pole.checked)
classList.contains('x')sprawdza obecność klasyif (btn.classList.contains('aktywny'))
classList.replace('a', 'b')zamienia jedną klasę na innąikona.classList.replace('off', 'on')
classNamecały atrybut class jako napis (odczyt i nadpisanie)img.className = 'miniatury'

classList nie zastępuje stylów – przenosi je do CSS, gdzie są czytelniejsze. Przełączanie z toggle jest najkrótszym sposobem na „i tak na zmianę” z arkusza EE.09-07-22.01 (ikona on/off).

Sprawdź się

Element #box ma klasę karta. Co będzie w jego atrybucie class po wykonaniu kodu?

var box = document.getElementById('box');
box.classList.toggle('aktywna');
box.classList.toggle('aktywna');
box.classList.add('karta');
classList: tryb nocny i ramka
const obraz = document.getElementById('obraz');
const poleRamki = document.getElementById('ramka');

poleRamki.addEventListener('change', () => {
  obraz.classList.toggle('ramka', poleRamki.checked);   // zaznaczony → dodaj, odznaczony → usuń
});

document.getElementById('tryb').addEventListener('click', () => {
  const jestNocny = document.body.classList.toggle('nocny');   // true, gdy klasa dodana
  document.getElementById('stan').textContent = jestNocny ? 'Tryb nocny włączony' : 'Tryb dzienny';
});
Podgląd

Atrybuty: src, alt, title, setAttribute

Większość atrybutów HTML ma odpowiadającą właściwość elementu o tej samej nazwie: img.src, img.alt, img.title, a.href, input.disabled, input.placeholder. Zapis img.src = '2.jpg' to najprostszy sposób podmiany obrazka – i najczęstszy w arkuszach (galeria 1.jpg…7.jpg, miniatury 1m → 1d).

Uniwersalne metody działają na każdym atrybucie, także własnym (data-*) i takim, który nie ma właściwości:

MetodaPrzykład
setAttribute('nazwa', 'wartość')img.setAttribute('src', 'duzy.jpg')
getAttribute('nazwa')img.getAttribute('src') → "duzy.jpg" (dokładnie to, co w HTML)
removeAttribute('nazwa')btn.removeAttribute('disabled')
hasAttribute('nazwa')if (link.hasAttribute('target'))
dataset.nazwa<img data-numer="3"> → img.dataset.numer → "3"

Różnica między img.src a img.getAttribute('src'): właściwość zwraca pełny adres (http://localhost/galeria/2.jpg), atrybut – dokładnie to, co wpisano (2.jpg). Gdy chcesz sprawdzić, „który obraz jest aktualnie wyświetlony” (styczeń 2026, INF.03-03-26.01), użyj getAttribute('src') albo img.src.includes('1d') – porównanie img.src === '1d.bmp' zawiedzie przez pełny adres.

Sprawdź się

Na stronie jest <img id='foto' src='kol1.jpg'> i przycisk z atrybutem onclick ustawiającym document.getElementById('foto').src = 'kol2.jpg'. Który obraz będzie widoczny po kliknięciu?

Miniatury zmieniają duży obraz
// Na egzaminie masz pliki 1.jpg, 2.jpg… i piszesz: duzy.src = numer + 'd.jpg'
// Tu, bez plików, rysujemy obrazek w locie – ta funkcja to tylko zastępnik plików:
function zrodloObrazka(numer, szerokosc, wysokosc) {
  const kolory = ['', 'SteelBlue', 'Olive', 'Indigo'];
  const svg = '<svg xmlns="http://www.w3.org/2000/svg" width="' + szerokosc + '" height="' + wysokosc + '">' +
    '<rect width="100%" height="100%" fill="' + kolory[numer] + '"/>' +
    '<text x="50%" y="55%" font-size="' + (wysokosc / 2) + '" fill="white" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif">' + numer + '</text></svg>';
  return 'data:image/svg+xml;utf8,' + encodeURIComponent(svg);
}

const duzy = document.getElementById('duzy');
const miniatury = document.querySelectorAll('.miniatura');

// start: miniatury dostają obrazki, duży pokazuje obraz 1
for (const miniatura of miniatury) {
  const numer = miniatura.dataset.numer;                       // "1", "2", "3" – z atrybutu data-numer
  miniatura.src = zrodloObrazka(numer, 60, 35);                // na egzaminie: numer + 'm.jpg'
  miniatura.addEventListener('click', () => pokazDuzy(numer));
}
pokazDuzy(1);

function pokazDuzy(numer) {
  duzy.src = zrodloObrazka(numer, 240, 140);                   // na egzaminie: numer + 'd.jpg'
  duzy.alt = 'duży obraz ' + numer;
  document.getElementById('opis').textContent = 'Wyświetlany: obraz ' + numer;
  for (const m of miniatury) {
    m.classList.toggle('aktywna', m.dataset.numer == numer);   // == bo "1" vs 1
  }
}
Podgląd

Filtry CSS sterowane kontrolkami

Arkusz INF.03-12-24.06 kazał nakładać na obrazy filtry CSS z przycisków opcji i suwaków – wyłącznie przez element.style.filter. Wartość filter to napis z jedną lub kilkoma funkcjami oddzielonymi spacją:

FiltrZakresEfekt
blur(4px)0 i więcej pxrozmycie
sepia(100%)0–100 %odcień sepii
grayscale(100%)0–100 %czarno-biały
invert(100%)0–100 %negatyw
opacity(50%)0–100 %przezroczystość
brightness(150%)0 % i więcejjasność (100 % = bez zmian)
none–usuwa wszystkie filtry
Filtry z radio i suwaka
const zdjecie = document.getElementById('zdjecie');
// zastępnik pliku zdjecie.jpg – kolorowy gradient rysowany w locie
zdjecie.src = 'data:image/svg+xml;utf8,' + encodeURIComponent(
  '<svg xmlns="http://www.w3.org/2000/svg" width="240" height="120"><defs><linearGradient id="g">' +
  '<stop offset="0" stop-color="#e63946"/><stop offset="0.5" stop-color="#f2d338"/><stop offset="1" stop-color="#2a9d8f"/>' +
  '</linearGradient></defs><rect width="100%" height="100%" fill="url(#g)"/></svg>');

function zastosujFiltr() {
  const wybrany = document.querySelector('input[name="filtr"]:checked').value;   // np. "sepia(100%)"
  const jasnosc = document.getElementById('jasnosc').value;                       // np. "130"
  // dwa filtry w jednym napisie, oddzielone spacją
  zdjecie.style.filter = wybrany + ' brightness(' + jasnosc + '%)';
}

document.getElementById('jasnosc').addEventListener('input', () => {
  document.getElementById('jasnoscTekst').textContent = document.getElementById('jasnosc').value;
  zastosujFiltr();   // suwak działa na żywo, bez przycisku
});
Podgląd

Przypisanie style.filter = 'sepia(100%)' zastępuje poprzednią wartość – jeśli chcesz dodać efekt do istniejącego, sklej napisy albo trzymaj każdy filtr w osobnej zmiennej i składaj je w jednym miejscu, jak wyżej.

Pętla po kolekcji – zmiana stylu wielu elementów

Pytanie z części pisemnej (EE.09 czerwiec 2022): „co robi pętla po getElementsByClassName?”. Odpowiedź: zmienia styl każdego elementu klasy. Kolekcja sama nie ma style – trzeba przejść po elementach.

Pogrubienie całej klasy
function pogrub() {
  var elementy = document.getElementsByClassName('wazne');   // kolekcja – nie ma .style!
  for (var i = 0; i < elementy.length; i++) {
    elementy[i].style.fontWeight = 'bolder';                 // każdy element osobno
    elementy[i].style.color = 'Crimson';
  }
}
Podgląd

Na egzaminie

Ściąga

SkładniaCo robiPrzykład
el.style.wlasciwosc = 'wartość'styl inline, camelCase, wartość jako napis z jednostkąp.style.fontSize = '20px'
el.style.display = 'none' / 'block' / ''ukryj / pokaż / wróć do CSSsekcja.style.display = 'block'
el.hidden = true / falseukryj / pokaż atrybutem HTMLblok.hidden = true
el.style.backgroundColor = 'Salmon'tło (nazwa koloru CSS lub #rrggbb)aktywny przycisk
el.style.width = procent + '%'szerokość paska postępupasek.style.width = '36%'
el.style.filter = 'sepia(100%) blur(2px)'filtry CSS, kilka po spacjiimg.style.filter = 'none'
getComputedStyle(el).displaywartość wyliczona, także z arkusza CSSodczyt stanu
el.classList.add / remove / toggle / containszarządzanie klasamili.classList.add('wykonane')
el.classList.toggle('x', warunek)dodaj gdy true, usuń gdy falseimg.classList.toggle('ramka', pole.checked)
el.className = 'a b'nadpisz cały atrybut classimg.className = 'miniatury'
img.src = '2.jpg', img.alt, img.titlewłaściwości = atrybutyduzy.src = numer + 'd.jpg'
el.setAttribute('src', 'x.jpg') / getAttribute('src')dowolny atrybut, dokładna wartość z HTMLsprawdzenie, który obraz jest wyświetlony
el.removeAttribute('disabled')usuń atrybutodblokuj przycisk
el.dataset.numeratrybut data-numer"3" (napis)
for (const e of kolekcja) e.style.x = …zmiana stylu wielu elementówpętla po querySelectorAll
onclick="f('a', this)"przekaż kliknięty element do funkcjithis.style.backgroundColor

Zadania

Zadanie 1
łatwe

Wersja dla słabowidzących

Strona ma nagłówek, dwa akapity i dwa przyciski: Większa czcionka (każde kliknięcie zwiększa rozmiar tekstu całej strony – document.body.style.fontSize – o 2 px, startując od 16 px) oraz Kontrast (przełącza klasę kontrast na body: czarne tło, żółty tekst). Pod przyciskami akapit #stan pokazuje aktualny rozmiar, np. Rozmiar: 20px.

Pokaż rozwiązanie
Rozwiązanie: Wersja dla słabowidzących
let rozmiar = 16;                                  // stan trzymany w zmiennej poza funkcją
document.getElementById('wiekszy').addEventListener('click', () => {
  rozmiar += 2;
  document.body.style.fontSize = rozmiar + 'px';   // jednostka!
  document.getElementById('stan').textContent = 'Rozmiar: ' + rozmiar + 'px';
});
document.getElementById('kontrast').addEventListener('click', () => {
  document.body.classList.toggle('kontrast');      // na przemian
});
Podgląd
Zadanie 2
średniejak na INF.03

Rezerwacja w trzech krokach

Strona rezerwacja.html zawiera trzy bloki (<div> lub <section>) z formularzem w krokach: blok 1 „Dane” (imię, nazwisko, przycisk „Dalej”), blok 2 „Termin” (pole daty, przycisk „Dalej”), blok 3 „Płatność” (lista: karta / przelew, przycisk „Rezerwuję”). Na starcie widoczny jest tylko blok 1 – bloki 2 i 3 są ukryte w arkuszu CSS.

Skrypt w JavaScript: kliknięcie „Dalej” ukrywa bieżący blok i pokazuje następny, przez zmianę właściwości CSS. Kliknięcie „Rezerwuję” ukrywa blok 3 i w akapicie #podsumowanie pod blokami wypisuje: Rezerwacja dla <imię> <nazwisko> na <data>, płatność: <sposób>. Użyj jednej funkcji z parametrem do przechodzenia między blokami. Stosuj znaczące nazwy.

Kryteria samooceny (0/1):

  1. JavaScript, funkcja wywoływana przyciskami.
  2. Na starcie widoczny tylko blok 1 (ukrycie w CSS).
  3. „Dalej” w bloku 1 ukrywa blok 1 i pokazuje blok 2; w bloku 2 – ukrywa 2 i pokazuje 3 (przez display).
  4. „Rezerwuję” ukrywa blok 3 i wypisuje podsumowanie z danymi z kontrolek w podanym formacie.
  5. Funkcja przejścia ma parametr (lub są trzy osobne funkcje).
  6. Znaczące nazwy.
Pokaż rozwiązanie
Rozwiązanie: Rezerwacja w trzech krokach
// kryterium 5: jedna funkcja z parametrami – skąd i dokąd
function przejdzDoKroku(biezacy, nastepny) {
  document.getElementById('krok' + biezacy).style.display = 'none';
  document.getElementById('krok' + nastepny).style.display = 'block';
}

function zarezerwuj() {
  document.getElementById('krok3').style.display = 'none';
  const imie = document.getElementById('imie').value;
  const nazwisko = document.getElementById('nazwisko').value;
  const data = document.getElementById('data').value;          // "2026-11-15"
  const platnosc = document.getElementById('platnosc').value;
  document.getElementById('podsumowanie').textContent =
    'Rezerwacja dla ' + imie + ' ' + nazwisko + ' na ' + data + ', płatność: ' + platnosc;
}
Podgląd
Zadanie 3
średniejak na INF.03

Menu z podświetleniem – na najechanie

Strona oferta.html ma trzy bloki nawigacji (<div class="menu"> z tekstem „Kursy”, „Cennik”, „Kontakt”) i trzy sekcje z treścią. Na starcie widoczna jest sekcja „Kursy”, a jej blok menu ma tło LightGreen; pozostałe bloki menu mają tło #2E7D4F i biały tekst.

Skrypt w JavaScript: najechanie myszą na blok menu zmienia jego tło na LightGreen, pozostałym blokom przywraca #2E7D4F, pokazuje odpowiednią sekcję (display: block) i ukrywa pozostałe. Skrypt składa się z jednej funkcji parametrowej lub trzech funkcji, które modyfikują style CSS bloków. Stosuj znaczące nazwy.

Kryteria samooceny (0/1):

  1. JavaScript, funkcja uruchamiana zdarzeniem najechania (nie kliknięcia).
  2. Stan początkowy: sekcja „Kursy” widoczna, jej menu LightGreen, inne #2E7D4F.
  3. Po najechaniu aktywny blok ma tło LightGreen, pozostałe #2E7D4F – sprawdzane dla dwóch różnych bloków.
  4. Widoczna jest tylko sekcja odpowiadająca najechanemu blokowi.
  5. Zmiany realizowane przez modyfikację stylów CSS ze skryptu.
  6. Znaczące nazwy.
Pokaż rozwiązanie
Rozwiązanie: Menu z podświetleniem
function pokazOferte(nazwa) {
  const nazwy = ['kursy', 'cennik', 'kontakt'];
  for (const n of nazwy) {                                             // wszystkim wyłącz…
    document.getElementById('menu-' + n).style.backgroundColor = '#2E7D4F';
    document.getElementById(n).style.display = 'none';
  }
  document.getElementById('menu-' + nazwa).style.backgroundColor = 'LightGreen';   // …jednemu włącz
  document.getElementById(nazwa).style.display = 'block';
}
Podgląd

Wersja z trzema funkcjami (pokazKursy(), pokazCennik(), pokazKontakt()) też jest akceptowana, ale miałaby trzy razy więcej miejsc na literówkę.

Zadanie 4
średnie

Galeria z aktywną miniaturą

Pod dużym obrazem #duzy są cztery miniatury (<img class="miniatura" data-numer="1"> … 4). Kliknięcie miniatury: podmienia src dużego obrazu na <numer>d.jpg (w placu zabaw użyj funkcji zrodloObrazka z lekcji jako zastępnika plików), ustawia alt na Zdjęcie <numer>, dodaje klikniętej miniaturze klasę aktywna (czerwona ramka), a pozostałym ją usuwa. Dodatkowo przycisk Sprawdź wypisuje w akapicie numer aktualnie wyświetlonego obrazu, odczytany z atrybutu src dużego obrazu (nie ze zmiennej) – użyj getAttribute lub includes.

Pokaż rozwiązanie
Rozwiązanie: Galeria
// zastępnik plików 1d.jpg…4d.jpg i 1m.jpg…4m.jpg – na egzaminie podajesz zwykłe nazwy plików
function zrodloObrazka(numer, szer, wys) {
  const kolory = ['', 'SteelBlue', 'Olive', 'Indigo', 'Crimson'];
  const svg = '<svg xmlns="http://www.w3.org/2000/svg" width="' + szer + '" height="' + wys + '">' +
    '<rect width="100%" height="100%" fill="' + kolory[numer] + '"/>' +
    '<text x="50%" y="55%" font-size="' + wys / 2 + '" fill="white" text-anchor="middle" dominant-baseline="middle">' + numer + 'd</text></svg>';
  return 'data:image/svg+xml;utf8,' + encodeURIComponent(svg) + '#' + numer + 'd.jpg';   // końcówka ułatwia odczyt numeru
}

const duzy = document.getElementById('duzy');
const miniatury = document.querySelectorAll('.miniatura');

function pokazZdjecie(numer) {
  duzy.src = zrodloObrazka(numer, 240, 140);         // na egzaminie: duzy.src = numer + 'd.jpg';
  duzy.alt = 'Zdjęcie ' + numer;
  for (const m of miniatury) {
    m.classList.toggle('aktywna', m.dataset.numer === String(numer));
  }
}

for (const m of miniatury) {
  m.src = zrodloObrazka(m.dataset.numer, 60, 35);     // na egzaminie: m.src = numer + 'm.jpg'
  m.addEventListener('click', () => pokazZdjecie(m.dataset.numer));
}
pokazZdjecie(1);

document.getElementById('sprawdz').addEventListener('click', () => {
  const src = duzy.getAttribute('src');               // dokładna wartość atrybutu
  let numer = 0;
  for (let i = 1; i <= 4; i++) {
    if (src.includes(i + 'd.jpg')) numer = i;         // który plik jest w src?
  }
  document.getElementById('wynik').textContent = 'Wyświetlony obraz: ' + numer;
});
Podgląd
Zadanie 5
trudnejak na INF.03

Studio efektów

Strona efekty.html zawiera obraz #zdjecie (w placu zabaw: dowolny gradient jako data URI, jak w lekcji) oraz trzy grupy kontrolek:

  1. przyciski opcji „Sepia” / „Czarno-biały” / „Negatyw” / „Brak” (Brak domyślnie) i przycisk „Zastosuj” – nakłada sepia(100%), grayscale(100%), invert(100%) albo usuwa filtr;
  2. suwak „Rozmycie” 0–10 – działa na żywo (bez przycisku), dodaje blur(<wartość>px) do aktualnego filtru z grupy 1;
  3. przyciski „Jaśniej” i „Ciemniej” – każde kliknięcie zmienia jasność o 10 % (start 100 %, nie mniej niż 0 %).

Wszystkie efekty mają działać jednocześnie i wyłącznie przez element.style.filter. Napisz jedną funkcję odswiezFiltr(), która składa trzy części w jeden napis. Stosuj znaczące nazwy.

Kryteria samooceny (0/1):

  1. JavaScript, funkcje wywoływane zdarzeniami kontrolek.
  2. Po „Zastosuj” obraz ma filtr zgodny z zaznaczonym radio – dla dwóch różnych opcji.
  3. Suwak zmienia rozmycie bez klikania przycisku.
  4. „Jaśniej”/„Ciemniej” zmieniają jasność o 10 %, nie poniżej 0 %.
  5. Efekty łączą się (np. sepia + rozmycie + jasność jednocześnie).
  6. Zmiany wyłącznie przez style.filter; znaczące nazwy.
Pokaż rozwiązanie
Rozwiązanie: Studio efektów
const zdjecie = document.getElementById('zdjecie');
zdjecie.src = 'data:image/svg+xml;utf8,' + encodeURIComponent(
  '<svg xmlns="http://www.w3.org/2000/svg" width="240" height="120"><defs><linearGradient id="g">' +
  '<stop offset="0" stop-color="#e63946"/><stop offset="0.5" stop-color="#f2d338"/><stop offset="1" stop-color="#2a9d8f"/>' +
  '</linearGradient></defs><rect width="100%" height="100%" fill="url(#g)"/></svg>');

// stan trzech części filtru
let efekt = 'none';
let rozmyciePx = 0;
let jasnoscProcent = 100;

function odswiezFiltr() {
  // kryterium 5: jeden napis z trzema częściami; 'none' pomijamy, bo unieważniłby resztę
  let filtr = '';
  if (efekt !== 'none') filtr += efekt + ' ';
  filtr += 'blur(' + rozmyciePx + 'px) brightness(' + jasnoscProcent + '%)';
  zdjecie.style.filter = filtr;
  document.getElementById('jasnoscTekst').textContent = jasnoscProcent + '%';
}

function zastosujEfekt() {                                                  // kryterium 2
  efekt = document.querySelector('input[name="efekt"]:checked').value;
  odswiezFiltr();
}

document.getElementById('rozmycie').addEventListener('input', (zdarzenie) => {   // kryterium 3
  rozmyciePx = zdarzenie.target.valueAsNumber;
  odswiezFiltr();
});

function zmienJasnosc(krok) {                                               // kryterium 4
  jasnoscProcent += krok;
  if (jasnoscProcent < 0) jasnoscProcent = 0;
  odswiezFiltr();
}
Podgląd

Test powtórkowy

Test powtórkowy

Format jak w części pisemnej INF.03 – 4 odpowiedzi, 1 poprawna.

0/0poprawnych
Sprawdź się

Który zapis zmieni kolor tła elementu o id box na żółty?

Sprawdź się

Aby ukryć blok <div id='reklama'> tak, by nie zajmował miejsca, należy wykonać:

Sprawdź się

Co zrobi ta pętla w dialekcie egzaminacyjnym?

var elementy = document.getElementsByClassName('styl1');
for (var i = 0; i < elementy.length; i++) {
elementy[i].style.fontWeight = 'bolder';
}
Sprawdź się

Które wywołanie doda klasę aktywny do przycisku btn, nie usuwając jego pozostałych klas?

Sprawdź się

Element ma klasę on. Co da element.classList.toggle('on') i jaki będzie stan po wywołaniu?

Sprawdź się

Na stronie jest <img id='ikona' src='off.png'>. Który zapis podmieni obraz na on.png?

Sprawdź się

Które wywołanie ustawi atrybut title o wartości „Wzór 3” na elemencie img?

Sprawdź się

Arkusz: „najechanie na blok menu pokazuje sekcję”. Którego zdarzenia użyjesz?

Sprawdź się

Blok #sekcja2 ma w arkuszu CSS display: none. Co wypisze console.log(document.getElementById('sekcja2').style.display) przed jakimkolwiek kliknięciem?

Sprawdź się

Który zapis nałoży na obraz jednocześnie sepię i rozmycie 3 px?