FLEX ואני – מעמיקים יחסים

משך זמן קריאה: 4 דקות

ביולי האחרון כתבתי את הפוסט flex ואני בעקבות פרויקט שעבדתי עליו והשתמשתי לראשונה במאפיין flex. מאז עברו עוד כמה פרויקטים תחת ידי ובאחרון שבהם השימוש שלי ב flex היה נרחב, מאתגר וממש הקל עלי בעיצוב וסידור העמודים השונים וברזולוציות השונות. בעצם, כמעט בכל מקום בו היה לי צורך לעמוד יותר מ 2 אלמנטים בשורה או בטור השתמשתי באופן אוטומטי ב flex. השתדלתי להמנע משימוש ב float ולהחליף אותו ב flex שמיועד לארגון וסידור אלמנטים. (המאפיין grid עושה עבודה טובה יותר בעימוד, אבל התמיכה שלו לא מספיק נרחבת. אני מחכה בסבלנות להשתמש גם בו :))

אז למה אני מתעלפת מflex?

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

flex-image-1

 

נכון, היה אפשר להשתמש ב float אבל אז הייתי צריכה להוסיף clearing כדי שה"אבא" יכיר את ילדיו המעופפים. חסרון נוסף בשימוש ב float הוא חוסר היכולת למרכז את הפוסטים. כאן בא השימוש ב flex והקל על חיי 🙂

זה פחות או יותר מבנה העמוד (השארתי רק את הדברים הרלוונטים):

<main class="site-main">
    <header class="page-header">
        <h1 class="page-title title-articles">מאמרים</h1>                    
    </header>
    <article class="post"></article>
    <article class="post"></article>
    <article class="post"></article>
    <article class="post"></article>
    <article class="post"></article>
</main>

נתתי ל main הגדרה של flex:

.main{  
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
}

ההגדרה של flex-wrap אומרת לאלמנטים ליפול שורה כשאין מקום יותר, וההגדרה האחרונה של justify-content: center ממרכזת את כל האלמנטים – מה שאומר שאם יש פחות מ 3 פוסטים בשורה הם יתמרכזו. כמה פשוט!

כשרק התחלתי לעצב את העמוד, בקובץ PSD איתו עבדתי היו מספר שווה של אלמנטים – מה שגרם לי להשתמש ב justify-content: space-between בשביל לרווח בין הפוסטים.  הכוונה היא למקם את הפוסטים הימני ביותר והשמאלי ביותר לימין ולשמאל ה DIV שעוטף אותם – וכל הפוסטים שביניהם מחלקים את המקום שנשאר שווה בשווה. הכל היה טוב ויפה וממש פיקסל פרפקט עד שלפתע נוספה עוד שורת פוסטים עם 2 בלבד, הראשון נצמד לימין והשני לשמאל (לא מראה מלבב במיוחד) :

justify-content: space-between;
לשמחתי – לא הייתי צריכה לעבוד כל כך קשה כדי ליישר אותם למרכז – שיניתי את justify-content: space-between ל justify-content: center; וכדי שהפוסטים לא ייצמדו אחד לשני נתתי לכל פוסט רווח משמאל:

.post{
   margin-left: 0.5%;
}

עוד ייתרון בשימוש ב flex על פני float הוא ביטול הגדרת הגובה. כאשר משתמשים ב float על אלמנטים  כאשר יש אלמנט קצר יותר – האמנט הבא יכנס מתחתיו, ואז נוצרים חורים בעמוד:

float-image

כדי שזה לא יקרה – צריך לתת הגדרת גובה. בשימוש ב flex זה קורה אוטומטי – גובה ה"שורה" שנוצרת נקבע ע"פ האלמנט הגבוה ביותר 🙂

 

בכל העמודים את הגדרת ה flex נתתי לאלמנט שמחזיק אותם: main. אבל main כלל בתוכו גם את כותרת העמוד (שם התגית/שם תוצאות החיפוש) ואותו לא רציתי לכלול בהתנהגות ה"פלקסית". ממש לא רציתי להוסיף עוד DIV עוטף רק בשביל שימוש בפלקס. חיפשתי ומצאתי ב stackoverflow תשובה לבעיה שלי:

.page-header{
    flex: 0 1 100%;
}

ההגדרה של 100% היא ההגדרה של flex-basis  – שקובעת את הרוחב של האלמנט. בעצם אפשר להגדיר width: 100% וזה גם יעבוד.

באתר רפרנס של codrops כתוב:

The flex-basis Property
The flex-basis property takes the same values as the width property, and sets the flex basis: the initial main size (see concepts and terminology) of the flex item, before free space is distributed according to the flex factors (see flex-shrink and flex-grow).

אני עדיין לא יודעת מה נכון יותר לשימוש. האם לתת הגדרה של רוחב באמצעות width, או האם נכון יותר לתת הגדרה של רוחב ע"י שימוש ב flex-basis.

 

שינוי סדר הופעת אלמנטים

שימוש ב flex יכול לטפל בסדר הצגת אלמנטים בעמוד מבלי לשנות את ה html ובלי לערב js. וכמובן – הכי טוב להבין עם דוגמה מהאתר 🙂 הפוטר של האתר היה מורכב מ: תוסף של ציטוטים, טקסט סטטי, תפריט (עם הפניה ליצירת קשר וכפתור לפייסבוק) וטופס הרשמה לניוזלטר. ברזולוציות נמוכות – לא הייתה בעיה – זה סדר שבו האלמנטים היו מעוצבים (למעט הציטוטים שלא הוצגו ברזולוציות נמוכות).

<div class="footer">
    <aside class="widget_quotescollection"></aside>
    <aside class="text"></aside>
    <aside class="nav_menu"></aside>
    <aside class="news_letter"></aside>
</div>

זה סדר ההופעה של האלמנטים בפוטר, ברזולוציה הנמוכה ביותר (התמונה מימין) והגבוהה ביותר (התמונה משמאל):

footer-elements

גם במקרה הזה היה אפשר היה להשתמש ב float ימינה ושמאלה כדי למקם את  2 ו 3 במקום הפוך – אבל זה ממש לא אידיאלי בעייני. float מוציא את האלמנט מה"flow", וזה לא נכון – אנחנו רק רוצים לשנות את הסדר לא ל"להוציא אותו מהרצף" וגם, שוב היה צריך להכניס clearing.

נתתי הגדרה של display:flex לכל הפוטר, ולתפריט וטופס ההרשמה נתתי הגדרה של מיקום:

.footer{
    display: flex;
    flex-wrap: wrap;
}
.nav_menu {
    order: 4;
    width: 49%;
}
.news_letter {
    order: 3;
    width: 51%;
}

עוד 2 קטנות:

  • לא השתמשתי הרבה – אבל כן מאוד עזר שימוש ב align-items: flex-start; בשביל ליישר לקצה העליון את האלמנטים.
  • מבאס אותי שעדיין צריך להשתמש ב prefix אחרת flex לא חבר של כל הדפדפנים.

מבטיחה להמשיך להשתמש ב flex ולדווח 🙂

אתר סיינטיפיק אמריקן ישראל אופיין ע"י יוני לרנר, עיצוב: קרן אייז. תכנות: לאה כהן וCSS אני 🙂

  2 תגובות ל “FLEX ואני – מעמיקים יחסים

  1. עומר
    28 בדצמבר 2016 at 12:09

    אחלה פוסט! תמציתי וברור.
    תודה.

  2. מלן
    10 באפריל 2017 at 13:20

    כתבה מעולה! נהנתי לקרוא , תודה לך 🙂

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *