Jakie są zasady działania?
Zaktualizujemy galerię z poziomu 1: kliknięcie małego zdjęcia otwiera jego dużą wersję na całej stronie z ciemnym tłem (nazywa się to lightboxem). Ponowne kliknięcie powoduje jego zamknięcie.
Pokażę ci: lightbox
HTML – dodaj „okno powiększenia” pod galerią (ukryte na początku):
<div class="gallery">
<img src="images/p1.jpg" alt="First photo">
<img src="images/p2.jpg" alt="Second photo">
<img src="images/p3.jpg" alt="Third photo">
</div>
<div id="lightbox" class="hidden">
<img id="lightbox-photo" src="" alt="">
</div>
CSS – okno obejmujące cały ekran:
#lightbox {
position: fixed; /* stuck over the whole window */
inset: 0; /* 0 from every edge = the whole area */
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%;
}
.hidden {
display: none !important; /* hide completely */
}
JavaScript – a teraz coś nowego: pracujemy z wszystkimi zdjęciami naraz:
const photos = document.querySelectorAll(".gallery img");
const lightbox = document.getElementById("lightbox");
const lightboxPhoto = document.getElementById("lightbox-photo");
// For every photo in the gallery: show it big on click
photos.forEach((photo) => {
photo.addEventListener("click", () => {
lightboxPhoto.src = photo.src;
lightboxPhoto.alt = photo.alt;
lightbox.classList.remove("hidden");
});
});
// Clicking anywhere in the lightbox closes it
lightbox.addEventListener("click", () => {
lightbox.classList.add("hidden");
});
Thanks.
querySelectorAll(".gallery img")– findallelements that match a CSS selector (the same syntax as in CSS!). Returns a list. -forEach((photo) => { ... })– “do this for every item in the list.” A loop – another basic building block of programming. -photo.src– the image’s address. We copy it from the small photo into the big one.
Teraz ty 💪
- Add a lightbox to your website following the example. You already have a gallery from Level 1 – just make sure the selector (
.gallery img) matches your classes. - Ulepszenie dla odważnych –nawigacja za pomocą strzałek:
Bonus: navigate to the next/previous photo
Rozszerzenie scenariusza – pamiętamy, które zdjęcie jest aktualnie otwarte:
const photos = document.querySelectorAll(".gallery img");
const lightbox = document.getElementById("lightbox");
const lightboxPhoto = document.getElementById("lightbox-photo");
let current = 0;
function showPhoto(number) {
// Handle wraparound: after the last photo comes the first again
if (number < 0) number = photos.length - 1;
if (number >= photos.length) number = 0;
current = number;
lightboxPhoto.src = photos[current].src;
lightboxPhoto.alt = photos[current].alt;
}
photos.forEach((photo, index) => {
photo.addEventListener("click", () => {
showPhoto(index);
lightbox.classList.remove("hidden");
});
});
lightbox.addEventListener("click", () => {
lightbox.classList.add("hidden");
});
// Navigate with the keyboard
document.addEventListener("keydown", (event) => {
if (lightbox.classList.contains("hidden")) return;
if (event.key === "ArrowRight") showPhoto(current + 1);
if (event.key === "ArrowLeft") showPhoto(current - 1);
if (event.key === "Escape") lightbox.classList.add("hidden");
});
Jeszcze dwie nowe rzeczy: function showPhoto(number) {...} to funkcja nazwana – pakiet kodu, który możesz uruchomić z dowolnego miejsca po nazwie. Iphotos[current]wyciąga element z listy według jego pozycji (liczenie rozpoczyna się od zera!).
Pomysły na projekty: 🏫 zdjęcia z wydarzeń szkolnych · 🙋 Twoje kreacje i przygody · 🌍 zdjęcia z wycieczek (tutaj naprawdę świeci lightbox!) · ⚽ chwile z meczów.
Sprawdź siebie: Klikasz zdjęcie→, które rośnie na ciemnym tle. Klikasz ponownie, aby → ją zamknąć. Dzięki bonusowi możesz również nawigować za pomocą strzałek i zamykać za pomocą Escape. Dokładnie tak działają galerie na profesjonalnych stronach internetowych – a teraz wiesz, co jest w środku.
Co wyniesiesz z tej lekcji
querySelectorAll()finds all elements matching a CSS selector,forEachgoes through them one by one.- A lightbox = a hidden
<div>covering the whole page (position: fixed; inset: 0) + toggling thehiddenclass. - A function
function name() {...}is a named, reusable package of code.
© 2026 Ing. Martin Polak / AlgoRhino · Warunki korzystania z treści