→ לכל המאגר

G110 · טקסט שנכתב עם הגלילה

GSAP GSAP · ScrollTrigger טקסט וכותרות ממתין

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

מתי משתמשים: משפט מפתח או פסקת מניפסט שרוצים שייקראו עד הסוף. עד 220 תווים, פעם אחת בעמוד.

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

הדמו

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

עוד מסלול גלילה. נסה גם חזרה למעלה ↑
האותיות מפוצלות ל-span (בעברית בלי ניקוד זה בטוח: אין ליגטורות), ורק opacity משתנה, לכן אין reflow. הסמן הוא span שקופץ אחרי האות האחרונה הגלויה. במובייל אותו דבר עם פונט קטן יותר.

קוד להדבקה

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

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

CSS

/* G110 · טקסט שנכתב עם הגלילה */
.tw2{position:relative;height:220vh}
.tw2-pin{position:sticky;top:0;height:100vh;display:grid;place-items:center;padding-inline:var(--gutter, clamp(24px, 5vw, 96px))}
.tw2 p{max-width:30ch;margin:0;font-size:clamp(24px,3.2vw,46px);font-weight:600;line-height:1.5;text-align:center}
.tw2 p span{opacity:.12}
.tw2 p span.on{opacity:1}
.tw2 p i{display:inline-block;width:.08em;height:1em;background:var(--accent, #4a3aff);vertical-align:-.15em;margin-inline-start:.04em;animation:tw2-b 1s steps(1) infinite}
@keyframes tw2-b{50%{opacity:0}}
@media (prefers-reduced-motion: reduce){.tw2 p span{opacity:1}.tw2 p i{display:none}}

HTML

<div class="tw2"><div class="tw2-pin"><p data-text="אנחנו לא מוכרים אתר. אנחנו מוכרים את הרגע שבו מישהו קורא, מבין, ומרים טלפון."></p></div></div>

JS

gsap.registerPlugin(ScrollTrigger);

(function(){
  const p=document.querySelector(".tw2 p"),text=p.dataset.text;
  const spans=[...text].map(ch=>{const s=document.createElement("span");s.textContent=ch;p.appendChild(s);return s;});
  const car=document.createElement("i");p.appendChild(car);
  if(matchMedia("(prefers-reduced-motion: reduce)").matches)return;
  const o={n:0};
  gsap.to(o,{n:spans.length,ease:"none",scrollTrigger:{trigger:".tw2",start:"top top",end:"bottom bottom",scrub:.4},
    onUpdate(){const k=Math.round(o.n);spans.forEach((s,i)=>s.classList.toggle("on",i<k));
      // הסמן זז אחרי האות האחרונה הגלויה
      const last=spans[Math.max(0,k-1)];if(k>0)last.after(car);else p.prepend(car);}});
})();