חזרה למאמרים

Smart Websites

עיצוב Sticky Headers ללא JavaScript: המדריך ל-CSS Scroll-State Queries

איך מעצבים אלמנט דביק (Sticky) ברגע שהוא נתקע למעלה, בלי אירועי scroll ב-JS ובלי להקריב ביצועים? היכרות מעשית עם CSS Scroll-State Queries.

3 דקות קריאהCSS · Web Development · Frontend · UI Design · Performance

TL;DR

עד לאחרונה, כדי לדעת מתי תפריט נדבק למעלה (Sticky) ולשנות את הסטייל שלו, חובה הייתה להשתמש ב-JavaScript. בשנת 2026, תכונת ה-CSS Container Scroll-State Queries מאפשרת לנו לעשות בדיוק את זה — ב-CSS טהור, 0 שורות JS ו-60 פריימים בשנייה.

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

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

הבעיה: כשה-Scroll Listener הורג את הביצועים

במשך שנים, הדרך הסטנדרטית לפתור את הבעיה הזו הייתה לרוץ אל JavaScript.

הפיתרון המהיר של יובל היה להוסיף מאזין לאירוע גלילה: window.addEventListener('scroll'). כל פיקסל שהמשתמש גלל, הדפדפן הריץ פונקציה שבדקה את מכלול המרחקים במסך והוסיפה מחלקת CSS בשם is-sticky.

התוצאה? הגלילה במכשירים ניידים התחילה לגמגם. הדפדפן נדרש לחשב את חישובי ה-Layout מחדש עשרות פעמים בשנייה.

הצפת הדפדפן ב-Scroll Event Listeners היא הסיבה הראשונה לגמגום בגרפים של ה-FPS בניידים.

הניסיון הראשון שנכשל: Intersection Observer

כשאיטיות האתר התגלתה, יובל החליט לעבור לפתרון המתקדם יותר: IntersectionObserver.

הוא שתל אלמנט עזר בלתי נראה בראש הדף, מעל התפריט. ברגע שאותו אלמנט יצא מהמסך, ה-Observer הדליק את הסטייל של ה-Sticky.

זה עבד, אבל הקוד הרגיש עקום. שורות של JavaScript רק כדי לשנות צבע של תפריט? אלמנטים מיותרים ב-DOM? הרגשנו שיש דרך נכונה יותר.

הגדרה · Container Scroll-State Queries

תכונה ב-CSS המאפשרת לאלמנט לתשאל את מצב הגלילה של אלמנט האב שלו (או של עצמו) — האם הוא כרגע נדבק (stuck), גלול (scrolled), או נמצא בקצה הגלילה.

הפתרון של 2026: Container Scroll-State Queries ב-CSS טהור

בשנה הזו, הסטנדרט השתנה לחלוטין. במקום להיאבק ב-JavaScript, אנחנו מגדירים את התפריט כ-Container מסוג scroll-state.

בואו נראה איך הקוד נראה. ראשית, מגדירים את ה-Container:

.header-wrapper {
  container-type: scroll-state;
  position: sticky;
  top: 0;
}

ואז, בעזרת שאילתת קונטיינר פשוטה, אנחנו בודקים אם האלמנט במצב stuck:

@container scroll-state(stuck: top) {
  .header-content {
    background-color: rgba(255, 255, 255, 0.9);
    backdrop-filter: blur(10px);
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
    padding: 0.75rem 1rem;
  }
}

אין שורת JavaScript אחת. אין מאזינים. אין אלמנטים מיותרים ב-HTML.

שיטהשורות JSמשאבי מעבד (CPU)מורכבות HTML
Scroll Listener~15-20גבוהה מאודנמוכה
Intersection Observer~25-40בינוניתבינונית (דורש dummy node)
CSS Scroll-State Queries0אפסית (GPU native)נקייה לחלוטין

התוצאה: 0 שורות JS, ביצועים מושלמים ב-60FPS

כשיובל החליף את הקוד בטכניקה הזו, התוצאה הייתה מיידית.

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

100%

חיסכון בקוד JavaScript עבור עיצוב אלמנטים דביקים

זה לא עובד רק על Sticky Headers. אפשר להשתמש בזה גם כדי:

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

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

סיכום: הלקח של 2026

שנים התרגזנו שאי אפשר לשאול ב-CSS "האם האלמנט נדבק כרגע?". נאלצנו לכתוב פתרונות מורכבים ב-JS בשביל הפעולה הבסיסית ביותר בממשק.

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

💡

בניית ממשק מהיר ב-2026 היא לא רק אופטימיזציה של קוד — היא בחירה בכלים הנכונים שמורידים את העומס מהדפדפן.

שאלות נפוצות

כל מה שעוד רצית לדעת

מה זה CSS Scroll-State Queries?
זוהי הרחבה ל-Container Queries ב-CSS המאפשרת לאלמנט לתשאל ולהגיב למצב הגלילה שלו או של קונטיינר האב שלו, למשל האם הוא במצב נדבק (stuck), נגלל או קפוא.
למה לא להשתמש ב-Intersection Observer כרגיל?
Intersection Observer דורש כתיבת קוד JavaScript, ניהול אלמנטים פיקטיביים ב-DOM וחיבור מאזינים. Scroll-State Queries פותרים את הבעיה ב-CSS טהור בלבד בלי עומס על ה-DOM.
האם הטכניקה הזו פוגעת בביצועים?
להפך. החישובים מבוצעים ישירות במנוע ה-Compositor של הדפדפן (ברמת ה-GPU) במקום להריץ פונקציות JS על כל פיקסל נגלל, מה שמבטיח גלילה חלקה לחלוטין.
AB

כתב

אדיר בן יעקב · Adir Ben Yaakov

מקים JustBetterSite, סוכנות בניית אתרים ושיווק דיגיטלי בתל אביב. מתמחה ב-GEO (Generative Engine Optimization) — בנייה של אתרים שמופיעים בתשובות של ChatGPT, Claude, Perplexity ו-Gemini, לא רק בגוגל.

עוד עליי →

להמשך הקריאה

מאמרים קשורים