→ לכל המאגר

G35 · טקסט ענק זורם על גל בגלילה

GSAP GSAP · ScrollTrigger · SplitText טקסט וכותרותהירו ופתיחה ממתין

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

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

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

הדמו

גלול למטה, הדמו מגיע ↓
אז, מוכנים להתחיל לזוז?
עוד מסלול גלילה. נסה גם חזרה למעלה ↑
בכיוון RTL הטקסט מתחיל מימין והעודף נמצא משמאל, לכן המסלול מזיז את הרצועה ימינה (x חיובי). באתר LTR הופכים את הסימן.

קוד להדבקה

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

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

CSS

/* G35 · טקסט ענק זורם על גל בגלילה */
html,body{overflow-x:clip}
.wave{height:100vh;display:flex;align-items:center;overflow:hidden;background:var(--bg, #f7f7fa);border-block:1px solid var(--line, #e4e4ee)}
.wave-track{white-space:nowrap;font-size:clamp(72px,14vw,240px);font-weight:800;line-height:1;padding-inline:var(--gutter, clamp(24px, 5vw, 96px));will-change:transform}
.wave-track .word{display:inline-block;will-change:transform}

HTML

<div class="wave"><div class="wave-track">אז, מוכנים להתחיל לזוז?</div></div>

JS

gsap.registerPlugin(ScrollTrigger, SplitText);

(function(){
  const track=document.querySelector(".wave-track"),sec=document.querySelector(".wave");
  const split=SplitText.create(track,{type:"words",wordsClass:"word"});
  const words=split.words;
  const dist=()=>Math.max(0,track.scrollWidth-sec.clientWidth);
  const tl=gsap.timeline({scrollTrigger:{trigger:sec,start:"top top",end:"+=220%",pin:true,scrub:1,invalidateOnRefresh:true}});
  tl.fromTo(track,{x:0},{x:()=>dist(),ease:"none"},0);
  tl.fromTo(words,{y:i=>Math.sin(i*1.1)*70,rotation:i=>Math.sin(i*1.1)*9},{y:i=>Math.sin(i*1.1+Math.PI)*70,rotation:i=>Math.sin(i*1.1+Math.PI)*9,ease:"none"},0);
})();