Miten se toimii
Päivitämme tason 1 gallerian: pienen kuvan klikkaus avaa ison version koko sivun päälle tummalla taustalla (tätä kutsutaan lightbox:iksi). Uudelleenklikkaus sulkee sen.
Näytän sinulle: lightbox
HTML – lisää “suurennusikkuna” gallerian alle (alussa piilotettu):
<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 – ikkuna koko näytön päällä:
#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 – ja nyt jotain uutta: työskentelemme kaikkien kuvien kanssa kerralla:
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");
});
Uutta:
querySelectorAll(".gallery img")– löydä kaikki elementit jotka vastaavat CSS-valitsinta (sama syntaksi kuin CSS:ssä!). Palauttaa listan.forEach((photo) => { ... })– “tee tämä jokaiselle listan kohteelle.” Silmukka – toinen ohjelmoinnin perusrakennuspalikka.photo.src– kuvan osoite. Kopioimme sen pienestä kuvasta isoon.
Nyt sinun vuorosi 💪
- Lisää verkkosivullesi lightbox esimerkin mukaan. Sinulla on jo galleria tasolta 1 – varmista vain että valitsin (
.gallery img) vastaa luokkiasi. - Päivitys rohkeille – nuolilla navigointi:
Bonus: seuraava/edellinen kuva
Laajennus skriptiin – muistamme mikä kuva on auki:
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");
});
Kaksi uutta asiaa lisää: function showPhoto(number) {...} on nimetty funktio – koodipaketti jonka voit ajaa mistä tahansa nimellä. Ja photos[current] ottaa kohteen listasta sen sijainnilla (laskenta alkaa nollasta!).
Projekti-ideoita: 🏫 kuvia koulutapahtumista · 🙋 luomuksistasi ja seikkailuistasi · 🌍 kuvia matkoilta (tässä lightbox loistaa!) · ⚽ hetkiä otteluista.
Tarkista itse: Klikkaat kuvaa → se kasvaa tummalla taustalla. Klikkaat uudelleen → se sulkeutuu. Bonuksella voit navigoida nuolilla ja sulkea Esc:llä. Juuri näin galleriat toimivat ammattilaisverkkosivuilla – ja nyt tiedät mitä niiden sisällä on.
Mitä opit tästä oppitunnista
querySelectorAll()löytää kaikki CSS-valitsinta vastaavat elementit,forEachkäy ne läpi yksi kerrallaan.- Lightbox = piilotettu
<div>koko sivun päällä (position: fixed; inset: 0) +hidden-luokan vaihtaminen. - Funktio
function nimi() {...}on nimetty, uudelleenkäytettävä koodipaketti.
© 2026 Ing. Martin Polak / AlgoRhino · Sisällön käyttöehdot