→ לכל המאגר

G51 · שתי עמודות שנעות בכיוונים הפוכים

GSAP GSAP · ScrollTrigger תמונות וגלריותרקע ואווירהכרטיסים ממתין

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

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

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

הדמו

גלול למטה, הדמו מגיע ↓

קיר העבודות

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

עוד מסלול גלילה. נסה גם חזרה למעלה ↑
שלוש הכרעות שמונעות מהמהלך להיראות זול: התנועה ביחידות אחוז ולא בפיקסלים, ולכן היא מתכווצת מעצמה במסכים קטנים; הטווח קטן בכוונה, שישה אחוזים לכל כיוון, כי מעבר לזה נוצרים חורים בקצוות הקיר; וה-scrub מושהה מעט כדי שהעמודות ימשיכו רגע אחרי שעוצרים לגלול. `gsap.matchMedia` מכבה את הכל במובייל ובמצב חיסכון בתנועה, ומנקה אחריו כשחוזרים לרוחב אחר.

קוד להדבקה

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

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

CSS

/* מחלקות עזר של המאגר שהרכיב הזה משתמש בהן */
.stage{padding:var(--sec, clamp(120px, 12vw, 260px)) var(--gutter, clamp(24px, 5vw, 96px));position:relative}
.stage.tight{padding-block:clamp(48px,5vw,90px)}
.stage.full{padding-inline:0}
.ph{display:flex;align-items:center;justify-content:center;color:#fff;font-weight:700;border-radius:var(--r, 14px)}
.ph-a{background:linear-gradient(160deg,#3b5bdb,#748ffc)}
.ph-b{background:linear-gradient(160deg,#5f3dc4,#9775fa)}
.ph-c{background:linear-gradient(160deg,#0b7285,#3bc9db)}
.ph-d{background:linear-gradient(160deg,#2b8a3e,#69db7c)}
.ph-e{background:linear-gradient(160deg,#e8590c,#ffa94d)}
.ph-f{background:linear-gradient(160deg,#c92a2a,#ff8787)}

/* G51 · שתי עמודות שנעות בכיוונים הפוכים */
.oc{display:grid;grid-template-columns:repeat(3,1fr);gap:clamp(10px,1.4vw,20px);
  max-width:min(1080px,94vw);margin-inline:auto;align-items:start}
.oc-col{display:grid;gap:clamp(10px,1.4vw,20px);will-change:transform}
.oc-col .ph{aspect-ratio:3/4;font-size:0;border-radius:14px}
.oc-col:nth-child(2) .ph{aspect-ratio:4/5}
.oc-head{text-align:center;max-width:44ch;margin:0 auto clamp(24px,4vw,46px)}
.oc-head h3{font-size:clamp(24px,3.4vw,44px);margin:0 0 10px}
.oc-head p{color:var(--muted, #6a6d85);font-size:17px;line-height:1.8;margin:0}
@media(max-width:700px){.oc{grid-template-columns:1fr 1fr}.oc-col:nth-child(3){display:none}}

HTML

<div class="stage"><div class="oc-head"><h3>קיר העבודות</h3>
  <p>גלול. העמודות נעות בכיוונים הפוכים, והקיר מקבל עומק בלי אנימציה שצועקת.</p></div>
<div class="oc">
  <div class="oc-col"><div class="ph ph-a"></div><div class="ph ph-c"></div><div class="ph ph-d"></div><div class="ph ph-e"></div></div>
  <div class="oc-col"><div class="ph ph-b"></div><div class="ph ph-f"></div><div class="ph ph-a"></div><div class="ph ph-c"></div></div>
  <div class="oc-col"><div class="ph ph-d"></div><div class="ph ph-e"></div><div class="ph ph-b"></div><div class="ph ph-f"></div></div>
</div></div>

JS

gsap.registerPlugin(ScrollTrigger);

(function(){
  // רק במסכים שיש בהם מקום לתנועה. במובייל זה מייצר חורים בפריסה
  gsap.matchMedia().add("(min-width: 700px) and (prefers-reduced-motion: no-preference)",()=>{
    const cols=gsap.utils.toArray(".oc-col");
    const tw=cols.map((col,i)=>{
      const dir=i%2?1:-1;                       // אי-זוגית יורדת, זוגית עולה
      return gsap.fromTo(col,{yPercent:6*dir},{yPercent:-6*dir,ease:"none",
        scrollTrigger:{trigger:".oc",start:"top bottom",end:"bottom top",scrub:1.2}});
    });
    return ()=>tw.forEach(t=>{t.scrollTrigger&&t.scrollTrigger.kill();t.kill();});
  });
})();