Click on photo tag -> Photo on top + scroll to top

This commit is contained in:
2025-08-13 22:10:03 +00:00
parent 6fc573c510
commit 4edeb8709a
2 changed files with 65 additions and 32 deletions

View File

@ -17,24 +17,11 @@ const setupLoader = () => {
window.addEventListener('load', () => { window.addEventListener('load', () => {
setTimeout(() => { setTimeout(() => {
const loader = document.querySelector('.page-loader'); const loader = document.querySelector('.page-loader');
if (loader) { if (loader) loader.classList.add('hidden');
loader.classList.add('hidden');
}
}, 50); }, 50);
}); });
}; };
// Gallery randomizer to shuffle gallery sections on page load
const shuffleGallery = () => {
const gallery = document.querySelector('.gallery');
if (!gallery) return;
const sections = Array.from(gallery.querySelectorAll('.section'));
while (sections.length) {
const randomIndex = Math.floor(Math.random() * sections.length);
gallery.appendChild(sections.splice(randomIndex, 1)[0]);
}
};
// Hero background randomizer // Hero background randomizer
const randomizeHeroBackground = () => { const randomizeHeroBackground = () => {
const heroBg = document.querySelector(".hero-background"); const heroBg = document.querySelector(".hero-background");
@ -65,32 +52,74 @@ const randomizeHeroBackground = () => {
.catch(console.error); .catch(console.error);
}; };
// Gallery randomizer to shuffle gallery sections on page load
const shuffleGallery = () => {
const gallery = document.querySelector('.gallery');
if (!gallery) return;
const sections = Array.from(gallery.querySelectorAll('.section'));
while (sections.length) {
const randomIndex = Math.floor(Math.random() * sections.length);
gallery.appendChild(sections.splice(randomIndex, 1)[0]);
}
};
// Tags filter functionality // Tags filter functionality
const setupTagFilter = () => { const setupTagFilter = () => {
const galleryContainer = document.querySelector('#gallery');
const allSections = document.querySelectorAll('.section[data-tags]'); const allSections = document.querySelectorAll('.section[data-tags]');
const allTags = document.querySelectorAll('.tag'); const allTags = document.querySelectorAll('.tag');
let activeTags = []; let activeTags = [];
let lastClickedTag = null; // mémorise le dernier tag cliqué
const applyFilter = () => { const applyFilter = () => {
let filteredSections = [];
let matchingSection = null;
allSections.forEach((section) => { allSections.forEach((section) => {
const sectionTags = section.dataset.tags.toLowerCase().split(/\s+/); const sectionTags = section.dataset.tags.toLowerCase().split(/\s+/);
const hasAllTags = activeTags.every((tag) => sectionTags.includes(tag)); const hasAllTags = activeTags.every((tag) => sectionTags.includes(tag));
section.style.display = hasAllTags ? '' : 'none'; section.style.display = hasAllTags ? '' : 'none';
if (hasAllTags) {
filteredSections.push(section);
if (lastClickedTag && sectionTags.includes(lastClickedTag) && !matchingSection) {
matchingSection = section;
}
}
}); });
// Réorganise : la photo correspondante au dernier tag cliqué en premier
if (matchingSection && galleryContainer.contains(matchingSection)) {
galleryContainer.prepend(matchingSection);
}
// Met à jour le style des tags
allTags.forEach((tagEl) => { allTags.forEach((tagEl) => {
const tagText = tagEl.textContent.replace('#', '').toLowerCase(); const tagText = tagEl.textContent.replace('#', '').toLowerCase();
tagEl.classList.toggle('active', activeTags.includes(tagText)); tagEl.classList.toggle('active', activeTags.includes(tagText));
}); });
// Met à jour l'URL
const base = window.location.pathname; const base = window.location.pathname;
const query = activeTags.length > 0 ? `?tag=${activeTags.join(',')}` : ''; const query = activeTags.length > 0 ? `?tag=${activeTags.join(',')}` : '';
window.history.pushState({}, '', base + query); window.history.pushState({}, '', base + query);
// Scroll jusqu'à la galerie
if (galleryContainer) {
galleryContainer.scrollIntoView({ behavior: 'smooth', block: 'start' });
}
}; };
allTags.forEach((tagEl) => { allTags.forEach((tagEl) => {
tagEl.addEventListener('click', () => { tagEl.addEventListener('click', () => {
const tagText = tagEl.textContent.replace('#', '').toLowerCase(); const tagText = tagEl.textContent.replace('#', '').toLowerCase();
activeTags = activeTags.includes(tagText) lastClickedTag = tagText; // mémorise le dernier tag cliqué
? activeTags.filter((t) => t !== tagText)
: [...activeTags, tagText]; if (activeTags.includes(tagText)) {
activeTags = activeTags.filter((t) => t !== tagText);
} else {
activeTags.push(tagText);
}
applyFilter(); applyFilter();
}); });
}); });
@ -100,29 +129,24 @@ const setupTagFilter = () => {
const urlTags = params.get('tag'); const urlTags = params.get('tag');
if (urlTags) { if (urlTags) {
activeTags = urlTags.split(',').map((t) => t.toLowerCase()); activeTags = urlTags.split(',').map((t) => t.toLowerCase());
lastClickedTag = activeTags[activeTags.length - 1] || null;
applyFilter(); applyFilter();
} }
}); });
}; };
// Disable right-click context menu and image dragging // Disable right click and drag
const disableRightClickAndDrag = () => { const disableRightClickAndDrag = () => {
document.addEventListener("contextmenu", (e) => e.preventDefault()); document.addEventListener('contextmenu', (e) => e.preventDefault());
document.addEventListener("dragstart", (e) => { document.addEventListener('dragstart', (e) => e.preventDefault());
if (e.target.tagName === "IMG") {
e.preventDefault();
}
});
}; };
// Scroll-to-top button functionality // Scroll to top button
const setupScrollToTopButton = () => { const setupScrollToTopButton = () => {
const scrollBtn = document.getElementById("scrollToTop"); const scrollToTopButton = document.querySelector('.scroll-to-top');
window.addEventListener("scroll", () => { if (!scrollToTopButton) return;
scrollBtn.style.display = window.scrollY > 300 ? "block" : "none"; scrollToTopButton.addEventListener('click', () => {
}); window.scrollTo({ top: 0, behavior: 'smooth' });
scrollBtn.addEventListener("click", () => {
window.scrollTo({ top: 0, behavior: "smooth" });
}); });
}; };

View File

@ -333,8 +333,12 @@ h2 {
font-size: 22px; font-size: 22px;
} }
/* Sections */
.gallery {
padding-top: 15px;
}
/* Sections */
.section { .section {
max-width: 1140px; max-width: 1140px;
margin:auto; margin:auto;
@ -508,4 +512,9 @@ h2 {
padding-left: 0; padding-left: 0;
margin-top: 60px; margin-top: 60px;
} }
.gallery {
margin: 10% 5% 0 5%;
padding-top: 15px;
}
} }