TEST FIX AND KEEPING OLD VERSION
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
Antoine M 2026-04-08 16:46:43 +02:00
parent 965b708b76
commit 9554d760fa
3 changed files with 258 additions and 26 deletions

View File

@ -0,0 +1,96 @@
const cards = gsap.utils.toArray(".scroll-story-block .narrative-card");
// Ajouter des classes alternées pour le styling
cards.forEach((card, index) => {
if (index % 2 === 0) {
card.classList.add("narrative-card--even");
} else {
card.classList.add("narrative-card--odd");
}
});
// Définir le breakpoint pour mobile/desktop (vous pouvez l'ajuster selon vos besoins)
const MOBILE_BREAKPOINT = 768;
let scrollTriggers = [];
let stickDistance = 0;
// Fonction pour initialiser les ScrollTriggers (desktop)
function initScrollTriggers() {
// Nettoyer d'abord les ScrollTriggers existants
killScrollTriggers();
if (cards.length === 0) return;
let firstCardST = ScrollTrigger.create({
trigger: cards[0],
start: "top 10%",
});
scrollTriggers.push(firstCardST);
let lastCardST = ScrollTrigger.create({
trigger: cards[cards.length - 1],
start: "top 10%",
});
scrollTriggers.push(lastCardST);
cards.forEach((card, index) => {
var scale = 1 - (cards.length - index) * 0.025;
let scaleDown = gsap.to(card, {
scale: scale,
"transform-origin": '"50% ' + (lastCardST.start + stickDistance) + '"',
});
let cardST = ScrollTrigger.create({
trigger: card,
start: "top 10%",
end: () => lastCardST.start + stickDistance,
pin: true,
// markers: true,
pinSpacing: false,
ease: "none",
animation: scaleDown,
toggleActions: "restart none none reverse",
});
scrollTriggers.push(cardST);
});
}
// Fonction pour détruire tous les ScrollTriggers
function killScrollTriggers() {
scrollTriggers.forEach((st) => st.kill());
scrollTriggers = [];
// Réinitialiser les styles inline des cartes
cards.forEach((card) => {
gsap.set(card, { clearProps: "all" });
});
}
// Fonction pour gérer le responsive
function handleResize() {
const isMobile = window.innerWidth < MOBILE_BREAKPOINT;
if (isMobile) {
// Sur mobile : détruire les ScrollTriggers
killScrollTriggers();
} else {
// Sur desktop : créer les ScrollTriggers s'ils n'existent pas
if (scrollTriggers.length === 0) {
initScrollTriggers();
}
}
}
// Initialisation au chargement
handleResize();
// Écouter les événements de resize avec debounce pour optimiser les performances
let resizeTimer;
window.addEventListener("resize", () => {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
handleResize();
}, 250);
});

View File

@ -1,25 +1,31 @@
const cards = gsap.utils.toArray(".scroll-story-block .narrative-card"); const MOBILE_BREAKPOINT = 768;
// Ajouter des classes alternées pour le styling let scrollTriggers = [];
cards.forEach((card, index) => { let stickDistance = 0;
function getBlocks() {
return gsap.utils.toArray(".scroll-story-block");
}
function getBlockCards(block) {
return gsap.utils.toArray(block.querySelectorAll(".narrative-card"));
}
function applyEvenOddClasses() {
getBlocks().forEach((block) => {
getBlockCards(block).forEach((card, index) => {
card.classList.remove("narrative-card--even", "narrative-card--odd");
if (index % 2 === 0) { if (index % 2 === 0) {
card.classList.add("narrative-card--even"); card.classList.add("narrative-card--even");
} else { } else {
card.classList.add("narrative-card--odd"); card.classList.add("narrative-card--odd");
} }
}); });
});
}
// Définir le breakpoint pour mobile/desktop (vous pouvez l'ajuster selon vos besoins) function initScrollTriggersForBlock(block) {
const MOBILE_BREAKPOINT = 768; const cards = getBlockCards(block);
let scrollTriggers = [];
let stickDistance = 0;
// Fonction pour initialiser les ScrollTriggers (desktop)
function initScrollTriggers() {
// Nettoyer d'abord les ScrollTriggers existants
killScrollTriggers();
if (cards.length === 0) return; if (cards.length === 0) return;
let firstCardST = ScrollTrigger.create({ let firstCardST = ScrollTrigger.create({
@ -38,7 +44,8 @@ function initScrollTriggers() {
var scale = 1 - (cards.length - index) * 0.025; var scale = 1 - (cards.length - index) * 0.025;
let scaleDown = gsap.to(card, { let scaleDown = gsap.to(card, {
scale: scale, scale: scale,
"transform-origin": '"50% ' + (lastCardST.start + stickDistance) + '"', // transformOrigin: "50% " + (lastCardST.start + stickDistance),
// transformOrigin: "center top",
}); });
let cardST = ScrollTrigger.create({ let cardST = ScrollTrigger.create({
@ -46,8 +53,9 @@ function initScrollTriggers() {
start: "top 10%", start: "top 10%",
end: () => lastCardST.start + stickDistance, end: () => lastCardST.start + stickDistance,
pin: true, pin: true,
// markers: true, markers: true,
pinSpacing: false, pinSpacing: false,
// pinSpacing: true,
ease: "none", ease: "none",
animation: scaleDown, animation: scaleDown,
toggleActions: "restart none none reverse", toggleActions: "restart none none reverse",
@ -57,36 +65,48 @@ function initScrollTriggers() {
}); });
} }
// Fonction pour détruire tous les ScrollTriggers function initScrollTriggers() {
killScrollTriggers();
getBlocks().forEach((block) => {
initScrollTriggersForBlock(block);
});
ScrollTrigger.refresh();
}
function killScrollTriggers() { function killScrollTriggers() {
scrollTriggers.forEach((st) => st.kill()); scrollTriggers.forEach((st) => st.kill());
scrollTriggers = []; scrollTriggers = [];
// Réinitialiser les styles inline des cartes gsap.utils.toArray(".scroll-story-block .narrative-card").forEach((card) => {
cards.forEach((card) => {
gsap.set(card, { clearProps: "all" }); gsap.set(card, { clearProps: "all" });
}); });
} }
// Fonction pour gérer le responsive
function handleResize() { function handleResize() {
const isMobile = window.innerWidth < MOBILE_BREAKPOINT; const isMobile = window.innerWidth < MOBILE_BREAKPOINT;
if (isMobile) { if (isMobile) {
// Sur mobile : détruire les ScrollTriggers
killScrollTriggers(); killScrollTriggers();
} else { } else {
// Sur desktop : créer les ScrollTriggers s'ils n'existent pas
if (scrollTriggers.length === 0) { if (scrollTriggers.length === 0) {
initScrollTriggers(); initScrollTriggers();
} else {
ScrollTrigger.refresh();
} }
} }
} }
// Initialisation au chargement applyEvenOddClasses();
handleResize(); handleResize();
// Écouter les événements de resize avec debounce pour optimiser les performances window.addEventListener("load", () => {
if (window.innerWidth >= MOBILE_BREAKPOINT && scrollTriggers.length > 0) {
ScrollTrigger.refresh();
}
});
let resizeTimer; let resizeTimer;
window.addEventListener("resize", () => { window.addEventListener("resize", () => {
clearTimeout(resizeTimer); clearTimeout(resizeTimer);

View File

@ -0,0 +1,116 @@
const MOBILE_BREAKPOINT = 768;
let scrollTriggers = [];
let stickDistance = 0;
function getBlocks() {
return gsap.utils.toArray(".scroll-story-block");
}
function getBlockCards(block) {
return gsap.utils.toArray(block.querySelectorAll(".narrative-card"));
}
function applyEvenOddClasses() {
getBlocks().forEach((block) => {
getBlockCards(block).forEach((card, index) => {
card.classList.remove("narrative-card--even", "narrative-card--odd");
if (index % 2 === 0) {
card.classList.add("narrative-card--even");
} else {
card.classList.add("narrative-card--odd");
}
});
});
}
function initScrollTriggersForBlock(block) {
const cards = getBlockCards(block);
if (cards.length === 0) return;
let firstCardST = ScrollTrigger.create({
trigger: cards[0],
start: "top 10%",
});
scrollTriggers.push(firstCardST);
let lastCardST = ScrollTrigger.create({
trigger: cards[cards.length - 1],
start: "top 10%",
});
scrollTriggers.push(lastCardST);
cards.forEach((card, index) => {
var scale = 1 - (cards.length - index) * 0.025;
let scaleDown = gsap.to(card, {
scale: scale,
// transformOrigin: "50% " + (lastCardST.start + stickDistance),
// transformOrigin: "center top",
});
let cardST = ScrollTrigger.create({
trigger: card,
start: "top 10%",
end: () => lastCardST.start + stickDistance,
pin: true,
markers: true,
pinSpacing: false,
// pinSpacing: true,
ease: "none",
animation: scaleDown,
toggleActions: "restart none none reverse",
});
scrollTriggers.push(cardST);
});
}
function initScrollTriggers() {
killScrollTriggers();
getBlocks().forEach((block) => {
initScrollTriggersForBlock(block);
});
ScrollTrigger.refresh();
}
function killScrollTriggers() {
scrollTriggers.forEach((st) => st.kill());
scrollTriggers = [];
gsap.utils.toArray(".scroll-story-block .narrative-card").forEach((card) => {
gsap.set(card, { clearProps: "all" });
});
}
function handleResize() {
const isMobile = window.innerWidth < MOBILE_BREAKPOINT;
if (isMobile) {
killScrollTriggers();
} else {
if (scrollTriggers.length === 0) {
initScrollTriggers();
} else {
ScrollTrigger.refresh();
}
}
}
applyEvenOddClasses();
handleResize();
window.addEventListener("load", () => {
if (window.innerWidth >= MOBILE_BREAKPOINT && scrollTriggers.length > 0) {
ScrollTrigger.refresh();
}
});
let resizeTimer;
window.addEventListener("resize", () => {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(() => {
handleResize();
}, 250);
});