← Poziom 2 – Czarodziej

Lekce 5 z 8 ⏱ 35 minut

Fotogalerie s prohlížením

Kliknutím na fotku se zvětší přes celou stránku. Naučíš se pracovat se skupinou prvků.

Jak to bude fungovat

Vylepšíme galerii z Poziomy 1: po kliknutí na malou fotku se přes celou stránku otevře její velká verze s tmavým pozadím (říká se tomu lightbox). Dalším kliknutím se zavře.

Pokaż mi to: lightbox

HTML – pod galerii přidej „zvětšovací okno” (na začátku schované):

<div class="galerie">
  <img src="obrazky/f1.jpg" alt="První fotka">
  <img src="obrazky/f2.jpg" alt="Druhá fotka">
  <img src="obrazky/f3.jpg" alt="Třetí fotka">
</div>

<div id="lightbox" class="schovany">
  <img id="lightbox-foto" src="" alt="">
</div>

CSS – okno přes celou obrazovku:

#lightbox {
  position: fixed;          /* přilepené přes celé okno */
  inset: 0;                 /* od všech okrajů 0 = celá plocha */
  background-color: rgba(0, 0, 0, 0.85);
  display: flex;
  justify-content: center;
  align-items: center;
  cursor: pointer;
}

#lightbox img {
  max-width: 90%;
  max-height: 90%;
}

.schovany {
  display: none !important; /* schovej úplně */
}

JavaScript – a teď novinka: pracujeme se všemi fotkami najednou:

const fotky = document.querySelectorAll(".galerie img");
const lightbox = document.getElementById("lightbox");
const lightboxFoto = document.getElementById("lightbox-foto");

// Pro každou fotku v galerii: po kliknutí ji ukaž velkou
fotky.forEach((fotka) => {
  fotka.addEventListener("click", () => {
    lightboxFoto.src = fotka.src;
    lightboxFoto.alt = fotka.alt;
    lightbox.classList.remove("schovany");
  });
});

// Kliknutí kamkoli do lightboxu ho zavře
lightbox.addEventListener("click", () => {
  lightbox.classList.add("schovany");
});

Novinky:

Teraz ty 💪

  1. Přidej lightbox do svého webu podle ukázky. Galerii už máš z Poziomy 1 – jen dbej na to, aby selektor (.galerie img) odpovídal tvým třídám.
  2. Vylepšení pro odvážné – listování šipkami:
Bonus: listování další/předchozí fotka

Rozšíření skriptu – pamatujeme si, která fotka je zrovna otevřená:

const fotky = document.querySelectorAll(".galerie img");
const lightbox = document.getElementById("lightbox");
const lightboxFoto = document.getElementById("lightbox-foto");
let aktualni = 0;

function ukazFotku(cislo) {
  // Ošetři přetečení: za poslední fotkou je zase první
  if (cislo < 0) cislo = fotky.length - 1;
  if (cislo >= fotky.length) cislo = 0;

  aktualni = cislo;
  lightboxFoto.src = fotky[aktualni].src;
  lightboxFoto.alt = fotky[aktualni].alt;
}

fotky.forEach((fotka, poradi) => {
  fotka.addEventListener("click", () => {
    ukazFotku(poradi);
    lightbox.classList.remove("schovany");
  });
});

lightbox.addEventListener("click", () => {
  lightbox.classList.add("schovany");
});

// Listování klávesnicí
document.addEventListener("keydown", (udalost) => {
  if (lightbox.classList.contains("schovany")) return;

  if (udalost.key === "ArrowRight") ukazFotku(aktualni + 1);
  if (udalost.key === "ArrowLeft") ukazFotku(aktualni - 1);
  if (udalost.key === "Escape") lightbox.classList.add("schovany");
});

Dvě novinky navíc: function ukazFotku(cislo) {...} je pojmenovaná funkce – balíček kódu, který můžeš spouštět odkudkoli jménem. A fotky[aktualni] vytahuje ze seznamu položku podle pořadí (počítá se od nuly!).

Náměty podle projektu: 🏫 fotky ze školních akcí · 🙋 tvoje výtvory a zážitky · 🌍 fotky z výletů (tady lightbox zazáří!) · ⚽ momentky ze zápasů.

Kontrola: Klikneš na fotku → zvětší se na tmavém pozadí. Klikneš znovu → zavře se. S bonusem navíc listuješ šipkami a zavíráš Escape. Přesně takhle funguje galerie na profi webech – a ty teď víš, co je uvnitř.

Co si z téhle lekce odnést