index-main/assets/js/report.js

135 lines
4.5 KiB
JavaScript
Raw Normal View History

2026-01-29 20:57:17 +01:00
import { initSwipers } from './swipers.js';
2026-01-29 12:18:16 +01:00
export function report(responsiveSmall) {
if (document.body.dataset.template === 'report') {
2026-01-29 20:57:17 +01:00
2026-01-30 12:27:44 +01:00
// Initialiser tous les sliders de type before-after
2026-01-29 20:57:17 +01:00
initSliderBeforeAfter();
2026-01-29 12:18:16 +01:00
2026-02-06 17:07:18 +01:00
initHorizontalScroll();
2026-01-29 12:18:16 +01:00
// Ne fonctionne que pour les écrans plus grands que responsiveSmall
if (window.matchMedia(responsiveSmall).matches) {
2026-01-30 12:27:44 +01:00
// Sur mobile : initialiser les swipers normalement car initMediaDisplay ne sera pas actif
initSwipers();
2026-01-29 12:18:16 +01:00
return;
}
2026-01-30 12:27:44 +01:00
2026-02-06 16:03:17 +01:00
2026-01-29 12:18:16 +01:00
}
}
2026-01-29 20:57:17 +01:00
function initSliderBeforeAfter(container = document){
const slidersBeforeAfter = container.querySelectorAll('.slider-before-after');
slidersBeforeAfter.forEach(function (sliderContainer, index) {
const sliderInput = sliderContainer.querySelector('.slider');
if (sliderInput) {
sliderInput.addEventListener('input', (e) => {
console.log('slider value:', e.target.value);
sliderContainer.style.setProperty('--position', `${e.target.value}%`);
});
}
});
}
2026-02-06 17:07:18 +01:00
function initHorizontalScroll(){
const sections = document.querySelectorAll('.subsection-w-hscroll');
sections.forEach(function (section) {
2026-02-07 18:09:13 +01:00
const container = section.querySelector('.horizontal-scroll');
if (!container) return;
const wrapper = container.querySelector('.horizontal-scroll-wrapper');
2026-02-06 17:07:18 +01:00
if (!wrapper) return;
const slides = wrapper.querySelectorAll('.horizontal-scroll-slide');
2026-02-07 18:09:13 +01:00
// Calculer la distance totale à scroller horizontalement
function calculateScrollDistance() {
const totalSlidesWidth = Array.from(slides).reduce((acc, slide) => acc + slide.offsetWidth, 0);
const endMargin = window.innerWidth * 0.3; // 30vw de marge à la fin
return totalSlidesWidth - window.innerWidth + endMargin;
}
let scrollDistance = calculateScrollDistance();
// Créer un spacer invisible qui crée l'espace de scroll
// Hauteur = scrollDistance + hauteur du viewport pour maintenir le texte en dessous
const spacer = document.createElement('div');
spacer.className = 'horizontal-scroll-spacer';
spacer.style.height = `${scrollDistance + window.innerHeight}px`;
spacer.style.width = '100%';
spacer.style.pointerEvents = 'none';
// Insérer le spacer AVANT .horizontal-scroll
section.insertBefore(spacer, container);
// Calculer la position absolue du spacer une seule fois
function getSpacerTopPosition() {
let element = spacer;
let top = 0;
while (element) {
top += element.offsetTop;
element = element.offsetParent;
}
return top;
}
let spacerTopPosition = getSpacerTopPosition();
2026-02-06 17:07:18 +01:00
// Fonction de mise à jour du scroll horizontal
function updateHorizontalScroll() {
2026-02-07 18:09:13 +01:00
const scrollY = window.pageYOffset || document.documentElement.scrollTop;
2026-02-06 17:07:18 +01:00
2026-02-07 18:09:13 +01:00
// Début et fin du scroll basé sur le spacer
const scrollStart = spacerTopPosition;
const scrollEnd = spacerTopPosition + scrollDistance;
2026-02-06 17:07:18 +01:00
2026-02-07 18:09:13 +01:00
console.log('scrollY:', scrollY, 'scrollStart:', scrollStart, 'scrollEnd:', scrollEnd);
if (scrollY >= scrollStart && scrollY <= scrollEnd) {
// Phase de scroll horizontal : fixer le container
const progress = (scrollY - scrollStart) / scrollDistance;
const translateX = progress * scrollDistance;
2026-02-06 17:07:18 +01:00
2026-02-07 18:09:13 +01:00
console.log('Horizontal scroll active - progress:', progress);
wrapper.style.transform = `translateX(-${translateX}px)`;
container.style.position = 'fixed';
container.style.top = '0';
container.style.left = '0';
} else if (scrollY < scrollStart) {
// Avant le spacer : reset
console.log('Before spacer');
2026-02-06 17:07:18 +01:00
wrapper.style.transform = 'translateX(0)';
2026-02-07 18:09:13 +01:00
container.style.position = '';
container.style.top = '';
container.style.left = '';
2026-02-06 17:07:18 +01:00
} else {
2026-02-07 18:09:13 +01:00
// Après le spacer : garder le translate final et défixer
console.log('After spacer');
wrapper.style.transform = `translateX(-${scrollDistance}px)`;
container.style.position = '';
container.style.top = '';
container.style.left = '';
2026-02-06 17:07:18 +01:00
}
}
// Écouter le scroll
window.addEventListener('scroll', updateHorizontalScroll, { passive: true });
// Recalculer au resize
window.addEventListener('resize', function() {
2026-02-07 18:09:13 +01:00
scrollDistance = calculateScrollDistance();
spacer.style.height = `${scrollDistance + window.innerHeight}px`;
spacerTopPosition = getSpacerTopPosition();
updateHorizontalScroll();
2026-02-06 17:07:18 +01:00
});
// Initial call
updateHorizontalScroll();
});
}