homegrade_blocks_production/acf-blocks/lightbox-gallery/lightbox.js

102 lines
2.7 KiB
JavaScript

class Lightbox {
constructor() {
this.lightbox = document.querySelector(".lightbox");
this.closeButton = this.lightbox.querySelector(".lightbox__close");
this.prevButton = this.lightbox.querySelector(".lightbox__prev");
this.nextButton = this.lightbox.querySelector(".lightbox__next");
this.gallery = document.querySelector(".lightbox-gallery");
this.currentPictureIndex = 0;
if (this.gallery) {
this.pictures = this.gallery.querySelectorAll("img.lightbox-gallery__picture");
this.lightboxTriggers = this.gallery.querySelectorAll(".lightbox-gallery__trigger");
this.init();
}
}
init() {
this.setCurrentPicture(this.pictures);
this.lightboxTriggers.forEach((button, index) => {
button.addEventListener("click", () => {
this.showLightbox();
this.setCurrentPicture(this.pictures[index]);
this.setCurrentPictureIndex(index);
});
});
this.closeButton.addEventListener("click", () => {
this.hideLightbox();
});
this.prevButton.addEventListener("click", () => {
this.showPreviousPicture();
});
this.nextButton.addEventListener("click", () => {
this.showNextPicture();
});
document.addEventListener("keydown", (event) => {
if (event.key === "Escape") {
this.hideLightbox();
}
if (event.key === "ArrowLeft") {
this.showPreviousPicture();
}
if (event.key === "ArrowRight") {
this.showNextPicture();
}
if (event.key === "TaEnter") {
this.showNextPicture();
}
});
}
showLightbox() {
this.lightbox.classList.remove("lightbox--inactive");
this.lightbox.classList.add("lightbox--active");
this.closeButton.focus();
this.lightbox.setAttribute("aria-hidden", "false");
}
hideLightbox() {
this.lightbox.classList.remove("lightbox--active");
this.lightbox.classList.add("lightbox--inactive");
this.lightbox.setAttribute("aria-hidden", "true");
this.lightboxTriggers[this.currentPictureIndex].focus();
}
setCurrentPicture(picture) {
const viewedPicture = this.lightbox.querySelector(".lightbox__current-picture img");
viewedPicture.src = picture.src;
}
setCurrentPictureIndex(index) {
this.currentPictureIndex = index;
}
showPreviousPicture() {
if (this.currentPictureIndex > 0) {
this.currentPictureIndex--;
} else {
this.currentPictureIndex = this.pictures.length - 1;
}
this.setCurrentPicture(this.pictures[this.currentPictureIndex]);
}
showNextPicture() {
if (this.currentPictureIndex < this.pictures.length - 1) {
this.currentPictureIndex++;
} else {
this.currentPictureIndex = 0;
}
this.setCurrentPicture(this.pictures[this.currentPictureIndex]);
}
}
document.addEventListener("DOMContentLoaded", () => {
new Lightbox();
});