→ לכל המאגר

G39 · טקסט מתעקל על קשת בגלילה

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

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

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

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

הדמו

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

גלול והשורה מתעקלת

עוד מסלול גלילה. נסה גם חזרה למעלה ↑
בעברית תווים אינם מחוברים זה לזה, ולכן פיצול לתווים בטוח כאן. הפיצול נעשה ידנית ולא ב-SplitText כדי לא להסתכן בהיפוך סדר ב-RTL, והמשפט המקורי נשמר ב-aria-label לקוראי מסך.

קוד להדבקה

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

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

CSS

/* G39 · טקסט מתעקל על קשת בגלילה */
html,body{overflow-x:clip}
.arc-t{height:100vh;display:grid;place-items:center;background:var(--bg, #f7f7fa);border-block:1px solid var(--line, #e4e4ee);overflow:hidden}
.arc-line{font-size:clamp(30px,5.2vw,86px);font-weight:800;white-space:nowrap;direction:rtl;will-change:transform}
.arc-line .ch{display:inline-block;transform-origin:50% 620px;will-change:transform}
.arc-hint{position:absolute;bottom:24px;inset-inline:0;text-align:center;font-size:13px;color:var(--muted, #6a6d85)}

HTML

<div class="arc-t">
  <div class="arc-line" aria-label="עיצוב שנראה טוב גם כשעוצמים עיניים"><span aria-hidden="true">עיצוב שנראה טוב גם כשעוצמים עיניים</span></div>
  <p class="arc-hint">גלול והשורה מתעקלת</p>
</div>

JS

gsap.registerPlugin(ScrollTrigger);

(function(){
  const line=document.querySelector(".arc-line"),src=line.querySelector("span");
  // פיצול ידני לתווים: שומר על סדר RTL ועל רווחים, בלי להישען על SplitText
  const text=src.textContent;
  src.textContent="";
  const chars=[...text].map(c=>{
    const s=document.createElement("span");
    s.className="ch";
    s.textContent=c===" "?"\u00a0":c;
    src.appendChild(s);
    return s;
  });
  const mid=(chars.length-1)/2;
  const MAX=1.55; // מעלות לכל תו בקצה הקשת
  gsap.set(chars,{rotation:0});
  gsap.to(chars,{
    rotation:i=>(i-mid)*MAX,
    y:i=>Math.abs(i-mid)*1.1,
    ease:"none",
    scrollTrigger:{trigger:".arc-t",start:"top bottom",end:"bottom top",scrub:1}
  });
})();