→ לכל המאגר

G61 · תמונה שמתאספת מרצועות בגלילה

GSAP GSAP · ScrollTrigger scrub תמונות וגלריותהירו ופתיחהרקע ואווירה ממתין

התמונה מפורקת לרצועות אנכיות שנעות בכיוונים מתחלפים ובקצב שונה. ככל שגוללים הן מתיישרות, וברגע מסוים התמונה מתאחדת לחתיכה אחת.

מתי משתמשים: מעבר בין פרקים, פתיחת סקשן עבודות, רגע חשיפה של מוצר. עובד גם הפוך: התמונה מתפרקת כשממשיכים לגלול.

הדמו כאן עיצובי-ניטרלי בכוונה. כשהמהלך נכנס לפרויקט, מיובאת רק ההתנהגות: הצבעים, הרדיוסים, הפונטים והצללים יורשים את העיצוב של אותו פרויקט.

הדמו

גלול. הרצועות מתיישרות והתמונה מתאחדת.

במקום גרדיאנט אפשר לשים תמונה אחת של הלקוח, ואותו קוד יפרק אותה לרצועות בלי לחתוך שום קובץ מראש.

הטריק כולו ב-`background-size` וב-`background-position`: כל רצועה נושאת את אותה תמונה ברוחב של הפריים כפול מספר הרצועות, וההיסט שלה בוחר איזה חלק היא מראה. לכן אין צורך לחתוך קבצים מראש, וגם החלפת התמונה היא שורה אחת. `yPercent` מקבל פונקציה שמקבלת אינדקס, וזו הדרך של GSAP לתת לכל אלמנט ערך משלו בלי לולאה. שים לב שהתנועה בכיוונים מתחלפים לפי זוגי ואי-זוגי, ושהמרחק גדל עם האינדקס: שני הדברים יחד הם מה שיוצר תחושת פירוק ולא תחושת גל.

קוד להדבקה

הקוד כאן עומד בפני עצמו. כל טוקן עיצוב נושא ברירת מחדל, מחלקות העזר של המאגר מוטמעות בו, ותגי הסקריפט מסודרים לפי הסדר הנכון. פרויקט שמגדיר --accent או --line משלו יורש אותם אוטומטית. הרכיב הזה מסתמך על dir="rtl".

פתח קובץ עצמאי ↗
הצג את הקוד כאן

CSS

/* G61 · תמונה שמתאספת מרצועות בגלילה */
.bl{height:300vh;position:relative}
.bl-stick{position:sticky;top:0;height:100vh;display:grid;place-items:center;overflow:hidden}
.bl-frame{position:relative;width:min(880px,90vw);aspect-ratio:16/10;border-radius:18px;overflow:hidden;
  display:flex;background:var(--card, #fff)}
/* כל רצועה מציגה חלק אחר של אותה תמונה: הרקע רחב פי מספר הרצועות */
.bl-slice{flex:1;height:100%;background-image:linear-gradient(115deg,#3b5bdb,#0b7285 34%,#2b8a3e 58%,#e8590c 82%,#5f3dc4);
  background-repeat:no-repeat;will-change:transform}
.bl-cap{position:absolute;bottom:9vh;inset-inline:0;text-align:center;color:var(--muted, #6a6d85);font-size:15px}
.bl-after{padding:14vh var(--gutter, clamp(24px, 5vw, 96px));max-width:min(680px,92vw);margin-inline:auto;text-align:center;
  color:var(--muted, #6a6d85);font-size:17px;line-height:1.9}

HTML

<div class="bl"><div class="bl-stick">
  <div class="bl-frame"></div>
  <p class="bl-cap">גלול. הרצועות מתיישרות והתמונה מתאחדת.</p>
</div></div>
<p class="bl-after">במקום גרדיאנט אפשר לשים תמונה אחת של הלקוח, ואותו קוד יפרק אותה לרצועות בלי לחתוך שום קובץ מראש.</p>

JS

gsap.registerPlugin(ScrollTrigger);

(function(){
  const N=9;
  const frame=document.querySelector(".bl-frame");
  const reduce=matchMedia("(prefers-reduced-motion: reduce)").matches;
  const slices=[];
  for(let i=0;i<N;i++){
    const s=document.createElement("div");
    s.className="bl-slice";
    // הרקע ברוחב הפריים כפול מספר הרצועות, וכל רצועה מוסטת בחלק שלה
    s.style.backgroundSize=(N*100)+"% 100%";
    s.style.backgroundPosition=(i/(N-1)*100)+"% 50%";
    frame.appendChild(s);slices.push(s);
  }
  if(reduce)return;
  gsap.fromTo(slices,
    {yPercent:i=>(i%2?1:-1)*(60+i*7),opacity:.25},
    {yPercent:0,opacity:1,ease:"none",
     scrollTrigger:{trigger:".bl",start:"top top",end:"bottom bottom",scrub:.6}});
})();