קו מוצרי 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

כברירת מחדל, מיכל גמיש עוטף ילדים.

false
true

פריט צאצא גמיש נראה מעוך, איזה מאפיין גמיש עוזר לצמצם את הבעיה?

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

הרשימה המלאה של הערכים ב-MDN

בהדגמה הבאה יש שורה אחת של פריטים 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

משאבים