Menu

CSS flex-wrap ו-flex-direction: שורות, עמודות ושבירת שורה

flex-wrap קובע אם פריטי flex נדחסים לשורה אחת או עוברים לשורה הבאה, ו-flex-direction קובע אם הם זורמים בשורה או בעמודה. למדו את שניהם עם דוגמאות חיות, את הקיצור flex-flow, את align-content, ושורת כרטיסים רספונסיבית בלי media queries.

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

flex-wrap: שורה אחת, או כמה שצריך

כברירת מחדל מכל flex שומר את כל הפריטים שלו בשורה אחת (flex-wrap: nowrap) ומכווץ אותם כדי שייכנסו. flex-wrap: wrap מאפשר להם לשמור על הגודל שלהם ולעבור לשורה הבאה במקום:

כל פריט מבקש 100px, חמישה כאלה בתיבה של 340px. חמישה פריטים וארבעה רווחים של 8px צריכים 532px, ולכן בלי שבירת שורה כל פריט נדחס לבערך 62px, כי פריטי flex מתכווצים כברירת מחדל. עם wrap הם נשארים ב-100px: שלושה נכנסים בשורה הראשונה, והשניים האחרים עוברים לשורה שנייה.

ערכי flex-wrap

ערךמה קורה
nowrap (ברירת מחדל)שורה אחת. הפריטים מתכווצים, וגולשים מהמכל ברגע שהם לא יכולים להתכווץ יותר
wrapפריטים שלא נכנסים מתחילים שורה חדשה למטה
wrap-reverseאותו הדבר, אבל שורות חדשות נערמות כלפי מעלה: השורה הראשונה נמצאת למטה

צפו בפריטים עוברים שורה

גררו את המחוון כדי לשנות את הרוחב של המכל. הפלט סופר את השורות ואומר כמה פריטים יש בכל אחת:

ב-400px, ארבעה פריטים של 90px ושלושה רווחים של 8px (384px) נכנסים בשורה, כך שמקבלים 4 + 2. גררו לכיוון 620px וכל השישה נכנסים בשורה אחת; גררו לכיוון 120px וכל פריט מקבל שורה משלו.

flex-direction: שורה או עמודה

flex-direction קובע את הכיוון שבו הפריטים זורמים, שהוא הציר הראשי:

ערךהפריטים זורמיםהפריט הראשון
row (ברירת מחדל)זה לצד זה, בכיוון הכתיבהבתחילת השורה
row-reverseזה לצד זה, בסדר הפוךבסוף השורה
columnבערימה, מלמעלה למטהלמעלה
column-reverseבערימה, מלמטה למעלהלמטה

בשתי התיבות של row הפריטים נמתחים לכל הגובה של התיבה, כי align-items: stretch פועל לרוחב השורה. בתיבות של column הם נמתחים במקום זאת לכל הרוחב, מאותה סיבה. הצירים הסתובבו, וכל מאפייני היישור הסתובבו איתם (עמוד ה-justify-content מראה את זה בפירוט).

flex-flow: שניהם בשורה אחת

flex-flow הוא הקיצור ל-flex-direction ואחריו flex-wrap:

.cards { flex-flow: row wrap; }      /* flex-direction: row; flex-wrap: wrap; */
.stack { flex-flow: column nowrap; } /* flex-direction: column; flex-wrap: nowrap; */

כרטיסים רספונסיביים עם wrap ובלי media query

תנו לכל פריט גודל התחלתי עם flex: 1 1 180px ותנו לשורה לעבור שורה. כל פריט גדל כדי למלא את השורה שלו, וכששורה לא יכולה להכיל עוד פריט של 180px, הבא עובר שורה:

בתצוגה מקדימה ברוחב של בערך 800px, שלושה כרטיסים נכנסים בשורה הראשונה (בערך 253px כל אחד), והשניים האחרונים חולקים את השורה השנייה, שבה כל אחד גדל לבערך 386px. כך flexbox עובד: כל שורה מחלקת את המקום שלה, ולכן כרטיסים בשורה אחרונה קצרה יוצאים רחבים יותר מאלה שמעליהם. אם אתם רוצים שהכרטיס האחרון יישאר באותו רוחב כמו האחרים, השתמשו במקום זאת ב-grid עם repeat(auto-fill, minmax(180px, 1fr)) (ראו את עמוד ה-grid).

align-content: ריווח השורות

כשמכל עובר שורות והוא גבוה יותר מהשורות שלו, align-content קובע לאן השורות הולכות. הוא מקבל את אותם ערכים כמו justify-content, ועוד stretch:

בתיבה הראשונה שתי השורות יושבות למעלה. בשנייה השורה הראשונה למעלה והשנייה למטה, עם כל הגובה הפנוי ביניהן.

סדר הפוך ונגישות

row-reverse, column-reverse ו-wrap-reverse משנים רק איפה הפריטים מצוירים. קוראי מסך ומקש ה-Tab עדיין עוקבים אחרי הסדר ב-HTML, כך שמשתמש מקלדת עובר בין הפריטים בכיוון ההפוך למה שהוא רואה. הפכו סדר רק לאפקט חזותי; כשלסדר יש משמעות, שנו אותו ב-HTML.

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

  • פריטים שמתכווצים במקום לעבור שורה. פריטים עם flex: 1 מתחילים מ-flex-basis של 0 ונדחסים לשורה אחת. תנו להם בסיס אמיתי, כמו flex: 1 1 200px.
  • flex-wrap על הפריטים. הוא שייך למכל ה-flex.
  • שימוש ב-align-items לריווח שורות שעברו שורה. הוא מיישר פריטים בתוך כל שורה; השורות עצמן זזות עם align-content.
  • פריט אחרון בודד שנמתח לכל אורך השורה. זה flex-grow בשורה עם פריט אחד. השתמשו ב-grid אם כל כרטיס חייב להיות באותו רוחב.
  • ציפייה ש-flex-direction: column ימלא גובה. מכל של עמודה גבוה רק כמו התוכן שלו, אלא אם נותנים לו height, ולכן ל-justify-content אין מקום לפעול.

שאלות נפוצות

מה עושה flex-wrap: wrap?

הוא מאפשר לפריטי flex לעבור לשורה חדשה כשהם לא נכנסים בשורה אחת. עם ברירת המחדל nowrap, הפריטים נשארים בשורה אחת ומתכווצים, או גולשים מהמכל אם הם לא יכולים להתכווץ יותר.

למה flex-wrap לא עובד?

שבירת שורה קורית רק כשגדלי ההתחלה של הפריטים מסתכמים ליותר מהמכל. פריטים עם flex: 1 מתחילים מ-flex-basis של 0, ולכן הם אף פעם לא עוברים שורה; תנו להם גודל התחלתי אמיתי (flex: 1 1 200px או width: 200px). בדקו גם ש-flex-wrap נמצא על מכל ה-flex, לא על הפריטים.

מה ההבדל בין flex-direction row ל-column?

row (ברירת המחדל) מציב את הפריטים זה לצד זה בכיוון הכתיבה, ו-column מערם אותם מלמעלה למטה. הציר הראשי מסתובב יחד איתו, כך שבעמודה justify-content פועל אנכית ו-align-items אופקית.

מה זה flex-flow?

קיצור ל-flex-direction ול-flex-wrap בהצהרה אחת: flex-flow: row wrap; זהה ל-flex-direction: row; flex-wrap: wrap;.

מה ההבדל בין align-items ל-align-content?

align-items ממקם פריטים בתוך השורה שלהם. align-content ממקם את השורות עצמן בתוך המכל, ולכן הוא משנה רק כשלמכל יש flex-wrap: wrap והוא גבוה יותר מהשורות שלו.

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

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

להתחיל