Bài học hiện đang bằng tiếng Séc. Giao diện đã được dịch – nội dung bài học sẽ sớm có.

← Cấp 2 – Pháp sư

Bài 5 / 8 ⏱ 35 phút

Thư viện ảnh có trình xem

Bấm vào ảnh thì ảnh phóng to, chiếm cả màn hình. Bạn sẽ học làm việc với một nhóm phần tử.

Cách hoạt động

Chúng ta nâng cấp thư viện ảnh từ Cấp 1: bấm ảnh nhỏ mở phiên bản lớn phủ cả trang với nền tối (gọi là lightbox). Bấm lần nữa thì đóng.

Xem này: lightbox

HTML – thêm “cửa sổ phóng to” dưới thư viện (ẩn lúc đầu):

<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 – cửa sổ phủ cả màn hình:

#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 – và giờ có điều mới: làm việc với tất cả ảnh cùng lúc:

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

Thứ mới:

Đến lượt bạn 💪

  1. Thêm lightbox vào website theo ví dụ. Bạn đã có thư viện từ Cấp 1 – chỉ cần selector (.gallery img) khớp class của bạn.
  2. Nâng cấp cho ai dũng cảm – điều hướng bằng mũi tên:
Thêm: chuyển ảnh trước/sau

Mở rộng script – nhớ ảnh đang mở:

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

Hai thứ mới nữa: function showPhoto(number) {...} là function có tên – gói code chạy từ bất cứ đâu bằng tên. Và photos[current] lấy mục trong danh sách theo vị trí (đếm từ 0!).

Ý tưởng dự án: 🏫 ảnh sự kiện trường · 🙋 sáng tạo và phiêu lưu · 🌍 ảnh chuyến đi (lightbox tỏa sáng ở đây!) · ⚽ khoảnh khắc trận đấu.

Tự kiểm tra: Bấm ảnh → phóng to trên nền tối. Bấm lại → đóng. Với phần thêm, bạn còn điều hướng bằng mũi tên và đóng bằng Escape. Đúng cách thư viện ảnh hoạt động trên website chuyên nghiệp – và giờ bạn biết bên trong có gì.

Điều cần nhớ từ bài học này