חזרה למאמרים

Smart Websites

איך למנוע תזוזות תוכן (CLS) בזמן הזרמת תשובות AI בלייב

מדריך טכני ומעשי למתכנתי אתרים ומפתחי פרונטאנד: איך לשמור על ניקוד Core Web Vitals מושלם ומניעת קפיצות מסך בזמן הזרמת טקסט מ-LLM.

4 דקות קריאהCLS · Core Web Vitals · AI Streaming · Web Performance · Frontend

TL;DR

הזרמת טקסט בזמן אמת מ-LLM יוצרת חוויה מעולה, אבל ללא תכנון נכון היא מפרקת את המבנה של הדף. מנועי הרינדור מזיזים את האלמנטים למטה בכל טוקן חדש, וציון ה-CLS שלכם ב-Core Web Vitals צונח. מפתחים נכונים מקצים שטח מראש, מנהלים באפר של מיקרו-משימות ומשתמשים ב-CSS Containment.

ממשקי AI שמשלבים הזרמת טוקנים בלייב הפכו לסטנדרט ב-2026. המשתמש מזין שאילתה, ותוך עשירית השנייה הטקסט מתחיל להיכתב מול עיניו. הבעיה מתחילה כשהרכיב הזורם ממוקם בתוך דף תוכן קיים, לצד תפריטים, באנרים או תגובות. בכל פעם שמגיע מופע טקסט חדש, האלמנט התחתון נדחף למטה. המשתמש מנסה להקליק על כפתור — והכפתור בורח לו. גוגל רואה את זה, מודד את ה-Cumulative Layout Shift, ומעניש את האתר בדירוגים.

למה הזרמת טוקנים שוברת את ה-Layout

כאשר WebSocket או Server-Sent Events (SSE) מעבירים טוקנים מהשרת, DOM Updater טיפוסי מוסיף אותם מיד ל-HTML. הדפדפן נאלץ לחשב מחדש את המיקומים של כל הרכיבים בדף (Layout Reflow) עשרות פעמים בשנייה.

הגדרה · CLS בזמן Streaming

מדד ה-Cumulative Layout Shift מודד את סך הזזות השטח الבלתי צפויות במהלך חיי הדף. הזרמת תוכן רציפה ללא הגבלת גובה גורמת לשינוי נתיב הצגה (Reflow) מתמיד שמעלה את ה-CLS לרמות פסולות.

הקפיצה הזו אינה קוסמטית בלבד. היא משפיעה ישירות על חוויית המשתמש ועל הציון שלכם ב-Google Search Console. אם הדף שלכם מציע צ'אט מובנה או מחולל תוכן אוטומטי, הטקסט הזורם דוחף את שאר הרכיבים מטה באופן לא מבוקר.

הקצאת שטח מראש ושלד טעינה (Min-Height)

הטעות הנפוצה ביותר היא השארת מכל ה-AI (Container) בגובה של 0 פיקסלים עד שהתשובה מתחילה להגיע. הפתרון הבסיסי והאפקטיבי ביותר הוא הגדרת גובה מינימלי מוגדר מראש או שימוש ב-Skeleton layout דינמי.

0.02

ציון ה-CLS המקסימלי המומלץ לממשקי AI זורמים בדפדפן

מקור: Google Web Vitals, 2026

כאשר אתם יודעים שתשובה ממוצעת תתפוס לפחות 200 פיקסלים, הגדירו את המכל עם min-height: 200px. אם התשובה קצרה יותר, ההפרש לא ייצר קפיצה חדה מדי. אם היא ארוכה יותר, השינוי יתרחש רק כשהטקסט עובר את סף 200 הפיקסלים, ולא מפסגת הרכיב.

  • הקצו נפח אנכי מוערך עוד לפני קבלת הטוקן הראשון.
  • השתמשו ב-Scroll Anchor (overflow-anchor: none) במקומות שבהם תרצו למנוע מהדפדפן לקפוץ אוטומטית לתחתית הדף.
  • מנעו שינויי פונט פתאומיים על ידי טעינה מוקדמת של ה-Web Fonts מראש.

אם הרכיב שלכם נמצא בתוך רשת (CSS Grid), השתמשו ב-grid-template-rows קבוע או ב-align-items: start כדי למנוע מעמודות סמוכות להתרחב ולהתכווץ יחד עם הזרמת הטקסט.

ניהול DOM: Batching בעזרת requestAnimationFrame

עדכון ה-DOM על כל טוקן בודד שמגיע מ-SSE הוא אסון ביצועים. אם ה-LLM מחזיר 40 טוקנים בשנייה, הדפדפן ינסה לרנדר את הדף 40 פעם. המסכים פועלים בדרך כלל בקצב של 60Hz או 120Hz, ולכן חלק מהרינדורים הללו מיותרים לחלוטין.

במקום לעדכן את ה-DOM מיד עם קבלת האירוע, יש לצבור את הטוקנים בבאפר (Buffer) ולעדכן את הרכיב פעם אחת בלבד בכל פריים של הדפדפן.

שיטהתדירות עדכון DOMהשפעה על CLSעומס מעבד (CPU)
עדכון ישיר מאירוע SSE30-50 פעמים בשנייהגבוהה מאוד (קפיצות תכופות)כבד מאוד
Batching ב-requestAnimationFrame60/120 FPS מסונכרןנמוכה מאוד (תנועה חלקה)אופטימלי
Debounce קבוע (למשל 100ms)10 פעמים בשנייהבינונית (מראה מקוטע)נמוך

טכניקת האיגוד (Batching) מקטינה את מספר ה-Reflows. הדפדפן מחשב את המיקומים מחדש בצורה חלקה ומסונכרנת עם קצב הרענון של המסך.

טיפול ברכיבים מורכבים: קוד, טבלאות ותמונות

טקסט רגיל נזל בצורה יחסית צפויה. אבל מה קורה כשה-AI מזרים בלוק של קוד (Codeblock) או טבלה? הרכיבים הללו משנים את רוחבם וגובהם ברגע שהם מקבלים עיצוב (Syntax Highlighting) או כשהטבלה משלימה את העמודה האחרונה.

רכיבים אלו יוצרים קפיצה ענקית ב-CLS באמצע הזרמת התוכן.

.ai-response-stream {
  contain-intrinsic-size: auto 300px;
  content-visibility: auto;
}

שימוש ב-CSS Containment מאפשר לדפדפן לשמור על גודל פנימי מוערך גם אם התוכן בפועל עדיין לא סים להתרנדר. בנוסף, מומלץ להחיל תבניות עיצוב (Code syntax highlighting) רק לאחר שבלוק הקוד נסגר לחלוטין, ולא על כל טוקן בודד.

💡

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

לסיכום

בניית ממשק AI דינמי ב-2026 דורשת זהירות רבה בכל הנוגע לביצועי פרונטאנד. הזרמת טקסט חלקה שאינה מקפיצה את הדף תבטיח שהמשתמשים שלכם יישארו ממוקדים, ושמנועי החיפוש ימשיכו לתמרץ את האתר שלכם בציוני Core Web Vitals גבוהים. שילוב בין הקצאת מקום מראש, איגוד עדכוני DOM ומניעת עיבוד מורכב באמצע הזרמה הוא הנוסחה המנצחת.

שאלות נפוצות

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

מה זה CLS ולמה הוא נפגע בזמן הזרמת תשובות AI?
CLS (Cumulative Layout Shift) מודד תזוזות פתאומיות של אלמנטים במסך. כש-AI מזרים טקסט מילה אחרי מילה, גובה האלמנט גדל בהדרגה ודוחף את שאר התוכן למטה, מה שמקטין את יציבות המסך ומוריד את הציון בגוגל.
האם כדאי לוותר על הזרמה בלייב (Streaming) כדי לקבל ציון 100 ב-Web Vitals?
ממש לא. הזרמת תוכן משפרת את ה-Time to First Token (TTFT) ואת התחושה של המשתמש. הפתרון הוא הזרמה חכמה עם הקצאת מקום מראש ולא ביטול ה-Streaming.
איך משפיעה הזרמת קוד או טבלאות ב-AI על ה-CLS?
בלוקים מורכבים משנים את גובהם בצורה חד פעמית ופתאומית כשהם מסיימים להתרנדר. עיבוד ה-Syntax Highlighting בסוף התהליך מונע משינוי הגובה של הבלוק להשפיע על שאר הדף תוך כדי כתיבה.
AB

כתב

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

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

עוד עליי →

להמשך הקריאה

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