מה overflow עושה
כשתוכן גדול מהקופסה שלו (גובה קבוע, מילה ארוכה, טבלה רחבה), הוא גולש. המאפיין overflow קובע מה קורה לעודף:
| ערך | מה רואים | מיכל גלילה |
|---|---|---|
visible (ברירת מחדל) | התוכן נשפך מחוץ לקופסה וחופף את מה שבא אחריו | לא |
hidden | נחתך בקצה הריפוד, בלי פסי גלילה (סקריפט עדיין יכול לגלול אותו) | כן |
clip | נחתך, ואין גלילה בכלל, גם לא בסקריפט | לא |
scroll | תמיד מציג פסי גלילה, גם אם התוכן נכנס | כן |
auto | פסי גלילה רק כשהתוכן לא נכנס | כן |
ב-macOS ובטלפונים פסי הגלילה מונחים מעל התוכן ונעלמים בהדרגה, כך ש-scroll ו-auto עשויים להיראות אותו דבר עד שגוללים.
יצירת קופסה נגללת
קופסה גולשת רק אם משהו מגביל את הגודל שלה. height או max-height, יחד עם overflow-y: auto, הופכים רשימה ארוכה ללוח נגלל:
max-height עדיף כאן על height: רשימה קצרה נשארת קצרה, ורק רשימה ארוכה נגללת. אזור נגלל שאין בתוכו תוכן שאפשר להתמקד בו צריך לקבל tabindex="0" כדי שגם משתמשי מקלדת יוכלו לגלול אותו.
overflow-x ו-overflow-y
אפשר להגדיר את שני הצירים בנפרד. השימוש הנפוץ הוא טבלה רחבה שנגללת הצידה בתוך המיכל שלה במקום להרחיב את כל הדף:
כלל אחד שכדאי לזכור: אם ציר אחד הוא hidden, scroll או auto, ערך visible בציר השני הופך ל-auto. לכן overflow-x: hidden לבדו יכול לתת לכם פס גלילה אנכי לא צפוי. ל-overflow-x: clip אין את ההשפעה הזאת:
.a { overflow-x: hidden; } /* overflow-y computes to auto */
.b { overflow-x: clip; } /* overflow-y stays visible */
חיתוך טקסט עם שלוש נקודות
text-overflow: ellipsis מחליף את הסוף החתוך של שורה ב-"…". הוא צריך שלושה דברים יחד: רוחב מוגבל, טקסט שלא יכול להישבר לשורה חדשה ו-overflow מוסתר:
ה-line clamp עם הקידומת -webkit- עובד ב-Chrome, Firefox ו-Safari. קוראי מסך עדיין קוראים את הטקסט המלא, כך שהמילים החתוכות לא הולכות לאיבוד בשבילם.
תופעות לוואי של overflow
הגדרה של overflow לכל ערך אחר מ-visible או clip משנה יותר מאשר חיתוך:
- הוא מכיל floats ו-margins של ילדים. האלמנט יוצר block formatting context חדש, ולכן הוא גדל כדי לעטוף ילדים עם float.
display: flow-rootעושה אותו דבר בלי לחתוך כלום. - הוא שובר את
position: stickyמתחתיו. ילד sticky נצמד למיכל הגלילה הקרוב ביותר; אם המיכל הזה לא נגלל, שום דבר לא נצמד. - הוא חותך ילדים עם מיקום absolute (כשהאלמנט הגולש הוא גם הבלוק המכיל שלהם), כולל תפריטים נפתחים ו-tooltips, והוא חותך גם צללים של ילדים.
הסתרת פס הגלילה
אפשר להשאיר קופסה נגללת ולהסתיר את פס הגלילה שלה עם scrollbar-width: none. השתמשו בזה במשורה: בלי פס גלילה, קוראים רבים לא מבינים שיש עוד תוכן. scrollbar-gutter: stable עושה את העבודה ההפוכה: הוא שומר את המקום של פס הגלילה כדי שהתוכן לא יזוז כשפס גלילה מופיע.
טעויות נפוצות
- לצפות לגלישה בלי מגבלת גודל. קופסה בלי
heightאוmax-heightגדלה במקום לגלוש. overflow: hiddenעלbodyכדי "לתקן" גלילה אופקית. מצאו במקום זאת את האלמנט שרחב מדי (לרובwidthקבוע, כתובת URL ארוכה, או100vwעם פס גלילה).- Ellipsis בלי
white-space: nowrap. הטקסט נשבר לשורות, כך ששום דבר לא גולש אופקית ולא מופיעות שלוש נקודות. overflow-x: hiddenשיוצר פס גלילה אנכי. השתמשו ב-clip.- תפריט נפתח שנחתך על ידי הכרטיס שלו. ה-
overflow: hiddenשל הכרטיס חותך אותו; העבירו את כלל ה-overflow או הציגו את התפריט מחוץ לכרטיס.
שאלות נפוצות
מה overflow: hidden עושה?
הוא חותך תוכן שלא נכנס בתוך קופסת הריפוד של האלמנט, בלי פסי גלילה. עדיין אפשר לגלול אל החלק המוסתר בעזרת סקריפט או על ידי פוקוס על משהו שבתוכו.
מה ההבדל בין overflow auto ל-scroll?
scroll תמיד שומר מקום לפסי גלילה, גם כשהתוכן נכנס. auto מציג פס גלילה רק כשהתוכן גדול מהקופסה, וזה מה שרוצים בדרך כלל.
איך הופכים div לנגלל?
הגבילו את הגודל שלו ואפשרו גלילה: max-height: 300px; overflow-y: auto;. בלי מגבלת height או max-height, ה-div גדל עם התוכן שלו ואף פעם לא גולש.
למה overflow-x: hidden מוסיף גם פס גלילה אנכי?
אם ציר אחד הוא hidden, scroll או auto, ערך visible בציר השני מחושב כ-auto. השתמשו במקום זאת ב-overflow-x: clip, שלא יוצר מיכל גלילה ומשאיר את הציר השני visible.
איך מוסיפים שלוש נקודות (...) לטקסט שגולש?
לשורה אחת: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; על אלמנט עם רוחב מוגבל. לכמה שורות, השתמשו ב-display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;.