The CSS Podcast - 004: The Cascade
CSS הוא ראשי תיבות של 'גיליונות סגנונות מדורגים'. המדרג הוא האלגוריתם לפתרון התנגשויות שבהן חלים כללי CSS מרובים על רכיב HTML. זו הסיבה לכך שהטקסט של הלחצן שמעוצב עם ה-CSS הבא יהיה כחול.
button {
color: red;
}
button {
color: blue;
}
אם תבינו את אלגוריתם המדרגות, תוכלו להבין איך הדפדפן פותר התנגשויות כאלה. אלגוריתם המדרגות מתחלק ל-4 שלבים נפרדים.
- מיקום וסדר של הופעה: הסדר שבו כללי ה-CSS מופיעים
- ספציפיות: אלגוריתם שקובע לאיזה סלקטור ב-CSS יש את ההתאמה החזקה ביותר
- Origin: הסדר שבו CSS מופיע ומאיפה הוא מגיע, בין אם מדובר בסגנון דפדפן, CSS מתוסף לדפדפן או את ה-CSS שכתבתם
- חשיבות: לכללי CSS מסוימים יש משקל גבוה יותר מאשר כללים אחרים, במיוחד עם כלל מסוג
!important
מיקום וסדר ההופעה
המדרג לוקח בחשבון את הסדר שבו כללי ה-CSS מופיעים ואת האופן שבו הם מופיעים בזמן החישוב של יישוב סכסוכים.
ההדגמה הישירה בתחילת השיעור הזה היא הדוגמה הישירה ביותר למיקום. יש שני כללים עם בוררים בעלי מאפיינים ספציפיים זהים, כך שהכלל האחרון שיוצהר הוא זה שזכה בהם.
סגנונות יכולים להגיע ממקורות שונים בדף HTML, כמו תג <link>
,
תג <style>
מוטמע ו-CSS מוטמע כפי שמוגדר במאפיין style
של רכיב.
אם יש <link>
שכולל CSS בחלק העליון של דף ה-HTML, אז <link>
נוסף שכולל CSS בחלק התחתון של הדף: ה-<link>
התחתון יהיה ספציפי ביותר.
אותו דבר קורה גם עם רכיבי <style>
מוטמעים.
ככל שהמודעות יהיו ספציפיות יותר, כך הן יופיעו במיקום נמוך יותר בדף.
הסדר הזה חל גם על רכיבי <style>
מוטמעים.
אם הוצהר עליהן לפני <link>
,
ל-CSS של גיליון הסגנונות המקושר תהיה את הספציפיות הגבוהה ביותר.
מאפיין style
מוטבע שיש בו הצהרה של CSS יבטל את כל שירותי ה-CSS האחרים,
ללא קשר למיקום שלו, אלא אם הוגדרה הצהרה !important
.
המיקום חל גם לפי הסדר של כלל ה-CSS.
בדוגמה הזו, לרכיב יהיה רקע סגול כי הוצהר האחרון background: purple
.
בגלל שהרקע הירוק הוצהר לפני הרקע הסגול, הדפדפן מתעלם ממנו עכשיו.
.my-element {
background: green;
background: purple;
}
האפשרות לציין שני ערכים לאותו נכס יכולה להיות דרך פשוטה ליצירת חלופות לדפדפנים שלא תומכים בערך מסוים.
בדוגמה הבאה, font-size
מוצהר פעמיים.
אם יש תמיכה ב-clamp()
בדפדפן, ההצהרה font-size
הקודמת תימחק.
אם הדפדפן לא תומך ב-clamp()
,
ההצהרה הראשונית תכובד וגודל הגופן יהיה 1.5rem
.my-element {
font-size: 1.5rem;
font-size: clamp(1.5rem, 1rem + 3vw, 2rem);
}
בדיקת ההבנה
בדקו את הידע שלכם על המפל
אם הדף שלכם מכיל את קוד ה-HTML הבא:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="/styles.css" /> </head> <body> <button>I am a button</button> <style> button { background: pink; } </style> </body> </html>
ב-styles.css
מופיע כלל ה-CSS הבא:
button { background: yellow; }
מה צבע הרקע של הלחצן?
<style>
נמצא במיקום נמוך יותר בדף מאשר התג <link>
, כך שלמרות שהספציפיות של button
זהה, המיקום של כלל הסגנון הופך אותו למנצח.
ספציפיות
ספציפיות היא אלגוריתם שקובע איזה סלקטור ב-CSS הוא הספציפי ביותר, באמצעות מערכת שקלול או ניקוד כדי לבצע את החישובים האלה. הגדרת כלל ספציפי יותר מאפשרת לכם להחיל אותו גם אם שירות CSS אחר שתואם לסלקטור מופיע מאוחר יותר ב-CSS.
בשיעור הבא נסביר איך מחושבת ספציפית, אבל חשוב לזכור כמה דברים שיעזרו לכם להימנע מיותר מדי בעיות ספציפיות.
טירגוט CSS למחלקה ברכיב מסוים יהפוך את הכלל הזה לספציפי יותר, ולכן יהיה יותר חשוב ליישם אותו, מאשר CSS שמטרגט רק את הרכיב.
המשמעות היא שב-CSS הבא,
ה-h1
ייצבע באדום על אף ששני הכללים תואמים והכלל של הבורר h1
יופיע מאוחר יותר בגיליון הסגנונות.
<h1 class="my-element">Heading</h1>
.my-element {
color: red;
}
h1 {
color: blue;
}
id
הופך את ה-CSS לספציפי עוד יותר,
כך שסגנונות שהוחלו על מזהה יבטלו את אלה המוחלים בדרכים רבות אחרות.
זו אחת הסיבות לכך שבאופן כללי לא כדאי לצרף סגנונות ל-id
.
ייתכן שיהיה קשה להחליף את הסגנון הזה בניסוח אחר.
הספציפיות היא מצטברת
כפי שתראו בשיעור הבא, כל סוג של בורר מקבל נקודות שמציינות עד כמה הוא ספציפי, הנקודות של כל הסלקטורים שהשתמשתם בהם כדי לטרגט רכיב מסוים מחברים יחד.
המשמעות היא שאם מטרגטים רכיב עם רשימת סלקטורים כמו a.my-class.another-class[href]:hover
, מקבלים משהו די קשה להחליף ב-CSS אחר.
לכן, מומלץ להקפיד שהסלקטורים יהיו פשוטים ככל האפשר, וכדי שיהיה קל יותר לעשות שימוש חוזר ב-CSS.
תוכלו להיעזר בספציפיות ככלי שעוזר לשים לב לרכיבים כשצריך, אבל תמיד כדאי ליצור מחדש רשימות בורר ארוכות וספציפיות, אם אפשר.
מקור
שירות ה-CSS שאתם כותבים הוא לא ה-CSS היחיד שמופעל בדף. הדרגה מביאה בחשבון את מקור ה-CSS. המקור הזה כולל את גיליון הסגנונות הפנימי של הדפדפן, סגנונות שנוספו על ידי תוספי הדפדפן או מערכת ההפעלה ואת ה-CSS שיצרת. הסדר של המקורות האלה, מהספציפיים ביותר ועד להכי ספציפיים, הוא:
- הסגנונות הבסיסיים של סוכני המשתמש. אלה הסגנונות שהדפדפן מחיל על רכיבי HTML כברירת מחדל.
- סגנונות של משתמשים מקומיים. הן יכולות להגיע מרמת מערכת ההפעלה, כמו גודל גופן בסיסי או העדפה לצמצום התנועה. הן יכולות להגיע גם מתוספי דפדפן, כמו תוסף לדפדפן שמאפשר למשתמש לכתוב CSS מותאם אישית לדף אינטרנט.
- CSS ישירות. שירות ה-CSS שאתם מחברים.
- פורסם בתאריך
!important
. כל!important
שמוסיפים להצהרות שכתבת. - סגנונות של משתמשים מקומיים
!important
. כל!important
שמגיע מרמת מערכת ההפעלה או מ-CSS ברמת תוסף הדפדפן. - סוכן משתמש
!important
. כל סוג של!important
שמוגדר ב-CSS כברירת המחדל, שמסופק על ידי הדפדפן.
אם יש לכם סוג כלל של !important
ב-CSS שיצרתם, ולמשתמש יש סוג כלל !important
ב-CSS המותאם אישית שלו, וה-CSS שלו זוכה?
בדיקת ההבנה
בדקו את הידע שלכם על מקורות המפלים
כדי לבדוק את הידע שלכם על מקורות של מפלים, כדאי להשתמש בכללי הסגנון הבאים ממקורות שונים:
סגנון הסוכן המשתמש
h1 { margin-block-start: 0.83em; }
אתחול
h1 { margin-block-start: 20px; }
סגנונות מחבר הדף
h1 { margin-block-start: 2ch; } @media (max-width: 480px) { h1 { margin-block-start: 1ch; } }
סגנון מותאם אישית של משתמש
h1 { margin-block-start: 2rem !important; }
לאחר מכן, בהתאם ל-HTML הבא:
<h1>Lorem ipsum</h1>
מהו הmargin-block-start
הסופי של h1
?
!important
יש את המקור הספציפי ביותר.חשיבות
לא כל כללי ה-CSS מחושבים באופן זהה זה לזה, או שניתן לזהות אותם בדיוק באותה מידת ספציפיות.
כך נראה סדר החשיבות, מהכי פחות חשוב ועד החשוב ביותר:
- סוג כלל רגיל, כמו
font-size
,background
אוcolor
- סוג כלל אחד (
animation
) - סוג כלל אחד (
!important
) (לפי אותו סדר כמו במקור) - סוג כלל אחד (
transition
)
לסוגים של כללי אנימציה והעברה פעילים יש חשיבות גבוהה יותר מכללים רגילים.
במקרה של מעברים, חשיבות גבוהה יותר מ-!important
סוגי כללים.
הסיבה לכך היא שכאשר אנימציה או מעבר הופכים לפעילים,
ההתנהגות הצפויה שלהם היא שינוי המצב החזותי.
שימוש בכלי פיתוח כדי לברר למה שירות CSS מסוים לא פועל
בדרך כלל, כלי הפיתוח לדפדפן מציגים את כל ה-CSS שיכול להתאים לרכיב מסוים, ואת אלה שלא משתמשים בהם עם קו חוצה.
אם ה-CSS שרצית להחיל לא מופיע בכלל, המשמעות היא שהוא לא תאם לרכיב. במקרה כזה, תצטרכו לחפש אותו במקום אחר, אולי בגלל שגיאת הקלדה בשם המחלקה או הרכיב או ב-CSS לא חוקי.
בדיקת ההבנה
בדקו את הידע שלכם על המפל
ניתן להשתמש בדירוג עבור...