חיפוש

שימוש ב CSS Gap עם Flexbox – הסבר ודוגמאות קוד

CSS Flexbox ו-CSS Grid הם שני הכלים המרכזיים לניהול layout באתרים. Flexbox מטפל בעימוד חד-מימדי, ו-CSS Grid פותר את הסיפור הדו-מימדי עם עמודות ושורות.

הרבה פעמים אנחנו צריכים ריווח בין אלמנטים ב-layout, ו-margins זה כבר לא הפתרון הנכון. בפוסט הזה נראה איך להוסיף ריווח בין flex items עם תכונת gap, שהיא הקיצור של row-gap ו-column-gap.

רוב המפתחים מכירים אותה מ-CSS Grid, אבל מעטים משתמשים בה על קונטיינר flex. שווה להתחיל – התמיכה בדפדפנים כבר מלאה, כפי שתראו בהמשך.

ריווח אלמנטים ב-Flex Container עם CSS Gap

כמו שאמרנו, CSS Gap עובד עם Grid, אבל יש הרבה מצבים שבהם צריכים ריווח בין אלמנטים בלי גריד מוגדר – למשל בקונטיינר flex.

<div class="flex-gap">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
  <div>6</div>
</div>
.flex-gap {
  display: flex;
  flex-wrap: wrap;
}

התכונה flex-wrap תאפשר לאותם flex items לגלוש שורה בהתאם לרוחב אלמנט האב.

זה נראה כך:

1
2
3
4
5
6

וכשמצמצמים את רוחב אלמנט האב (הקונטיינר) בגלל השימוש ב-flex-wrap:

1
2
3
4
5
6

ריווח עם margins

אם תרצו להוסיף ריווח בין ה-flex items, תוכלו פשוט להוסיף margin לכל אלמנט:

.flex-gap {
  display: flex;
  flex-wrap: wrap;
}

.flex-gap > div {
  margin: 6px;
}
1
2
3
4
5
6

וכך זה נראה כשמצמצמים את רוחב אלמנט האב:

1
2
3
4
5
6

ה-margin עובד, אבל התוצאה לא זהה למה ש-CSS Gap נותן. שימו לב לריווח העודף סביב האלמנטים בדוגמה.

הבדל חשוב: margin מיושם על כל flex item בנפרד, בעוד gap מוגדר על ה-flex container עצמו. התכונה gap יוצרת ריווח רק בין האלמנטים, ולא בקצוות החיצוניים.

ריווח עם gap

עם gap הריווח חל רק בין האלמנטים עצמם, לא בקצוות הקונטיינר. הדוגמה הבאה מבהירה את הנקודה.

.flex-gap {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
}

וזה נראה כך:

1
2
3
4
5
6

1
2
3
4
5
6

אפשר להעביר שני ערכים כדי לשלוט בנפרד בריווח השורות והעמודות:

.flex-gap {
  display: flex;
  flex-wrap: wrap;
  gap: 12px 12px;
}

או להשתמש ישירות בתכונות הארוכות:

.flex-gap {
  display: flex;
  flex-wrap: wrap;
  row-gap: 12px;
  column-gap: 24px;
}

gap כשאלמנטים נשברים לשורות

כש-flex items גולשים למספר שורות, gap דואג לשני הצירים בו-זמנית. column-gap שולט בריווח האופקי באותה שורה, ו-row-gap שולט במרווח האנכי בין השורות.

וכאן gap מנצח את margin בגדול. עם margins, צריך לזהות אילו אלמנטים בשורה האחרונה ולהסיר מהם את ה-margin התחתון. עם gap פשוט אין מה לחשב:

.tag-list {
  display: flex;
  flex-wrap: wrap;
  gap: 8px 12px; /* 8px בין שורות, 12px בין אלמנטים */
}

נקודה חשובה: gap לא נכנס לחישוב של flex-basis. אם רוצים בדיוק 3 אלמנטים בשורה עם gap של 20px, צריך לחשב את ה-gaps לבד:

.card-grid {
  display: flex;
  flex-wrap: wrap;
  gap: 20px;
}

.card-grid > * {
  /* 3 אלמנטים בשורה: מחסירים 2 gaps, מחלקים ב-3 */
  flex-basis: calc((100% - 40px) / 3);
}

gap עם justify-content

כשמשלבים gap עם יישור כמו justify-content: space-between, ערך ה-gap מתפקד כמרווח מינימלי. הדפדפן דואג שהמרווח לא יהיה קטן מהערך שציינתם, ואת השאר מחלק לפי כלל היישור.

.nav {
  display: flex;
  justify-content: space-between;
  gap: 16px;
}

כשה-container רחב, האלמנטים מתפזרים מעבר ל-16px. כשהוא צר, הם לעולם לא יתקרבו ליותר מ-16px. שילוב מעולה לסרגלי ניווט ותפריטים – חלוקה שווה עם ריווח מינימלי מובטח.

תמיכת דפדפנים

gap עם Flexbox נתמך בכל הדפדפנים המרכזיים. Firefox הוסיף תמיכה באוקטובר 2018, Chrome ביולי 2020, ו-Safari באפריל 2021. התכונה גם מותאמת לכיוון כתיבה, כך שהיא עובדת נכון עם תכונות לוגיות ב-CSS.

Data on support for the flexbox-gap feature across the major browsers from caniuse.com

אפשר לבדוק תמיכה דרך @supports:

@supports (display: flex) and (gap: 10px) {
  .container {
    display: flex;
    gap: 10px;
  }
}

שימו לב: @supports (gap: 10px) מחזיר true אם הדפדפן תומך ב-gap בכל הקשר – כולל Grid. אי אפשר לזהות ספציפית תמיכה ב-Flexbox בלבד. בפועל זה כבר לא משנה כי כל הדפדפנים המודרניים תומכים בשניהם, אבל טוב לדעת.

מלכודת gap באחוזים: שימוש בערך אחוזי כמו gap: 10% על flex container ללא גובה מפורש גורם ל-row-gap להתפרש כ-0. אחוזים ב-row-gap מחושבים ביחס לגובה ה-container, ואם הגובה נקבע לפי התוכן (indefinite), הדפדפן לא יכול לחשב אותם. עדיף להשתמש ביחידות קבועות (px, rem) ל-row-gap אלא אם ל-container יש גובה מוגדר.

מה הלאה: Gap Decorations

פיצ׳ר CSS חדש בשם Gap Decorations נמצא בפיתוח כ-W3C Working Draft. הוא מרחיב את column-rule כך שתעבוד גם עם Grid ו-Flexbox, ומוסיף תכונת row-rule חדשה.

בפועל, זה יאפשר להוסיף מפרידים ויזואליים (קווים, דפוסים) בין אלמנטים בלי DOM elements נוספים. Chrome ו-Edge 139+ כבר תומכים בזה מאחורי דגל ניסיוני.

שאלות נפוצות

מה ההבדל בין gap לבין margin ב-Flexbox?
התכונה gap יוצרת ריווח רק בין האלמנטים, בעוד margin מוסיף ריווח סביב כל אלמנט - כולל בקצוות החיצוניים. עם gap מגדירים את הריווח פעם אחת על הקונטיינר; עם margin צריך לטפל בכל אלמנט בנפרד ולהתמודד עם מקרי קצה.
אפשר להגדיר ערכים שונים ל-row-gap ול-column-gap?
כן. אפשר להשתמש בקיצור gap: 12px 24px (הערך הראשון ל-row-gap, השני ל-column-gap) או להגדיר בנפרד עם row-gap: 12px ו-column-gap: 24px.
האם gap עובד עם flex-wrap?
כן. כאשר אלמנטים עוברים לשורה חדשה, gap מחיל ריווח גם בין השורות. הערך row-gap שולט בריווח האנכי בין השורות, ו-column-gap שולט בריווח האופקי בין האלמנטים.
האם gap נתמך בכל הדפדפנים?
התכונה gap עם Flexbox נתמכת בכל הדפדפנים המודרניים. Firefox הוסיף תמיכה באוקטובר 2018, Chrome ביולי 2020, ו-Safari באפריל 2021. אין צורך ב-polyfills או fallbacks.
מה זה Gap Decorations ב-CSS?
Gap Decorations הוא פיצ׳ר CSS חדש (W3C Working Draft) שמאפשר הוספת קישוטים ויזואליים (קווים, דפוסים) בתוך המרווחים בין אלמנטים. הפיצ׳ר מרחיב את column-rule ל-Grid ו-Flexbox ומוסיף תכונת row-rule חדשה. כרגע נתמך מאחורי דגל ניסיוני ב-Chrome ו-Edge 139+.
למה ה-gap שלי ב-Flexbox לא עובד?
הסיבות הנפוצות: ה-container חסר display: flex, האלמנטים לא ילדים ישירים של ה-flex container, או שמשתמשים ב-row-gap באחוזים על container ללא גובה מפורש (שמתפרש כ-0). ודאו שה-gap מוגדר על ה-container, לא על האלמנטים.
אפשר להשתמש ב-gap וב-margin ביחד?
כן. הם משמשים למטרות שונות ומצטברים. השתמשו ב-gap על ה-container לריווח אחיד בין אלמנטים, וב-margin על אלמנטים בודדים כשצריכים ריווח נוסף סביב אלמנט ספציפי או רוצים לדחוף אלמנט עם margin-left: auto.

זהו על gap עם Flexbox. ברגע שמתחילים לעבוד איתו, אין סיבה לחזור לריווח עם margin.

דיון ותגובות
2 תגובות  ]
  • איש נחמד 5 דצמבר 2022, 20:59

    מאמר נפלא רועי, רק שיש באג מרגיז ב-GAP הזה. ניקח את הדוגמה שהבאת למעלה עם ה-CSS הבא:

    .flex-gap{
        row-gap: 5px;
        column-gap: 5px;
        }
        .flex-gap .item {
        width: 50%;
        }
    }
    <div class="flex-gap">
      <div>1</div>
      <div>2</div>
      <div>3</div>
      <div>4</div>
      <div>5</div>
      <div>6</div>
    </div>
    • רועי יוסף 5 דצמבר 2022, 20:59

      תודה, אתה באמת איש נחמד 🙂

      תקן אותי אם אני טועה, הפתרון כפי שמוצג בקישור ששלחת הוא להשתמש ביחידה Fr ולא באחוזים…

השאירו תגובה

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

Savvy WordPress Development official logo