Menu

CSS Position: absolute, relative, fixed ו-sticky

position: absolute ממקם אלמנט בקואורדינטות מדויקות בתוך האב הממוקם הקרוב ביותר שלו. למדו איך absolute עובד עם position: relative, ואחר כך fixed ו-sticky, את המאפיינים top/right/bottom/left ו-inset, ולמה sticky לפעמים לא נצמד.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

position: absolute בדוגמה אחת

אלמנט עם מיקום absolute מורם מהזרימה הרגילה וממוקם עם top, right, bottom ו-left. ההיסטים האלה נמדדים מהאב הקרוב ביותר שיש לו position שאינו static, ולכן ההורה מקבל position: relative:

מחקו את position: relative מ-.card והתג קופץ לפינה הימנית העליונה של כל הדף, כי כבר אין לו אב ממוקם. השורה האחת הזאת מסבירה את רוב השאלות של "position absolute לא עובד".

דברים שכדאי לדעת על אלמנטים עם absolute:

  • הם לא תופסים מקום. הכותרת והפסקה נפרסות כאילו התג לא קיים.
  • הרוחב שלהם מתכווץ לפי התוכן שלהם, אלא אם מגדירים width או גם left וגם right.
  • ההיסטים נמדדים עד קצה הריפוד של הבלוק המכיל, בתוך הגבול שלו.

חמשת ערכי position

ערךבזרימה?ההיסטים נמדדים משימוש נפוץ
static (ברירת מחדל)כןההיסטים נזנחיםאלמנטים רגילים
relativeכן, המקום שלו נשמרהמיקום הרגיל שלו עצמועוגן לילדים עם absolute, הזזות קטנות
absoluteלאהאב הממוקם הקרוב ביותר (או הדף)תגים, tooltips, שכבות על, כפתורי סגירה
fixedלאה-viewportכותרות, כפתורי צ'אט, סרגלי עוגיות
stickyכןמיכל הגלילה שלו, ברגע שהוא מגיע להיסטכותרות טבלה, כותרות מקטעים, סרגלי צד

position: relative

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

קופסה 2 מצוירת 20px למטה ו-20px ימינה, וחופפת את קופסה 3, אבל קופסה 3 לא זזה: היא עדיין משאירה מקום לקופסה 2 במקום המקורי שלה. לבדו, relative משמש רק לעתים רחוקות להזזת דברים; התפקיד העיקרי שלו הוא להיות קופסת הייחוס לילדים עם absolute.

היסטים ו-inset

top, right, bottom ו-left מקבלים אורכים, אחוזים (מהבלוק המכיל) ו-auto. הקיצור inset קובע את ארבעתם באותו סדר כמו margin:

.overlay {
  position: absolute;
  inset: 0;              /* top: 0; right: 0; bottom: 0; left: 0; */
}
.corner {
  position: absolute;
  inset: auto 16px 16px auto;  /* bottom right corner, 16px in */
}

הגדרת צדדים נגדיים מותחת את האלמנט: left: 0; right: 0 הופך אותו לרחב כמו הבלוק המכיל. inset: 0 על ילד עם absolute היא הדרך הסטנדרטית לכסות כרטיס בשכבת על.

מרכוז עם absolute ו-transform

top: 50%; left: 50% מציב את הפינה השמאלית העליונה של האלמנט במרכז. translate(-50%, -50%) מזיז אותו אחר כך אחורה בחצי מהגודל שלו:

flexbox ו-grid ממרכזים בפשטות רבה יותר כשהאלמנט יכול להישאר בזרימה; הדף על מרכוז div משווה את כל השיטות.

position: fixed

אלמנט fixed ממוקם ביחס ל-viewport ונשאר שם בזמן שהדף נגלל:

.chat-button {
  position: fixed;
  bottom: 16px;
  right: 16px;
}

שתי מלכודות. אלמנט fixed לא תופס מקום, ולכן כותרת fixed מכסה את ראש הדף אלא אם מוסיפים padding-top ל-body. ואם לאחד האבות יש transform, filter או perspective, האב הזה הופך לקופסת הייחוס במקום ה-viewport, והאלמנט נגלל יחד איתו.

position: sticky

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

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

כש-sticky לא נצמד, בדקו את אלה:

  • אין היסט. position: sticky לא עושה כלום בלי top, bottom, left או right.
  • אב עם overflow: hidden, auto או scroll. הוא הופך למיכל הגלילה, ואם הוא לא באמת נגלל, שום דבר לא נצמד. השתמשו ב-overflow: clip אם צריך רק להסתיר גלישה.
  • הורה שלא גבוה מהאלמנט הדביק. אין בתוכו מקום להיצמד.
  • הורה flex או grid שמותח אותו. בשורת flex, הוסיפו align-self: flex-start לסרגל הצד הדביק.

טעויות נפוצות

  • לשכוח position: relative על ההורה של אלמנט עם absolute.
  • שימוש ב-absolute לפריסת הדף. אלמנטים עם absolute מתעלמים זה מזה ומהתוכן, ולכן טקסט חופף במסכים קטנים. השתמשו ב-flexbox או ב-grid לפריסה וב-absolute לקישוטים קטנים.
  • היסטים על אלמנט static. top: 10px לא עושה כלום בלי position.
  • מאבק על איזה אלמנט נמצא למעלה. אלמנטים ממוקמים חופפים מסודרים לפי z-index.
  • כותרת fixed שמסתירה תוכן. הוסיפו ריפוד לדף, או scroll-padding-top כדי שקישורי עוגן ינחתו מתחתיה.

שאלות נפוצות

מה position: absolute עושה?

הוא מוציא את האלמנט מהזרימה הרגילה (שאר האלמנטים מתנהגים כאילו הוא לא קיים) וממקם אותו עם top, right, bottom ו-left, שנמדדים מהבלוק המכיל שלו: האב הקרוב ביותר שה-position שלו אינו static.

איך ממקמים אלמנט באופן absolute ביחס להורה שלו?

תנו להורה position: relative; ולילד position: absolute; עם היסטים כמו top: 0; right: 0;. בלי הורה ממוקם, הילד ממוקם ביחס לדף.

מה ההבדל בין מיקום relative ל-absolute?

relative משאיר את האלמנט בזרימה ורק מזיז את המקום שבו הוא מצויר, ומשאיר מאחור את המקום המקורי שלו. absolute מוציא אותו מהזרימה וממקם אותו ביחס לאב הממוקם שלו.

למה position: sticky לא עובד?

בדרך כלל אחד משלושה דברים: לא הוגדר top (או היסט אחר), לאחד האבות יש overflow: hidden או auto והוא הופך למיכל הגלילה, או שההורה של האלמנט הדביק לא גבוה ממנו, כך שאין מקום להיצמד.

מה ההבדל בין fixed ל-sticky?

fixed יוצא מהזרימה ומוצמד ל-viewport (אלא אם לאחד האבות יש transform או filter). sticky נשאר בזרימה ונגלל כרגיל עד שהוא מגיע להיסט שלו, ואז נצמד כל עוד ההורה שלו עדיין על המסך.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל