חיפוש

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

CSS Flexbox כמו גם CSS Grid הם כלים מצוינים כדי לנהל מתווה (layout) באתרים. Flexbox דואג לעימוד חד-מימדי בצורה נפלאה, ו-CSS Grid פותר את עניין העימוד הדו-מימדי בעזרת עמודות ושורות.

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

רבים מכירים אותה מ-CSS grid, אבל מעטים משתמשים בה עבור קונטיינר מסוג flex. כדאי להתחיל, במיוחד כשתמיכת הדפדפנים ב-gap רחבה למדי – כפי שתראו בסוף הפוסט.

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

אז כפי שציינו, CSS Gap עובד ב-CSS 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

עם CSS 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 עם Flexbox נתמכת בכל הדפדפנים המובילים. Firefox הוסיף תמיכה באוקטובר 2018, Chrome ביולי 2020, ו-Safari באפריל 2021. התכונה גם מותאמת לכיוון הכתיבה (flow-relative), ולכן עובדת נכון עם תכונות לוגיות ב-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 Decorations

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

הפיצ׳ר יאפשר הוספת מפרידים ויזואליים (קווים, דפוסים) בין אלמנטים ללא צורך באלמנטי DOM נוספים. 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. ברגע שתתחילו להשתמש בה, לא תרצו לחזור לריווח עם 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