→ לכל המאגר

G48 · פסקה שנצבעת מילה-מילה בגלילה

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

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

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

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

הדמו

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

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

גלול לאט. כל מילה נצבעת בתורה.

עוד מסלול גלילה. נסה גם חזרה למעלה ↑
ההדגשה חייבת להיות פסאודו-אלמנט מאחורי המילה ולא רקע על אותו אלמנט, אחרת אי אפשר להנפיש אותה בנפרד מצבע הטקסט. בעברית ה-transform-origin הוא right, כך שהצבע נפתח מהתחלת המילה. הפיצול הוא למילים בלבד: פיצול לאותיות בעברית שובר ניקוד ומייצר ג'יבריש בקורא מסך. ה-stagger הוא שמייצר את תחושת הקריאה, וה-scrub הקצר מונע תחושה שהטקסט רודף אחרי הגלילה.

קוד להדבקה

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

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

CSS

/* G48 · פסקה שנצבעת מילה-מילה בגלילה */
.hl{max-width:min(880px,92vw);margin-inline:auto;padding-block:34vh}
.hl p{margin:0;font-size:clamp(24px,3.4vw,46px);line-height:1.5;font-weight:600}
.hl .w{color:var(--muted, #6a6d85);transition:none;position:relative;display:inline-block}
/* ההדגשה נפתחת מאחורי המילה. בעברית היא נפתחת מימין, מתחילת המילה */
.hl .mk{position:relative;z-index:0;display:inline-block;padding-inline:.14em;border-radius:.16em}
.hl .mk::before{content:"";position:absolute;inset:0;border-radius:.16em;background:var(--accent, #4a3aff);
  transform:scaleX(var(--fill,0));transform-origin:right center;z-index:-1}
.hl-foot{text-align:center;color:var(--muted, #6a6d85);font-size:14px;padding-bottom:12vh}

HTML

<div class="hl"><p id="hl-src">אנחנו לא בונים אתרים יפים. אנחנו בונים אתרים שמביאים פניות. ההבדל הוא לא בעיצוב אלא בסדר: קודם מבינים את הלקוח, אחר כך כותבים, ורק בסוף פותחים כלי עיצוב.</p></div>
<p class="hl-foot">גלול לאט. כל מילה נצבעת בתורה.</p>

JS

gsap.registerPlugin(ScrollTrigger);

(function(){
  const p=document.getElementById("hl-src");
  const MARK=["פניות","בסדר","הלקוח"];          // מילות המפתח שיקבלו הדגשה
  const bare=w=>w.replace(/[.,:;!?"'׳״]/g,"");   // סימני פיסוק נדבקים למילה ושוברים השוואה
  // פיצול למילים בלבד. בעברית לא מפצלים לאותיות: זה שובר ניקוד וקוראי מסך
  const words=p.textContent.trim().split(/\s+/);
  p.textContent="";
  const marks=[];
  const spans=words.map((w,i)=>{
    const s=document.createElement("span");
    s.className="w";
    const core=bare(w);
    if(MARK.includes(core)){
      // ההדגשה עוטפת את המילה בלבד. סימן הפיסוק נשאר מחוץ לצבע
      const mk=document.createElement("span");
      mk.className="mk";mk.textContent=core;
      s.appendChild(mk);
      s.appendChild(document.createTextNode(w.slice(core.length)));
      marks.push({mk:mk,i:i});
    } else s.textContent=w;
    p.appendChild(s);
    if(i<words.length-1)p.appendChild(document.createTextNode(" "));
    return s;
  });
  const STEP=.35;
  if(matchMedia("(prefers-reduced-motion: reduce)").matches){
    gsap.set(spans,{color:"var(--ink)"});
    gsap.set(marks.map(m=>m.mk),{color:"#fff","--fill":1});
    return;
  }
  const tl=gsap.timeline({scrollTrigger:{trigger:".hl",start:"top 78%",end:"bottom 62%",scrub:.4}});
  tl.to(spans,{color:"var(--ink)",duration:.4,stagger:STEP,ease:"none"},0);
  // ההדגשה של כל מילת מפתח נפתחת בדיוק בזמן שהמילה שלה נצבעת
  marks.forEach(m=>{
    const at=m.i*STEP;
    tl.fromTo(m.mk,{"--fill":0},{"--fill":1,duration:.4,ease:"power2.out"},at)
      .to(m.mk,{color:"#fff",duration:.25},at+.1);
  });
})();