חיפוש ]

CSS Nesting: מדריך מקיף עם דוגמאות

ניתן לומר ש- CSS Nesting הוא סוג של מהפכה באופן בו מפתחים כותבים CSS בכך שהוא מאפשר לכללי CSS לשקף ישירות את המבנה ההיררכי של HTML. לא רק שהשימוש ב CSS Nesting משפר את קריאות הקוד, אלא גם מאפשר תחזוקה פשוטה יותר של הקוד, במיוחד בפרויקטים מורכבים עם אלמנטים המקוננים עמוק.

האפשרות של קיבוץ סגנונות CSS הקשורים לוגית אחד לשני מאפשרת להפחית כפילויות ומוודאת שקוד ה CSS שלכם יהיה מאורגן בצורה לוגית. בפוסט זה אסביר כיצד להשתמש ב Native CSS Nesting, אך לפני שנצלול לדוגמאות מעשיות, חשוב להבין את הסימנים והאופרטורים הבסיסיים שמניעים את CSS Nesting.

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

הבנת סימנים בסיסיים ב- CSS Nesting

CSS Nesting כולל מספר סימנים מרכזיים הקובעים כיצד סלקטורים ומאפיינים מיושמים. הנה הסבר על סימנים אלו:

1. הסימן & (Ampersand)

הסימן & מייצג את סלקטור ההורה הנוכחי בחוקים מקוננים. הוא משמש כ- placeholder המאפשר להוסיף סלקטורים נוספים או פסאודו-מחלקות (pseudo-classes) לאותו הורה.

HTML:

<div class="container">
  <div class="child">תוכן ילד</div>
</div>

CSS Nesting:


.container {
  & .child {
    color: blue;
  }

  &:hover {
    background-color: yellow;
  }
}

CSS רגיל:


.container .child {
  color: blue;
}

.container:hover {
  background-color: yellow;
}

הסבר:

  • & .child מטרגט את האלמנטים מסוג .child בתוך .container.
  • &:hover מטרגט את מצב ה- hover של .container.

2. הסימן < (קומבינטור של ילד ישיר)

הסימן > משמש לבחירת ילדים ישירים של הסלקטור הנוכחי בלבד. באמצעות סימן זה ניתן להבטיח כי סגנונות ה CSS יחולו רק על ילדים ישירים ולא על צאצאים שלהם המקוננים עמוק יותר.

HTML:

<ul class="list">
  <li class="item">
    פריט 1
    <ul class="sub-item">
      <li>תת-פריט 1</li>
    </ul>
  </li>
</ul>

CSS Nesting:


.list {
  > .item {
    padding: 10px;

    > .sub-item {
      padding: 5px;
    }
  }
}

CSS רגיל:


.list > .item {
  padding: 10px;
}

.list > .item > .sub-item {
  padding: 5px;
}

הסבר:

  • > .item מסמן רק את .item שהם ילדים ישירים של .list.

3. פסאודו-מחלקות ופסאודו-אלמנטים

ניתן לקנן פסאודו-מחלקות (כמו :hover, :focus) ופסאודו-אלמנטים (כמו ::after, ::before) בתוך חוקי CSS כדי לעצב states או אלמנטים מסוימים. שימו לב שניתן לשלב קינון גם עם פסאודו-מחלקות מתקדמות כמו הסלקטור :has שמאפשר לבחור אלמנטים על בסיס הצאצאים שלהם.

ב ״states״ אנו מתכוונים למצבים כמו hover, focus וכדומה…

HTML:

<button class="button">לחצו כאן</button>

CSS Nesting:


.button {
  &:hover {
    background-color: green;
  }

  &::after {
    content: '✔';
    color: red;
  }
}

CSS רגיל:


.button:hover {
  background-color: green;
}

.button::after {
  content: '✔';
  color: red;
}

4. Media Queries מקוננים

ניתן לקנן Media Queries בתוך סלקטור כדי להגדיר סגנונות רספונסיביים המקובצים קונטקסטואלית.

HTML:

<div class="card">כרטיס רספונסיבי</div>

CSS Nesting:


.card {
  padding: 16px;

  @media (min-width: 768px) {
    padding: 24px;
  }
}

CSS רגיל:


.card {
  padding: 16px;
}

@media (min-width: 768px) {
  .card {
    padding: 24px;
  }
}

תחביר מרוכך – Relaxed Syntax

כאשר CSS Nesting הוצג לראשונה, הסימן & היה נדרש לפני סלקטורים של סוגי אלמנטים. המשמעות הייתה שהיה צריך לכתוב & h1 במקום סתם h1 בתוך חוק מקונן. נכון לסוף 2023, כל הדפדפנים המרכזיים תומכים ב-תחביר מרוכך (Relaxed Syntax) שמסיר הגבלה זו.

כלומר, כעת ניתן לכתוב:


.card {
  h1 {
    font-size: 1.5rem;
  }

  p {
    color: gray;
  }
}

במקום הדרישה הקודמת:


.card {
  & h1 {
    font-size: 1.5rem;
  }

  & p {
    color: gray;
  }
}

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

CSS Nesting וספציפיות

פרט חשוב שיש להבין הוא כיצד CSS Nesting משפיע על ספציפיות (Specificity). סלקטור הקינון & מחשב ספציפיות באותו אופן כמו הפסאודו-מחלקה :is() – הוא לוקח את הספציפיות הגבוהה ביותר מרשימת הסלקטורים המשויכת.

לדוגמה:


#header, .nav {
  & a {
    color: blue;
  }
}

למרות של-.nav ספציפיות של 0-1-0, החוק המקונן יורש את הספציפיות של #header (1-0-0) מכיוון שסלקטור ה-& משתמש בספציפיות הגבוהה ביותר ברשימה. הספציפיות הסופית של & a היא 1-0-1.

זכרו זאת כאשר אתם מנפים באגים של קונפליקטי ספציפיות בחוקים מקוננים.

At-Rules מקוננים נוספים

מעבר ל-@media, ניתן לקנן at-rules נוספים בתוך בלוק סלקטור. גישה זו שומרת על סגנונות קשורים מקובצים יחד:


.grid {
  display: grid;

  @supports (display: subgrid) {
    grid-template-columns: subgrid;
  }

  @container (min-width: 400px) {
    grid-template-columns: 1fr 1fr;
  }

  @layer utilities {
    &.hidden {
      display: none;
    }
  }
}

גישה זו שומרת את כל הסגנונות של .grid במקום אחד, ללא קשר אם הם תלויים בתמיכת פיצ'ר, גודל container, או שכבות cascade. לעוד at-rule שמרחיב custom properties עם טיפוסים ואנימציות חלקות, ראו את המדריך לתכונת @property ב-CSS.

טעויות נפוצות וטיפים לשימוש נכון

כאשר מתחילים לעבוד עם CSS Nesting, קל ליפול לכמה מלכודות. בואו נראה את הנפוצות שבהן:

1. קינון עמוק מדי – אחת הטעויות הנפוצות ביותר היא קינון של חוקים ברמות עומק רבות. קינון של 3-4 רמות ומעלה יוצר סלקטורים ארוכים ומורכבים שקשה לתחזק. כלל אצבע טוב הוא להגביל את עומק הקינון ל-2-3 רמות לכל היותר.

2. שכפול מיותר של הסימן & – מכיוון שהתחביר המרוכך מאפשר להשמיט את & עבור סלקטורים פשוטים של צאצאים, אין צורך להוסיף אותו בכל מקום. השתמשו ב-& רק כשאתם צריכים לצרף ישירות לסלקטור ההורה (כמו &:hover או &.active).

3. בלבול עם תחביר Sass – אם הגעתם מ-Sass, שימו לב שיש הבדלים. ב-Sass, & יכול לשמש גם ליצירת שמות סלקטורים חדשים (למשל &__element בגישת BEM), אך ב-CSS Nesting הדבר אינו אפשרי. הסימן & ב-CSS מייצג את סלקטור ההורה המלא ואינו מאפשר שרשור מחרוזות.

כיצד לזהות תמיכת דפדפנים

אם אתם צריכים לתמוך בדפדפנים ישנים שאינם תומכים ב-CSS Nesting, השתמשו ב-@supports כדי להחיל סגנונות מקוננים רק בסביבות נתמכות.

שימוש ב- supports@:


@supports selector(&) {
  .container {
    .child {
      color: red;
    }
  }
} 

@supports not selector(&) {
  .container .child {
    color: red;
  }
}

תמיכת דפדפנים

CSS Nesting נתמך בכל הדפדפנים המודרניים: Chrome 120+, Edge 120+, Firefox 117+ ו-Safari 17.2+. עם תמיכה של מעל 90% מהדפדפנים בעולם, CSS Nesting בטוח לשימוש בפרודקשן עבור רוב הפרויקטים. יש לציין כי דפדפנים ישנים יותר כמו Chrome 112-119 ו-Safari 16.5-17.1 מציעים תמיכה חלקית (ללא התחביר המרוכך). לפרטים נוספים, בקרו ב-Can I Use או תנו מבט בטבלה מטה המתעדכנת אוטומטית בתמיכת הדפדפנים:

תמיכה ב-CSS Nesting בדפדפנים שונים

שאלות נפוצות

האם אני עדיין צריך preprocessor כמו Sass אם אני משתמש ב-CSS Nesting?
עבור קינון בלבד, לא. CSS Nesting מכסה את מקרה השימוש הנפוץ ביותר שגרם למפתחים להשתמש ב-Sass. עם זאת, Sass עדיין מציע פיצ'רים כמו משתנים עם לוגיקה, mixins, לולאות ופונקציות שלא קיימים ב-CSS. אם השתמשתם ב-Sass רק עבור קינון, סביר שתוכלו לוותר עליו.
האם הסימן & נדרש ב-CSS Nesting?
לא. מאז עדכון התחביר המרוכך (סוף 2023), הסימן & הוא אופציונלי עבור סלקטורים פשוטים של צאצאים. ניתן לכתוב .card { h1 { ... } } ישירות. הסימן & עדיין נדרש כשמוסיפים לסלקטור ההורה (למשל &.active, &:hover) או כשממקמים את ההורה במיקום לא ברירת מחדל (למשל .dark &).
כיצד CSS Nesting משפיע על ספציפיות?
סלקטור הקינון & מחשב ספציפיות באותו אופן כמו הפסאודו-מחלקה :is(). הוא משתמש בערך הספציפיות הגבוה ביותר מרשימת סלקטורי ההורה. כלומר, אם חוק ההורה כולל סלקטור ID לצד סלקטור מחלקה, החוק המקונן יורש את הספציפיות ברמת ה-ID גם כשהמחלקה היא זו שמתאימה.
האם ניתן לקנן media queries בתוך סלקטור?
כן. ניתן לקנן @media, @supports, @container, @layer ו-at-rules נוספים ישירות בתוך בלוק סלקטור. גישה זו שומרת על סגנונות רספונסיביים ומותנים מקובצים עם הרכיב שאליו הם שייכים, ומשפרת קריאות ותחזוקה.
האם CSS Nesting בטוח לשימוש בפרודקשן?
כן. CSS Nesting נתמך ב-Chrome 120+, Edge 120+, Firefox 117+ ו-Safari 17.2+, המכסים מעל 90% משימוש הדפדפנים בעולם. אם אתם צריכים לתמוך בדפדפנים ישנים מאוד, ניתן להשתמש ב-@supports selector(&) לזיהוי תמיכה או בתוסף PostCSS כפתרון חלופי.
מה ההבדל בין CSS Nesting לבין קינון ב-Sass?
התחביר דומה, אך יש הבדלים חשובים. ב-Sass ניתן להשתמש ב-& לשרשור מחרוזות (למשל &__element בגישת BEM), אך ב-CSS Nesting הדבר אינו אפשרי. בנוסף, חישוב הספציפיות ב-CSS Nesting מתבצע באמצעות :is(), מה שעלול להוביל לספציפיות גבוהה יותר מהצפוי. מבחינת ביצועים, CSS Nesting הוא native בדפדפן ואינו דורש שלב קומפילציה.

לסיכום

CSS Nesting מאפשר למפתחים לכתוב סגנונות אינטואיטיביים יותר ולשמור על מבנה CSS מקביל למבנה ה- HTML. הבנת הסימנים המרכזיים והימנעות מטעויות נפוצות יאפשרו לכם לנצל את הפוטנציאל המלא של הכלי… עד כאן. מקווה שלמדתם משהו חדש, שאלות והערות יתקבלו בברכה בתגובות הפוסט.

דיון ותגובות
0 תגובות  ]
  • אנונימית 25 נובמבר 2024, 11:19

    מרתק, לא ידעתי שקיים כזה דבר בCSS, ולכן מעדיפה להשתמש בSCSS שבה האפשרות קיימת built in.
    תודה על הפוסט!

השאירו תגובה

הוסיפו קוד באמצעות הכפתורים מטה. למשל, בכדי להוסיף PHP לחצו על הכפתור PHP והוסיפו את הקוד בתוך השורטקוד. מצאתם שגיאה בפוסט? עדכנו אותנו...

Savvy WordPress Development official logo