Menu

Center Div ב-CSS: איך ממרכזים div, כל השיטות

כל הדרכים למרכז div אופקית, אנכית או בשני הצירים: flexbox, grid, margin auto, מיקום absolute עם transform, inset עם margin auto, ו-align-content. כל שיטה רצה בזמן אמת ומודדת את המרכוז שלה, עם טבלה שמראה מתי להשתמש בכל אחת.

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

התשובה הקצרה

כדי למרכז div גם אופקית וגם אנכית בתוך ההורה שלו, הופכים את ההורה ל-grid וממרכזים את התוכן שלו:

.parent {
  display: grid;
  place-items: center;
  min-height: 200px; /* the parent needs room to center in */
}

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

כל השש מדווחות 0px בשני הצירים (הגבול של 1px סביב הבמה שווה בכל צד, ולכן הוא לא מזיז את המרכז). שנו רוחב או טקסט של תיבה והריצו שוב: השיטות שלא תלויות בגודל קבוע נשארות על 0.

באיזו שיטה להשתמש

שיטהממרכזתהילד צריך גודל קבוע?הכי מתאימה ל
Grid place-items: centerשני הציריםלאבחירת ברירת המחדל: ילד אחד בתוך תיבה
Flexbox justify-content + align-itemsשני הציריםלאשורה או עמודה של פריטים, ממורכזים כקבוצה
margin: auto בהורה flex או gridשני הציריםלאמרכוז פריט אחד כשהאחים שלו מסודרים אחרת
margin: 0 autoרק אופקיתwidth או max-widthמכלי עמוד, מאמרים, טפסים בזרימה רגילה
Absolute + translate(-50%, -50%)שני הציריםלאשכבות על, תגיות וחלונות מודאליים מעל תוכן אחר
Absolute + inset: 0; margin: autoשני הציריםכן, רוחב וגובהדיאלוגים בגודל קבוע
align-content: center על בלוקאנכיתלאמרכוז אנכי בלי לשנות את ה-display של ההורה

שיטה 1: flexbox

Flexbox ממרכז לאורך שני צירים עם שני מאפיינים. justify-content מטפל בציר הראשי (אופקי בשורה), ו-align-items בציר הניצב:

עם כמה ילדים, flexbox ממרכז אותם כקבוצה ושומר אותם בשורה. כאן הוא עדיף על grid, שהיה מערם את שלושת הפריטים בעמודה ממורכזת אחת. עמוד ה-justify-content מסביר כל ערך יישור.

שיטה 2: grid

place-items: center הוא קיצור של align-items: center יחד עם justify-items: center. על מכל grid עם ילד יחיד הוא ממרכז את הילד בשני הכיוונים:

min-height במקום height מאפשר להורה לגדול אם הכרטיס נעשה גבוה מ-180px, במקום שהכרטיס יגלוש.

שיטה 3: margin: 0 auto (אופקית)

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

התיבה השנייה ממלאת את כל הרוחב, כך שאין מקום פנוי ושום דבר לא זז. זו הסיבה הרגילה לכך ש-margin: 0 auto "לא עובד". הוא גם ממרכז רק אופקית בזרימה רגילה; margin אנכי auto הופך שם ל-0. אבל בתוך הורה flex או grid, margin: auto ממרכז בשני הכיוונים, וזו התיבה השלישית בהשוואה שלמעלה.

שיטה 4: מיקום absolute ו-transform

כשהאלמנט חייב לשבת מעל תוכן אחר (תגית על תמונה, חלון מודאלי מעל העמוד), מקמו אותו באופן absolute ב-50% ומשכו אותו אחורה בחצי מהגודל שלו עצמו:

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

גרסה לאלמנטים בגודל ידוע: position: absolute; inset: 0; margin: auto; יחד עם width ו-height. ה-margin האוטומטי מחלק את המקום בכל ארבעת הצדדים.

שיטה 5: align-content על בלוק רגיל

align-content: center עובד היום גם על מכלי block רגילים, לא רק על flex ו-grid. הוא ממרכז את התוכן אנכית בלי לשנות את האופן שבו הילדים מסודרים:

.parent {
  min-height: 200px;
  align-content: center;   /* vertical centering, still display: block */
}
.child {
  max-width: 300px;
  margin-inline: auto;     /* horizontal centering */
}

הוא נתמך בגרסאות הנוכחיות של Chrome, Firefox ו-Safari. דפדפנים ישנים מתעלמים ממנו, אז השתמשו ב-grid אם אתם צריכים לתמוך בהם.

מרכוז בכל המסך

כדי למרכז דיאלוג ב-viewport בלי קשר לגלילה, שלבו שכבה קבועה במסך מלא עם grid:

.overlay {
  position: fixed;
  inset: 0;                     /* covers the viewport */
  display: grid;
  place-items: center;
  background: rgb(0 0 0 / 50%);
}

למרכוז אנכי של התוכן של עמוד שלם, השתמשו ב-min-height: 100dvh על ההורה במקום 100vh: בטלפונים, 100vh כולל את האזור שמאחורי סרגלי הכלים של הדפדפן, ולכן ה"מרכז" יושב נמוך מדי.

מרכוז טקסט הוא משימה אחרת

כל מה שלמעלה ממרכז תיבה. כדי למרכז את הטקסט בתוך תיבה, השתמשו ב-text-align: center עליה, כמו שמוצג בעמוד מרכוז טקסט ב-HTML. לרוב צריך את שניהם: grid כדי למרכז את הכרטיס, ו-text-align כדי למרכז את השורות שבתוכו.

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

  • הורה בלי גובה. מרכוז אנכי צריך מקום פנוי; להורה שמתכווץ לתוכן שלו אין כזה.
  • margin: 0 auto על בלוק ברוחב מלא. תנו לו קודם width או max-width.
  • margin: auto כדי למרכז אנכית בזרימה רגילה. margin אנכי אוטומטי הוא שם 0; השתמשו ב-flex או ב-grid.
  • מרכוז absolute בלי הורה ממוקם. האלמנט מתמרכז בעמוד, לא בתיבה.
  • align-items: center על הילד. מאפייני יישור נכתבים על ההורה (מכל ה-flex או ה-grid), חוץ מ-margin: auto ו-align-self.
  • text-align: center כדי למרכז בלוק. הוא ממרכז תוכן inline (טקסט, תמונות, ילדי inline-block), לא ילד מסוג block.

שאלות נפוצות

איך ממרכזים div אופקית ואנכית?

הופכים את ההורה ל-grid וממרכזים את התוכן שלו: .parent { display: grid; place-items: center; }. הגרסה של flexbox היא display: flex; justify-content: center; align-items: center;. בשני המקרים ההורה צריך להיות גבוה יותר מה-div.

איך ממרכזים div רק אופקית?

נותנים לו רוחב ו-margin אוטומטי בצדדים: .box { width: 300px; margin: 0 auto; } (או max-width לבלוק רספונסיבי). margin-inline: auto הוא אותו הדבר במאפיינים לוגיים.

למה margin: 0 auto לא ממרכז את ה-div שלי?

ל-div אין רוחב קטן מהמכל שלו, כך שאין מקום פנוי לחלק (בלוק ממלא את כל הרוחב כברירת מחדל). הגדירו width או max-width. זה גם לא עושה כלום על אלמנטי inline, ואף פעם לא ממרכז אנכית בזרימה רגילה.

למה ה-div שלי לא מתמרכז אנכית?

ההורה גבוה רק כמו התוכן שלו, כך שאין מקום נוסף שבו אפשר למרכז. תנו להורה גובה (או min-height), ואז השתמשו במרכוז של grid או flexbox.

מה הדרך הכי קלה למרכז div?

display: grid; place-items: center; על ההורה: שתי הצהרות, שני הצירים, ילד בכל גודל. השתמשו ב-flexbox כשההורה גם מסדר פריטים אחרים בשורה.

איך ממרכזים טקסט בתוך div?

משתמשים ב-text-align: center על ה-div בשביל טקסט ותוכן inline. מרכוז ה-div עצמו ומרכוז הטקסט שבתוכו הן שתי משימות נפרדות.

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

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

להתחיל