2

I'm doing scaling on scroll trigger, the '.square' class when ScrollTriggered zooms in and overflows outside of the '.test' class, I want the scaling to be visible inside of the '.test' class and don't want it to overflow on other containers, what's wrong with my code?

gsap.registerPlugin(ScrollTrigger);

const tl = gsap.timeline({
    scrollTrigger: { 
        trigger: ".square", 
        start: "top top",
        end: "+=100%",
        scrub: true,
        pin: true,
        markers: true, 
    }
})

.to(".square", {
    scale: 2, 
    ease: "none"
})
    html, * {
        padding: 0px;
        margin: 0px;
    }

    body {
        display: flex;
        justify-content: center;
    }

    .container {
        width: 50%;
    }

    .test {
        width: 100%;
        height: 500vh;
        background-color: black;
    }

    .square {
        width: 100%;
        height: 100px;
        background-color: yellow;
    }
<body>
    <section class="container">
        <div class="test">
            <div class="square"></div>
        </div>
    </section>
    <section></section>
</body>


<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/ScrollTrigger.min.js"></script>
betty_
  • 61
  • 10

1 Answers1

2

Add a clipping path to the .test class:

gsap.registerPlugin(ScrollTrigger);

const tl = gsap.timeline({
    scrollTrigger: { 
        trigger: ".square", 
        start: "top top",
        end: "+=100%",
        scrub: true,
        pin: true,
        markers: true, 
    }
})

.to(".square", {
    scale: 2, 
    ease: "none"
})
    html, * {
        padding: 0px;
        margin: 0px;
    }

    body {
        display: flex;
        justify-content: center;
    }

    .container {
        width: 50%;
    }

    .test {
        width: 100%;
        height: 500vh;
        background-color: black;
        overflow: hidden;
        clip-path: inset(0 0 0 0);
    }

    .square {
        width: 100%;
        height: 100px;
        background-color: yellow;
    }
<body>
    <section class="container">
        <div class="test">
            <div class="square"></div>
        </div>
    </section>
    <section></section>
</body>


<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/gsap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.11.5/ScrollTrigger.min.js"></script>
Dan Mullin
  • 4,285
  • 2
  • 18
  • 34