בפוסט הזה נסביר על כמה שורות יעילות של CSS שיעזרו לכם ליצור פריסות מודרניות ועמידות.
פריסות CSS מודרניות מאפשרות למפתחים לכתוב כללי עיצוב משמעותיים וחזקים בכמה הקשות פשוטות. בהרצאה שלמעלה ובפוסט הזה אנחנו בוחנים 10 שורות CSS חזקות שמבצעות עבודה כבדה.
כדי לנסות את הדמואים האלה בעצמכם, אתם יכולים להיכנס לדף המוטמע של Glitch שלמעלה או להיכנס לכתובת 1linelayouts.glitch.me.
01. מיקום מרכזי במיוחד: place-items: center
בתצוגה הראשונה 'שורה אחת', ננסה לפתור את התעלומה הגדולה ביותר בעולם CSS: מרכוז פריטים. חשוב לי להבהיר שעם place-items: center
קל יותר ממה שנדמה לך.
קודם מציינים את grid
כשיטה display
, ואז כותבים את place-items: center
באותו רכיב. place-items
הוא קיצור דרך להגדרה של align-items
וגם של justify-items
בבת אחת. אם מגדירים אותו כ-center
, גם align-items
וגם justify-items
מוגדרים כ-center
.
.parent {
display: grid;
place-items: center;
}
כך התוכן ממורכז בצורה מושלמת בתוך הרכיב ההורה, ללא קשר לגודל שלו.
02. הפנקייק לאחר תהליך בנייה: flex: <grow> <shrink> <baseWidth>
בשלב הבא אנחנו מרכיבים את הפנקייק! זוהי פריסה נפוצה לאתרים שיווקיים, למשל, שיכולים לכלול שורה של 3 פריטים, בדרך כלל עם תמונה, כותרת ואז טקסט שמתאר תכונות מסוימות של מוצר. בנייד, אנחנו רוצים שהם ייערמו בצורה יפה ויתרבו ככל שגודל המסך יגדל.
כשמשתמשים ב-Flexbox כדי ליצור את האפקט הזה, אין צורך בשאילתות מדיה כדי לשנות את המיקום של הרכיבים האלה כשהמסך משתנה.
הקיצור flex
הוא ראשי תיבות של: flex: <flex-grow> <flex-shrink> <flex-basis>
.
לכן, אם רוצים שהתיבות ימלאו את הגודל שלהן ב-<flex-basis>
, צריך לכווץ אותן בגדלים קטנים יותר אבל למתוח אותן כדי למלא מקום נוסף, צריך לכתוב: flex: 0 1 <flex-basis>
. במקרה הזה, הערך של <flex-basis>
הוא 150px
, כך שהנוסחה תיראה כך:
.parent {
display: flex;
}
.child {
flex: 0 1 150px;
}
אם כן רוצים שהתיבות יתרחבו וימלאו את המרחב כשהן עוברות לשורה הבאה, מגדירים את <flex-grow>
כ-1
, כך שהקוד ייראה כך:
.parent {
display: flex;
}
.child {
flex: 1 1 150px;
}
עכשיו, כשמגדילים או מקטינים את גודל המסך, הפריטים הגמישים האלה מתכווצים ומתרחבים.
03. בסרגל הצד כתוב: grid-template-columns: minmax(<min>, <max>) …)
הדגמה הזו מנצלת את הפונקציה minmax לפריסות של רשתות. מה שאנחנו עושים כאן הוא להגדיר את הגודל המינימלי של סרגל הצד כ-150px
, אבל במסכים גדולים יותר כך שהוא יתפרש עד ל-25%
. סרגל הצד תמיד יתפוס 25%
מהמרחב האופקי של האב שלו, עד ש-25%
יהיה קטן מ-150px
.
מוסיפים את זה כערך של grid-template-columns עם הערך הבא:
minmax(150px, 25%) 1fr
. הפריט בעמודה הראשונה (הסרגל הצדדי במקרה הזה) מקבל minmax
של 150px
ב-25%
, והפריט השני (הקטע main
כאן) תופס את שאר המרחב כטראק 1fr
יחיד.
.parent {
display: grid;
grid-template-columns: minmax(150px, 25%) 1fr;
}
04. ערימת פנקייקים: grid-template-rows: auto 1fr auto
בניגוד לפנקייק שנוצר, בדוגמה הזו לא עוטפים את הצאצאים שלו כשגודל המסך משתנה. הפריסה הזו נקראת בדרך כלל כותרת תחתונה במיקום קבוע. הפריסה הזו משמשת לעתים קרובות הן לאתרים והן לאפליקציות, באפליקציות לנייד (הכותרת התחתונה היא בדרך כלל סרגל כלים) ובאתרים (אפליקציות של דף יחיד משתמשות לעתים קרובות בפריסה הגלובלית הזו).
הוספת display: grid
לרכיב תיצור רשת של עמודה אחת, אבל האזור הראשי יהיה גבוה רק כמו התוכן עם הכותרת התחתונה שמתחתיו.
כדי שהכותרת התחתונה תישאר בתחתית הדף, מוסיפים:
.parent {
display: grid;
grid-template-rows: auto 1fr auto;
}
כך תוכן הכותרת והכותרת התחתונה ייקח באופן אוטומטי את הגודל של רכיבי הצאצאים שלו, והמרחב שנותר (1fr
) יוחל על האזור הראשי. השורה בגודל auto
תיקח את הגודל של התוכן המינימלי של רכיבי הצאצאים שלה, כך שככל שהתוכן יגדל, גם השורה תגדל כדי להתאים.
05. פריסת Holy Grail הקלאסית: grid-template: auto 1fr auto / auto 1fr auto
בפריסת 'גביע הקדוש' הקלאסית הזו יש כותרת, כותרת תחתונה, סרגל צד שמאל, סרגל צד ימין ותוכן ראשי. היא דומה לפריסה הקודמת, אבל עכשיו יש בה סרגל צד!
כדי לכתוב את כל התרשים הזה באמצעות שורת קוד אחת, משתמשים במאפיין grid-template
. כך תוכלו להגדיר את השורות והעמודות בו-זמנית.
הצמד של המאפיין והערך הוא: grid-template: auto 1fr auto / auto 1fr auto
. הקו הנטוי בין הרשימה הראשונה לרשימה השנייה שמפרידים ביניהם רווחים הוא ההפרדה בין השורות לעמודות.
.parent {
display: grid;
grid-template: auto 1fr auto / auto 1fr auto;
}
בדומה לדוגמה הקודמת, שבה לכותרת העליונה ולכותרת התחתונה היה תוכן בגודל אוטומטי, כאן הגודל של סרגל הצד הימני והשמאלי נקבע באופן אוטומטי על סמך הגודל הפנימי של רכיבי הצאצא שלהם. עם זאת, הפעם מדובר בגודל אופקי (רוחב) ולא לאורך (גובה).
6) רשת עם 12 שורות: grid-template-columns: repeat(12, 1fr)
עכשיו יש לנו עוד קלאסיקה: רשת עם 12 שורות. אפשר לכתוב רשתות ב-CSS במהירות באמצעות הפונקציה repeat()
. שימוש ב-repeat(12, 1fr);
לעמודות של תבנית הרשת נותן לכם 12 עמודות, כל אחת בגודל 1fr
.
.parent {
display: grid;
grid-template-columns: repeat(12, 1fr);
}
.child-span-12 {
grid-column: 1 / 13;
}
עכשיו יש לכם רשת של 12 טראקים, ואנחנו יכולים למקם את הצאצאים ברשת. אחת מהדרכים לעשות זאת היא למקם אותם באמצעות קווים של רשת. לדוגמה, grid-column: 1 / 13
תתפרש על פני כל הדרך מהשורה הראשונה עד לשורה האחרונה (13) ותשתרע על פני 12 עמודות. grid-column: 1 / 5;
יכלול את ארבעת הימים הראשונים.
אפשר גם לכתוב את זה באמצעות מילת המפתח span
. בעזרת span
, אפשר להגדיר את קו ההתחלה ואז את מספר העמודות שיוצגו מנקודת ההתחלה הזו. במקרה כזה, grid-column: 1 / span 12
יהיה שווה ל-grid-column: 1 / 13
ו-grid-column: 2 / span 6
יהיה שווה ל-grid-column: 2 / 8
.
.child-span-12 {
grid-column: 1 / span 12;
}
7) RAM (חזרה, אוטומטי, MinMax): grid-template-columns(auto-fit, minmax(<base>, 1fr))
בדוגמה השביעית הזו, משלבים כמה מהמושגים שכבר למדתם כדי ליצור פריסה רספונסיבית עם צאצאים גמישים וממוקמים באופן אוטומטי. מגניב. המונחים העיקריים שכדאי לזכור כאן הם repeat
, auto-(fit|fill)
ו-minmax()'
, שאתם זוכרים מה-RAM של ראשי התיבות.
בסך הכול, זה נראה כך:
.parent {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
אתם משתמשים שוב ב-repeat, אבל הפעם אתם משתמשים במילות המפתח auto-fit
במקום בערך מספרי מפורש. כך תוכלו להציב את רכיבי הצאצא האלה באופן אוטומטי. לרכיבי הצאצא האלה יש גם ערך מינימלי בסיס של 150px
עם ערך מקסימלי של 1fr
. כלומר, במסכים קטנים יותר, הם יתפסו את כל רוחב המסך 1fr
, וכשהם יגיעו לרוחב של 150px
כל אחד, הם יתחילו לזרום באותו קו.
עם auto-fit
, התיבות יתרחבו כשהגודל האופקי שלהן חורג מ-150 פיקסלים כדי למלא את כל השטח הנותר. עם זאת, אם משנים את הערך הזה ל-auto-fill
, התמונות לא יתרחבו אם גודל הבסיס שלהן בפונקציית minmax יחרוג מהערך:
.parent {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
08. Line Up: justify-content: space-between
בפריסת הבא, הנקודה העיקרית שרוצים להדגים היא justify-content: space-between
, שממקמת את רכיבי הצאצא הראשון והאחרון בקצוות של תיבת הגבול שלהם, והמרחב שנותר מחולק באופן שווה בין הרכיבים. הכרטיסים האלה ממוקמים במצב תצוגה Flexbox. הכיוון מוגדר לעמודה באמצעות flex-direction: column
.
כך הכותרת, התיאור ותמונת ה-block יופיעו בעמודה אנכית בתוך הכרטיס הראשי. לאחר מכן, החלת justify-content: space-between
מעגנת את הרכיבים הראשון (כותרת) והאחרון (בלוק התמונה) בקצוות של תיבת ה-flex, והטקסט התיאורי שממוקם ביניהם ממוקם עם רווח שווה בין כל נקודת קצה.
.parent {
display: flex;
flex-direction: column;
justify-content: space-between;
}
09. Clamp My Style: clamp(<min>, <actual>, <max>)
כאן נדבר על כמה טכניקות עם תמיכה פחותה יותר בדפדפנים, אבל עם השלכות מעניינות מאוד על פריסות ועל עיצוב ממשק משתמש רספונסיבי. בדוגמה הזו, מגדירים את הרוחב באמצעות clamp כך: width: clamp(<min>, <actual>, <max>)
.
כך מגדירים גודל מינימלי ומקסימלי מוחלט וגודל בפועל. עם ערכים, זה יכול להיראות כך:
.parent {
width: clamp(23ch, 60%, 46ch);
}
הגודל המינימלי הוא 23ch
או 23 יחידות תווים, והגודל המקסימלי הוא 46ch
, 46 תווים. יחידות רוחב תו מבוססות על גודל הגופן של הרכיב (במיוחד הרוחב של הגליף 0
). הגודל 'בפועל' הוא 50%, שמייצג 50% מהרוחב ההורה של הרכיב הזה.
הפונקציה clamp()
מאפשרת לרכיב הזה לשמור על רוחב של 50% עד ש-50% גדול מ-46ch
(בחלונות תצוגה רחבים יותר) או קטן מ-23ch
(בחלונות תצוגה קטנים יותר). אפשר לראות שככל שאמתח ומכווץ את גודל ההורה, הרוחב של הכרטיס הזה גדל עד לנקודה המקסימלית המוגבלת ומקטין עד לנקודה המינימלית המוגבלת. לאחר מכן היא נשארת במרכז ברמת ההורה, כי החלנו מאפיינים נוספים כדי למרכז אותה. כך אפשר ליצור פריסות שקל יותר לקרוא אותן, כי הטקסט לא יהיה רחב מדי (מעל 46ch
) או דחוס וצר מדי (פחות מ-23ch
).
זו גם דרך מצוינת להטמיע טיפוגרפיה רספונסיבית. לדוגמה, אפשר לכתוב: font-size: clamp(1.5rem, 20vw, 3rem)
. במקרה כזה, גודל הגופן של הכותרת תמיד יישאר מוצמד בין 1.5rem
ל-3rem
, אבל הוא יקטן ויצטמצם על סמך הערך בפועל 20vw
כדי להתאים לרוחב של אזור התצוגה.
זוהי טכניקה מצוינת להבטחת קריאוּת באמצעות ערך מינימלי ומקסימלי של גודל, אבל חשוב לזכור שהיא לא נתמכת בכל הדפדפנים המודרניים. לכן, חשוב לוודא שיש לכם חלופות ולבצע בדיקות.
10. שמירה על יחס הגובה-רוחב: aspect-ratio: <width> / <height>
ולבסוף, כלי הפריסה האחרון הוא הניסיוני ביותר מבין הכלים. התכונה הזו הוצגה לאחרונה ב-Chrome Canary בגרסה 84 של Chromium, ויש מאמץ פעיל מצד Firefox להטמיע אותה, אבל היא לא נמצאת כרגע בגרסאות יציבות של דפדפנים.
אבל אני רוצה לדבר על זה, כי זו בעיה נפוצה מאוד. מדובר רק בשמירה על יחס הגובה-רוחב של התמונה.
כשמשנים את הגודל של הכרטיס באמצעות המאפיין aspect-ratio
, היחס גובה-רוחב של הבלוק החזותי הירוק נשאר 16x9. אנחנו שומרים על יחס הגובה-רוחב ב-aspect-ratio: 16 / 9
.
.video {
aspect-ratio: 16 / 9;
}
כדי לשמור על יחס גובה-רוחב של 16 x 9 ללא המאפיין הזה, צריך להשתמש בפריצת padding-top
ולהזין מרווח פנימי של 56.25%
כדי להגדיר יחס גובה-רוחב מלמעלה-לרוחב. בקרוב יהיה לנו נכס לצורך כך, כדי למנוע את הפריצה ואת הצורך לחשב את האחוז. אפשר ליצור תמונה ריבועית ביחס גובה-רוחב של 1 / 1
, תמונה ביחס גובה-רוחב של 2 ל-1 ביחס 2 / 1
, ובעצם כל תמונה שרוצים שאפשר יהיה לשנות את קנה המידה שלה לפי יחס גובה-רוחב מוגדר.
.square {
aspect-ratio: 1 / 1;
}
התכונה הזו עדיין בשלבי פיתוח, אבל כדאי להכיר אותה כי היא עוזרת לפתור בעיות רבות עם מפתחים שנתקלתי בהם הרבה פעמים, במיוחד בכל מה שקשור לסרטונים ומסגרות iframe.
סיכום
תודה שהצטרפתם אלינו לנסיעה ב-10 שורות חזקות של CSS. למידע נוסף, אפשר לצפות בסרטון המלא ולנסות את הדמואים בעצמכם.