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 והוא גבוה יותר מהשורות שלו.