Creative Polaroid Bildergallerie mit GSAP und Scrolltrigger programmieren

von Eric-Oliver Mächler | Feb. 24, 2026 | Design | 0 Kommentare

Schlagwörter: GSAP

Heute zeige ich euch eine coole Idee wie ihr eine Bildergalerie mit der Maus steuern könnt. Wenn man nach unten scrollt werden die Bilder einzeln eingeblendet und wenn man wieder hoch scrollt verschwinden die Bilder wieder in alle Richtungen. Diese Animation ist reines GSAP in Kombination mit dem ScrollTrigger.

Und heute zeige ich euch wie man so eine coole Galerie programmieren kann.

Video

GSAP Bibliothek

Damit ihr GSAP verwenden könnt, müsst ihr die Javascript Bibliothek natürlich zuerst ein eure Webseite einbinden. Hier findet ihr den entsprechenden Code auf der GSAP Webseite

HTML

<div class="start">
      <h1>Start</h1>
    </div>
    <div class="haupt">
      <div class="wrapper">
        <img src="pic/bild1.jpg" />
      </div>
      <div class="wrapper">
        <img src="pic/bild2.jpg" />
      </div>
      <div class="wrapper">
        <img src="pic/bild3.jpg" />
      </div>
      <div class="wrapper">
        <img src="pic/bild4.jpg" />
      </div>
      <div class="wrapper">
        <img src="pic/bild5.jpg" />
      </div>
    </div>
    <div class="ende">
      <h1>Ende</h1>
    </div>

CSS

body {
  background: var(--bg);
}

.start {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background: var(--bg-start);
}
.haupt {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background: var(--bg-haupt);
}

.ende {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
  background: var(--bg-ende);
}

h1 {
  font-size: 3rem;
  color: var(--h1);
}

img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.wrapper {
  position: absolute;
  width: 350px;
  aspect-ratio: 1;
  border-radius: 10px;
  padding: 8px 8px 24px 8px;
  background: #fafafa;
  box-shadow: 0 14px 20px rgba(0, 0, 0, 0.2);
  will-change: transform; /* for smoother animation */
  visibility: hidden;
}

Javascript

document.addEventListener("DOMContentLoaded", () => {
    gsap.registerPlugin(ScrollTrigger);

    const images = gsap.utils.toArray(".wrapper");

    const startPositions = [
        {x: "-90vw", y: "-50vw"},
        {x: "120vw", y: "-60vw"},
        {x: "-130vw", y: "60vw"},
        {x: "0vw", y: "-200vw"},
        {x: "10vw", y: "100vw"}
    ];

    const endPosition = [
       {x: "-30%", y: "20%", rotation: 7},
       {x: "40%", y: "-40%", rotation: -12},
       {x: "-45%", y: "-20%", rotation: 10},
       {x: "18%", y: "25%", rotation: -15},
       {x: "0%", y: "0%", rotation: 0}
    ];

    images.forEach((wrapper, i) => {
        gsap.set(wrapper,{
            x: startPositions[i].x,
            y: startPositions[i].y,
            rotation: gsap.utils.random(-60,60),
            scale: 0.5,
            visibility: "visible",
        })
    });

    const imagesTL = gsap.timeline({
        scrollTrigger: {
            trigger: ".haupt",
            start: "center center",
            scrub: 2,
            pin: true,
            anticipatePin: 1,
        }
    });

    images.forEach((wrapper, i) => {
        imagesTL.to(wrapper, {
            x: endPosition[i].x,
            y: endPosition[i].y,
            rotation: endPosition[i].rotation,
            scale: 1,
            ease: "power2.out",
            duration: 1
        } )
    })


})

0 Kommentare

Einen Kommentar abschicken

Du kannst auf Fediverse-Profile verlinken, indem du fl:@benutzername in deinem Kommentar eingibst.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert