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:
querySelectorAll(".gallery img")– tìm tất cả phần tử khớp CSS selector (cùng cú pháp như CSS!). Trả về danh sách.forEach((photo) => { ... })– “làm điều này với mọi mục trong danh sách.” Vòng lặp – khối xây dựng cơ bản khác của lập trình.photo.src– địa chỉ ảnh. Ta copy từ ảnh nhỏ sang ảnh lớn.
Đến lượt bạn 💪
- 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. - 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
querySelectorAll()tìm mọi phần tử khớp CSS selector,forEachduyệt từng cái.- Lightbox =
<div>ẩn phủ cả trang (position: fixed; inset: 0) + bật/tắt classhidden. - Function
function name() {...}là gói code có tên, dùng lại được.
© 2026 Ing. Martin Polak / AlgoRhino · Điều khoản sử dụng nội dung