מה display עושה
לכל אלמנט יש ערך display שקובע איך הוא נפרס. שלושת הערכים שפוגשים ראשונים הם block, inline ו-inline-block. הנה שלוש תיבות זהות, עם אותם width, height, padding ו-margin, ורק ה-display שונה:
block | inline | inline-block | |
|---|---|---|---|
| מתחיל בשורה חדשה | כן | לא | לא |
| רוחב כברירת מחדל | ממלא את המכל | מתאים לתוכן | מתאים לתוכן |
width ו-height | חלים | מתעלמים מהם | חלים |
| margin אנכי | חל | מתעלמים ממנו | חל |
| padding אנכי | דוחף את התוכן | מצויר, אבל לא מרחיק שורות זו מזו | דוחף את התוכן |
| אלמנטים טיפוסיים | div, p, h1, ul, section | span, a, strong, em | button, input, img (אלמנטים מוחלפים מתנהגים כך) |
בתצוגה המקדימה, תיבת ה-block יושבת בשורה משלה ברוחב 120px. תיבת ה-inline מתעלמת מהרוחב ומהגובה ועוטפת רק את המילה שלה, וה-padding והגבול האנכיים שלה בולטים מעל השורה ומתחתיה בלי להגביה את השורה. תיבת ה-inline-block נשארת בשורת הטקסט אבל שומרת על הגודל המלא שלה.
display: block
אלמנט block תופס את כל הרוחב הזמין ודוחף את מה שבא אחריו לשורה חדשה. הפיכת קישור ל-block היא הדרך להפוך שורה שלמה ללחיצה:
.menu a {
display: block; /* the full row is the link */
padding: 10px 16px;
}
לבלוק אפשר לקבוע רוחב, ו-margin: 0 auto ממרכז אותו ברגע שיש לו רוחב, כמו שמראה עמוד מרכוז div.
display: inline-block
inline-block הוא דרך האמצע: הוא זורם בשורה כמו מילה, אבל אפשר לקבוע לו גודל. הוא שימושי לתגיות, לכפתורים ולאייקונים בתוך טקסט:
כמה תיבות inline-block בשורה מקבלות רווח קטן ביניהן מהרווח הלבן ב-HTML. לשורות של תיבות, display: flex על ההורה הוא הכלי הטוב יותר.
display: none מול visibility: hidden
שניהם הופכים אלמנט לבלתי נראה. ההבדל הוא אם הוא שומר את המקום שלו:
display: none | visibility: hidden | opacity: 0 | |
|---|---|---|---|
| תופס מקום | לא | כן | כן |
| אפשר ללחוץ עליו | לא | לא | כן |
| נקרא על ידי קוראי מסך | לא | לא | כן |
| אפשר להנפיש אותו בצורה חלקה | לא | לא | כן |
התכונה hidden של HTML עושה את אותו הדבר כמו display: none דרך גיליון הסגנונות של הדפדפן, ולכן כל כלל CSS שקובע display על האלמנט (למשל .card { display: flex; }) דורס אותה, והאלמנט מופיע שוב. הוסיפו [hidden] { display: none !important; } אם זה פוגע בכם.
כדי להסתיר משהו חזותית אבל להשאיר אותו לקוראי מסך (למשל תווית לכפתור אייקון), השתמשו במחלקה מסוג "visually hidden" במקום display: none.
display: flex ו-display: grid
שני אלה הופכים אלמנט למכל פריסה בשביל הילדים שלו:
display: flexמסדר את הילדים בשורה או בעמודה אחת, עם שליטה ביישור ובמרווחים. ראו flexbox.display: gridמציב את הילדים בשורות ובעמודות בו זמנית.
המכל עצמו נשאר block. inline-flex ו-inline-grid עושים את אותו הדבר לילדים, אבל גורמים למכל לזרום בשורה, כמו inline-block.
שאר הערכים
| ערך | מה הוא עושה |
|---|---|
flow-root | בלוק שמכיל את ה-floats שלו ומונע מ-margin של ילדים לדלוף החוצה; ה-"clearfix" המודרני |
contents | התיבה של האלמנט עצמו נעלמת, והילדים שלו מתנהגים כילדים של ההורה שלו. הימנעו מזה בכפתורים, ברשימות ובטבלאות: חלק מהדפדפנים מאבדים את המשמעות של האלמנט בשביל קוראי מסך |
list-item | בלוק עם סימן רשימה, ברירת המחדל של li |
table, table-row, table-cell | פריסת טבלה על אלמנטים שאינם טבלה |
inline-flex, inline-grid | מכל flex או grid שיושב בשורה |
טעויות נפוצות
- הגדרת
widthאוheightעלspanאוa. אלמנטי inline מתעלמים מהם. השתמשו ב-inline-blockאו ב-block. - margin אנכי על אלמנט inline. גם ממנו מתעלמים. אותו פתרון.
- שימוש ב-
display: noneכדי להסתיר טקסט שמיועד לקוראי מסך. הוא מסתיר אותו גם מהם. - ציפייה שילד יופיע בתוך הורה עם
display: none. שום דבר בתוך הורה מוסתר לא מוצג. - כלל
displayשדורס את התכונהhidden. כלל ה-CSS מנצח. - ניסיון להנפיש את
display. הגדרתdisplay: noneמסתירה את האלמנט מיד, בלי דהייה; הנפישו אתopacityוהחליפו אתdisplay(או אתvisibility) בסוף.
שאלות נפוצות
מה ההבדל בין block, inline ו-inline-block?
אלמנט block מתחיל בשורה חדשה וממלא את הרוחב הזמין. אלמנט inline זורם בתוך טקסט ומתעלם מ-width, מ-height ומ-margin אנכי. inline-block זורם בתוך טקסט כמו inline, אבל מקבל רוחב, גובה, padding ו-margin כמו block.
מה עושה display: none?
הוא מסיר את האלמנט מהעמוד לגמרי: הוא לא תופס מקום, לא מוצג, ומוסתר מקוראי מסך. הילדים שלו מוסתרים יחד איתו, ואי אפשר להציג אותם עם ערך display משלהם.
מה ההבדל בין display: none ל-visibility: hidden?
display: none מסיר את האלמנט ואת המקום שלו. visibility: hidden הופך אותו לבלתי נראה אבל שומר את המקום שלו בפריסה, כך ששום דבר לא זז.
האם div הוא block או inline כברירת מחדל?
Block. div, p, כותרות, ul, section ו-form הם block כברירת מחדל; span, a, strong, em, img, input ו-button הם inline או inline-block.
למה יש רווח בין אלמנטי inline-block?
הרווח הלבן בין התגיות ב-HTML מוצג כרווח, בדיוק כמו בין מילים. השתמשו במקום זאת ב-display: flex עם gap על ההורה, או הסירו את הרווח הלבן.