>script< gsap.registerPlugin(ScrollTrigger, Flip); function initFlipOnScroll() { let wrapperElements = document.querySelectorAll("[data-flip-element='wrapper']"); let targetEl = document.querySelector("[data-flip-element='target']"); let tl; function flipTimeline() { if (tl) { tl.kill(); gsap.set(targetEl, { clearProps: "all" }); } // Use the first and last wrapper elements for the scroll trigger. tl = gsap.timeline({ scrollTrigger: { trigger: wrapperElements[0], start: "center center", endTrigger: wrapperElements[wrapperElements.length - 1], end: "center center", scrub: 0.25 } }); // Loop through each wrapper element. wrapperElements.forEach(function(element, index) { let nextIndex = index + 1; if (nextIndex < wrapperElements.length) { let nextWrapperEl = wrapperElements[nextIndex]; // Calculate vertical center positions relative to the document. let nextRect = nextWrapperEl.getBoundingClientRect(); let thisRect = element.getBoundingClientRect(); let nextDistance = nextRect.top + window.pageYOffset + nextWrapperEl.offsetHeight / 2; let thisDistance = thisRect.top + window.pageYOffset + element.offsetHeight / 2; let offset = nextDistance - thisDistance; // Add the Flip.fit tween to the timeline. tl.add( Flip.fit(targetEl, nextWrapperEl, { duration: offset, ease: "none" }) ); } }); } flipTimeline(); let resizeTimer; window.addEventListener("resize", function () { clearTimeout(resizeTimer); resizeTimer = setTimeout(function () { flipTimeline(); }, 100); }); } // Initialize Scaling Elements on Scroll (GSAP Flip) document.addEventListener('DOMContentLoaded', function() { initFlipOnScroll(); }); >/script<