The CSS Podcast – 010: Flexbox
דפוס עיצוב שיכול להיות בעייתי בעיצוב רספונסיבי הוא סרגל צד שממוקם בתוך תוכן מסוים. כשיש מספיק מקום בחלון התצוגה, התבנית הזו עובדת מצוין, אבל כשהמרחב מצומצם, הפריסה הנוקשה הזו עלולה להפוך לבעייתית.
מודל פריסת התיבה הגמישה (Flexiblebox) הוא מודל פריסה שמיועד לתוכן חד-ממדי. הוא מתאים במיוחד לקבוצה של פריטים בגדלים שונים, ומחזיר את הפריסה הטובה ביותר לפריטים האלה.
זהו מודל הפריסה אידיאלי לתבנית של סרגל הצד. Flexbox עוזר לא רק להציג את סרגל הצד והתוכן בשורה אחת, אלא גם במקרים שבהם אין מספיק מקום, סרגל הצד יוצג בשורה חדשה. במקום להגדיר מידות נוקשות למעקב של הדפדפן, עם Flexbox, במקום זאת, תוכלו להציב גבולות גמישים כדי לרמוז על האופן שבו התוכן יוצג.
מה אפשר לעשות עם פריסה גמישה?
לפריסות גמישה יש את התכונות הבאות, שאפשר ללמוד עליהם במדריך הזה.
- אפשר להציג אותן כשורה או כעמודה.
- הם פועלים בהתאם למצב הכתיבה של המסמך.
- כברירת מחדל, הם שורה אחת, אבל אפשר לבקש ממנו להתפרס על כמה שורות.
- אפשר לשנות את הסדר החזותי של הפריטים בפריסה, ללא קשר לסדר שלהם ב-DOM.
- אפשר לחלק את המרחב בתוך הפריטים, כך שהם יהיו גדולים יותר או קטנים יותר בהתאם למרחב הזמין ברכיב ההורה שלהם.
- אפשר לחלק את הרווח סביב הפריטים והקווים גמישה בפריסה ארוזה, באמצעות המאפיינים 'יישור תיבה'.
- ניתן ליישר את הפריטים עצמם על ציר הצלב.
הציר הראשי והציר הצלב
המפתח להבנת ה-Flexbox הוא הבנת המושג 'ציר ראשי' ו'ציר חוצה'.
הציר הראשי הוא הציר שהוגדר על ידי נכס flex-direction
.
אם המיקום הוא row
, הציר הראשי שלך נמצא לאורך השורה,
אם התאריך הוא column
, הציר הראשי שלך יהיה לאורך העמודה.
פריטים גמישים נעים כקבוצה בציר הראשי. זכרו: יש לנו כמה דברים ואנחנו מנסים להשיג את הפריסה הטובה ביותר עבורם כקבוצה.
הציר הצלב רץ בכיוון ההפוך לציר הראשי,
כך שאם הערך של flex-direction
הוא row
, ציר הציר פועל לאורך העמודה.
ניתן לבצע שתי פעולות בציר הצלב.
אפשר להזיז את הפריטים בנפרד או כקבוצה, כדי שהם יישארו באותו קו זה לזה ולקונטיינר הגמיש. כמו כן, אם יש לכם קווים גמישים,
אפשר להתייחס לשורות האלה כקבוצה כדי לקבוע איך יוקצה הרווח לשורות האלה.
תראו איך כל זה עובד בפועל במדריך הזה,
בינתיים, רק חשוב לזכור שהציר הראשי עוקב אחרי flex-direction
.
יצירת קונטיינר גמיש
בואו נראה איך Flexbox פועל: לוקחים קבוצה של פריטים בגדלים שונים ומשתמשים ב-Flexbox אותן.
<div class="container" id="container">
<div>One</div>
<div>Item two</div>
<div>The item we will refer to as three</div>
</div>
כדי להשתמש ב-Flexbox, צריך להצהיר שאתם רוצים להשתמש בהקשר של עיצוב Flex ולא בתצוגת בלוקים רגילה ובתצוגה בתוך שורה.
לשם כך, משנים את הערך של המאפיין display
לערך flex
.
.container {
display: flex;
}
כפי שלמדתם במדריך לגבי פריסה, כך תקבלו תיבה ברמת הבלוק עם פריטים גמישים בתור צאצאים. הפריטים הגמישים מתחילים מיד בהתנהגות של Flexbox, תוך שימוש בערכים הראשוניים שלהם.
הערכים הראשוניים מציינים את הדברים הבאים:
- הפריטים מוצגים בשורה.
- הם לא גלישה.
- הם לא גדלים כדי למלא את המאגר.
- הם מופיעים בתחילת המאגר.
שליטה בכיוון של פריטים
למרות שעדיין לא הוספתם את המאפיין flex-direction
, הפריטים מוצגים בשורה כי הערך הראשוני של flex-direction
הוא row
.
אם רוצים שורה, אין צורך להוסיף את הנכס.
כדי לשנות את הכיוון, מוסיפים את המאפיין ואחד מארבעת הערכים הבאים:
row
: הפריטים מוצגים בשורה.row-reverse:
הפריטים פרוסים כשורה מהקצה של המאגר הגמיש.column
: הפריטים פרוסים כעמודה.column-reverse
: הפריטים מוצגים בעמודה מסוף הקונטיינר הגמיש.
אתם יכולים לנסות את כל הערכים באמצעות קבוצת הפריטים שלנו בדמו שבהמשך.
להפוך את רצף הפריטים והנגישות
צריך להיזהר כשמשתמשים במאפיינים שמסדרים מחדש את התצוגה החזותית
רחוק מהסידור של הפריטים במסמך ה-HTML,
כי זה עלול להשפיע לרעה על הנגישות.
הערכים row-reverse
ו-column-reverse
הם דוגמה טובה לכך.
המערכת מבצעת את הסדר מחדש רק בסדר החזותי, ולא בסדר ההגיוני.
חשוב להבין את זה, כי הסדר הלוגי הוא הסדר שבו קורא המסך יקריא
את התוכן,
וכל מי שמנווט באמצעות המקלדת ילך אחריו.
בסרטון הבא אפשר לראות איך בפריסת שורות הפוכה, הקשה על Tab בין קישורים הופכת ללא רציפה כי הניווט במקלדת פועל לפי DOM ולא לפי התצוגה החזותית.
כל דבר שיכול לשנות את סדר הפריטים ב-Flexbox או ברשת יכול לגרום לבעיה הזו. לכן, כל שינוי בסדר הפריטים צריך לכלול בדיקה יסודית כדי לוודא שהוא לא יקשה על חלק מהאנשים להשתמש באתר.
למידע נוסף:
מצבי כתיבה וכיוון כתיבה
כברירת מחדל, הפריטים בפורמט Flex בפריסה כשורה. שורה נמתחת בכיוון שבו המשפטים זורמים במצב הכתיבה ובכיוון הסקריפט. כלומר, אם אתם עובדים בערבית, שיש לו כיוון סקריפט מימין לשמאל (rtl), הפריטים יופיעו בצד ימין. גם סדר הכרטיסיות יתחיל מימין כי כך קוראים משפטים בערבית.
אם אתם עובדים במצב כתיבה אנכית,
כמו גופנים ביפנית, השורה תפעל אנכית, מלמעלה למטה.
כדאי לנסות לשנות את flex-direction
בהדגמה הזו, שבה נעשה שימוש במצב כתיבה אנכי.
לכן, אופן הפעולה של פריטים גמישים כברירת מחדל מקושר למצב הכתיבה של המסמך. רוב המדריכים נכתבים באנגלית או במצב כתיבה אופקי אחר, משמאל לימין. כך יהיה קל להניח שהפריטים הגמישים נמצאים בצד שמאל והם פועלים לרוחב.
כשמביאים בחשבון את הציר הראשי והציר הרוחבי ואת אופן הכתיבה, קל יותר להבין את העובדה שאנחנו מדברים על התחלה וסיום במקום על 'למעלה', 'למטה', 'ימין' ו'שמאל' ב-Flexbox. לכל ציר יש תחילה וסוף. ההתחלה של הציר הראשי נקראת main-start. לכן הפריטים הגמישים שלנו משתלבים בהתחלה מההתחלה. קצה הציר הזה הוא קצה ראשי. תחילת הציר המאונך היא cross-start והסוף הוא cross-end.
אריזה של פריטים גמישים
הערך הראשוני של המאפיין flex-wrap
הוא nowrap
.
כלומר, אם אין מספיק מקום בקונטיינר, הפריטים יחרגו ממנו.
פריטים שמוצגים באמצעות הערכים הראשוניים יצומצמו עד כמה שאפשר,
עד לגודל min-content
לפני שהגלישה מתבצעת.
כדי לגרום לאריזה של הפריטים, מוסיפים flex-wrap: wrap
למאגר הגמיש.
.container {
display: flex;
flex-wrap: wrap;
}
כשקונטיינר גמישות עוטף, הוא יוצר כמה קווים גמישים. מבחינת התפלגות החלל, כל שורה פועלת כמו מיכל גמיש חדש. לכן, אם אתם מגדילים את השורות, אי אפשר לגרום למשהו בשורה 2 להתאים למשהו שמעליו בשורה 1. זו הסיבה לכך ש-Flexbox הוא דו-מימדי. אפשר לשלוט ביישור בציר אחד, בשורה או בעמודה, לא את שתיהן ביחד, כפי שאנחנו יכולים לעשות ברשת.
הקיצור של הזרימה הגמישה
אפשר להגדיר את המאפיינים flex-direction
ו-flex-wrap
באמצעות הקיצור flex-flow
.
לדוגמה, כדי להגדיר את flex-direction
כ-column
ולאפשר את הקיפול של פריטים:
.container {
display: flex;
flex-flow: column wrap;
}
שליטה במרחב בתוך פריטים גמישים
בהנחה שבמאגר שלנו יש יותר מקום מהנדרש כדי להציג את הפריטים,
הפריטים מופיעים בהתחלה ולא גדלים כדי למלא את השטח.
הם מפסיקים לגדול כשהם מגיעים לגודל התוכן המקסימלי.
הסיבה לכך היא שהערך הראשוני של המאפיינים flex-
הוא:
flex-grow: 0
: פריטים לא גדלים.flex-shrink: 1
: הפריטים יכולים להתכווץ לגודל קטן יותר מflex-basis
.flex-basis: auto
: לפריטים יש גודל בסיס שלauto
.
אפשר לייצג אותו בערך של מילת המפתח flex: initial
.
מאפיין הקיצור flex
,
או הידיים הארוכות של flex-grow
, flex-shrink
ו-flex-basis
חלות על הצאצאים של
מאגר גמיש.
כדי לגרום לפריטים לגדול, תוך מתן מקום גדול יותר לפריטים גדולים מאשר לפריטים קטנים, משתמשים ב-flex:auto
.
אפשר לנסות לעשות זאת באמצעות ההדגמה שלמעלה.
הפעולה הזו מגדירה את המאפיינים כך:
flex-grow: 1
: הפריטים יכולים לגדול מעבר ל-flex-basis
שלהם.flex-shrink: 1
: פריטים יכולים להתכווץ פחות מ-flex-basis
.flex-basis: auto
: גודל הבסיס של הפריטים הואauto
.
אם משתמשים ב-flex: auto
, הפריטים יהיו בגדלים שונים כי המרחב המשותף בין הפריטים מחולק אחרי שמיקום כל פריט נקבע לפי גודל התוכן המקסימלי.
כך פריט גדול יתפוס יותר מקום.
כדי לאלץ את כל הפריטים להיות באותו גודל ולהתעלם מהגודל של התוכן, משנים את הערך של flex:auto
ל-flex: 1
בדמו.
הפעולה הזו פותחת אל:
flex-grow: 1
: פריטים יכולים להיות גדולים יותר מ-flex-basis
שלהם.flex-shrink: 1
: פריטים יכולים להתכווץ פחות מ-flex-basis
.flex-basis: 0
: גודל הבסיס של הפריטים הוא0
.
השימוש ב-flex: 1
מציין שכל הפריטים הם בגודל אפס, ולכן כל המרחב בקונטיינר הגמיש זמין לחלוקה.
מכיוון שלכל הפריטים יש גורם flex-grow
של 1
, כולם גדלים באותה מידה והמרחב משותף באופן שווה.
מתן אפשרות לפריטים לגדול בקצב שונה
לא חובה לתת לכל הפריטים גורם flex-grow
של 1
.
אפשר להקצות לפריטי ה-Flex גורמים שונים של flex-grow
.
בהדגמה שמתחת לפריט הראשון יש flex: 1
, הפריט השני flex: 2
והflex: 3
השלישי.
כשהפריטים האלה גדלים החל מ-0
, נפח האחסון הזמין בקונטיינר הגמיש משותף לשישה.
החלק הראשון מוקצה לפריט הראשון, החלק השני מוקצה לפריט השני והחלק השלישי מוקצה לפריט השלישי.
אפשר לעשות את אותו הדבר מ-flex-basis
של auto
, אבל תצטרכו לציין את שלושת הערכים.
הערך הראשון הוא flex-grow
, השני הוא flex-shrink
והשלישי הוא flex-basis
.
.item1 {
flex: 1 1 auto;
}
.item2 {
flex: 2 1 auto;
}
זהו תרחיש לדוגמה פחות נפוץ, כי הסיבה לשימוש ב-flex-basis
של auto
היא לאפשר לדפדפן לקבוע את חלוקת המרחב.
עם זאת, אם אתם רוצים לגרום לפריט לגדול קצת יותר ממה שהאלגוריתם מחליט, יכול להיות שזה יעזור לכם.
שינוי הסדר של פריטים גמישים
אפשר לשנות את הסדר של הפריטים במאגר הגמישה באמצעות המאפיין order
.
המאפיין הזה מאפשר למיין פריטים בקבוצות אורדיניות.
הפריטים מסודרים לפי הכיוון שהוגדר על ידי flex-direction
,
הערכים הנמוכים ביותר תחילה.
אם ליותר מפריט אחד יש את אותו ערך, הוא יוצג עם הפריטים האחרים עם אותו ערך.
הדוגמה הבאה ממחישה את הסדר הזה.
בדיקת ההבנה
בחינת הידע שלכם לגבי Flexbox
ערך ברירת המחדל הוא flex-direction
column
row
כברירת מחדל, מיכל גמיש עוטף ילדים.
פריט צאצא גמיש נראה מעוך, איזה מאפיין גמיש עוזר לצמצם את הבעיה?
flex-basis
flex-shrink
flex-grow
סקירה כללית בנושא יישור Flexbox
Flexbox הביא איתו קבוצה של מאפיינים ליישור פריטים ולחלוקת המרחב ביניהם. הנכסים האלה היו כל כך שימושיים, שמאז הועברו למפרט משלהם, הם יוצגו גם בפריסת רשת. כאן מוסבר איך הם פועלים כשמשתמשים ב-Flexbox.
אפשר לחלק את קבוצת הנכסים לשתי קבוצות. מאפיינים של התפלגות מרחב ומאפיינים ליישור. המאפיינים שמחלקים את המרחב הם:
justify-content
: חלוקת המרחב על הציר הראשי.align-content
: חלוקת המרחב המשותף בציר העובר.place-content
: קיצור דרך להגדרת שני המאפיינים שלמעלה.
המאפיינים שמשמשים ליישור ב-Flexiblebox:
align-self
: מיישר פריט יחיד בציר העובר.align-items
: מיישרת את כל הפריטים כקבוצה על הציר האופקי.
אם עובדים על הציר הראשי, המאפיינים מתחילים ב-justify-
.
בצירים השונים הן מתחילים ב-align-
.
חלוקת השטח על הציר הראשי
עם קוד ה-HTML שהיה בשימוש קודם, הפריטים הגמישים מסודרים כשורה, ונשאר רווח על הציר הראשי.
הפריטים לא גדולים מספיק כדי למלא את כל המכל הגמיש.
הפריטים מסודרים בתחילת מאגר ה-flex כי הערך הראשוני של justify-content
הוא flex-start
.
הפריטים מופיעים בהתחלה ורווחים מיותרים בסוף.
מוסיפים את המאפיין justify-content
לקונטיינר הגמיש, מקצים לו את הערך flex-end
והפריטים ייצברו בסוף הקונטיינר והרווח העודף יופיע בהתחלה.
.container {
display: flex;
justify-content: flex-end;
}
אפשר גם לחלק את הרווח בין הפריטים באמצעות justify-content: space-between
.
כדאי לנסות כמה מהערכים בדמו, וב-MDN תוכלו למצוא את הקבוצה המלאה של הערכים האפשריים.
עם flex-direction: column
אם שינית את flex-direction
ל-column
, justify-content
יפעל בתאריך
העמודה.
כדי שיהיה מקום פנוי במכל במהלך העבודה כעמודה, צריך לתת למכל
height
או block-size
.
אחרת לא יהיה לכם מקום פנוי להפצה.
אפשר לנסות את הערכים השונים, הפעם בפריסת עמודות של Flexbox.
חלוקת רווח בין קווים גמישים
אם משתמשים בקונטיינר Flex ארוך, יכול להיות שיהיה מקום להפצה בציר הרוחב.
במקרה כזה, אפשר להשתמש במאפיין align-content
עם אותם ערכים כמו justify-content
.
בניגוד למדיניות justify-content
שמבצעת התאמה של פריטים ל-flex-start
כברירת מחדל,
הערך הראשוני של align-content
הוא stretch
.
כדי לשנות את התנהגות ברירת המחדל הזו, מוסיפים את המאפיין align-content
למאגר התגים הגמיש.
.container {
align-content: center;
}
אפשר לנסות את זה בהדגמה.
בדוגמה יש שורות קשורות של פריטים גמישים,
ובמכל יש block-size
כדי שיהיה לנו מקום פנוי.
הקיצור של place-content
כדי להגדיר גם את justify-content
וגם את align-content
, אפשר להשתמש ב-place-content
עם ערך אחד או שניים.
אם מציינים שהערך הראשון ישמש את align-content
והשני ישמש את justify-content
, המערכת תשתמש בערך יחיד בשני הצירים.
.container {
place-content: space-between;
/* sets both to space-between */
}
.container {
place-content: center flex-end;
/* wrapped lines on the cross axis are centered,
on the main axis items are aligned to the end of the flex container */
}
יישור פריטים בציר הצלב
אפשר גם ליישר את הפריטים בקו הגמישות בציר העובר באמצעות align-items
ו-align-self
.
המרחב שזמין ליישור הזה יהיה תלוי בגובה של מאגר ה-Flex או של שורת ה-Flex במקרה של קבוצה של פריטים עטופים.
הערך הראשוני של align-self
הוא stretch
,
זו הסיבה לכך שפריטים בשורה נמתחים לגובה של הפריט הגבוה ביותר כברירת מחדל.
כדי לשנות את זה, מוסיפים את המאפיין align-self
לאחד מהפריטים הגמישים.
.container {
display: flex;
}
.item1 {
align-self: flex-start;
}
כדי ליישר את הפריט, משתמשים באחד מהערכים הבאים:
flex-start
flex-end
center
stretch
baseline
בהדגמה הבאה יש שורה אחת של פריטים Flex עם flex-direction: row
.
הפריט האחרון מגדיר את הגובה של מיכל הגמיש.
הפריט הראשון מכיל את המאפיין align-self
עם הערך flex-start
.
אפשר לנסות לשנות את הערך של המאפיין הזה כדי לראות איך הוא זז במרחב שלו בציר החוצה.
המאפיין align-self
חל על פריטים בודדים.
אפשר להחיל את המאפיין align-items
על קונטיינר הגמיש
כדי להגדיר את כל הנכסים הנפרדים של align-self
כקבוצה.
.container {
display: flex;
align-items: flex-start;
}
בהדגמה הבאה אפשר לנסות לשנות את הערך של align-items
כדי ליישר קו בין כל הפריטים שבצלב
כקבוצה.
למה אין הצדקה עצמית ב-Flexbox?
פריטים מסוג Flex פועלים כקבוצה בציר הראשי. לכן אין רעיון של פיצול פריט בודד מתוך הקבוצה הזו.
בפריסת רשת, המאפיינים justify-self
ו-justify-items
פועלים על הציר המוטבע
כדי להתאים פריטים בציר הזה בתוך אזור הרשת שלהם.
בגלל האופן שבו פריסות גמישות מתייחסות לפריטים כקבוצה, המאפיינים האלה לא מיושמים בהקשר של גמישות.
כדאי לדעת ש-Flexbox מתאים מאוד לשימוש עם שוליים אוטומטיים.
אם אתם צריכים לפצל פריט אחד מקבוצה, או להפריד את הקבוצה לשתי קבוצות, תוכלו להשתמש בשוליים כדי לעשות זאת.
בדוגמה שמתחת לפריט האחרון, יש שוליים שמאליים של auto
.
השוליים האוטומטיים סופגים את כל המרחב בכיוון שבו הם חלים.
המשמעות היא שהפריט נדחף שמאלה, וכך הקבוצות מחולקות.
איך למרכז פריט באופן אנכי ואופקי
אפשר להשתמש במאפייני היישור כדי למרכז פריט בתוך תיבה אחרת.
המאפיין justify-content
מיישר את הפריט בציר הראשי, שהוא השורה. המאפיין align-items
בציר החוצה.
.container {
width: 400px;
height: 300px;
display: flex;
justify-content: center;
align-items: center;
}
בדיקת ההבנה
בדיקת הידע שלכם בנושא Flexbox
.container {
display: flex;
direction: ltr;
}
כדי ליישר אנכית עם Flexbox, משתמשים בפקודה:
.container {
display: flex;
direction: ltr;
}
כדי ליישר קו אופקי עם Flexbox, משתמשים
.container {
display: flex;
direction: ltr;
}
כברירת מחדל, פריטים גמישים מותאמים ל-stretch
. אם רוצים לראות תוכן
הגודל שמשמש לפריטי צאצא, באיזה מהסגנונות הבאים היית רוצה להשתמש?
align-items: flex-start
align-content: start
justify-content: flex-start
height: auto