← Nivå 2 – Trollmann

Leksjon 5 av 8 ⏱ 35 minutter

Fotogalleri med en fremviser

Et klikk på et bilde gjør det større og fylder hele skjermen. Du lærer at arbejde med en gruppe elementer.

Sådan fungerer det

Vi opgraderer galleriet fra nivå 1: et klikk på et lille bilde åpner en stor version af det over hele siden med en mørk baggrund (det kaldes en lightbox). Et klikk igen lukker den.

Jeg viser deg: lightboxen

HTML – legg til et “zoomvindue” under galleriet (skjult i starten):

<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 – et vindue, der dekker hele skjermen:

#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 – og nu noe nyt: vi jobber med alle bilder på én gang:

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");
});

Nye ting:

Nå er det din tur 💪

  1. Legg til en lightbox til din nettside etter eksemplet. Du har allerede et galleri fra nivå 1 – sørg bare for, at selectoren (.gallery img) matcher dine klasser.
  2. En opgradering for de modige – navigation med pile:
Bonus: naviger til næste/forrige bilde

En udvidelse af scriptet – vi husker, hvilket bilde der er åbent:

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");
});

To nye ting mere: function showPhoto(number) {...} er en navngivet funktion – en pakke kode, du kan kjøre fra hvor som helst ved navn. Og photos[current] henter et element ud af en liste etter position (tælling starter ved nul!).

Projektidéer: 🏫 bilder fra skolearrangementer · 🙋 dine kreationer og eventyr · 🌍 bilder fra ture (her skinner lightboxen virkelig!) · ⚽ øyeblikk fra kampe.

Sjekk deg selv: Du klikker på et bilde → det vokser på en mørk baggrund. Du klikker igen → det lukker. Med bonussen kan du også navigere med pile og lukke med Escape. Nøyaktig sådan fungerer gallerier på profesjonelle nettsider – og nu ved du, hva der er indeni.

Dette tar du med deg fra leksjonen