חיפוש ]

על התכונה supports@ ב CSS, כיצד להשתמש בה נכון?

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

אך ישנו פיצ׳ר הקיים ב CSS שנים רבות המאפשר לנו לבדוק אם הדפדפן תומך בתכונה מסויימת לפני שאנו מוסיפים תכונונת CSS כלשהן, ממש בדומה לשימוש ב @media לטובת עיצוב ריספונסיבי – בו אם רוחב הדפדפן קטן יותר מרוחב ספציפי תכונות ה CSS המצויינות באותו media query ייכנסו לפעולה.

באותה מידה, ה CSS הקיים בפיצ׳ר זה ייכנס לפעולה אך ורק אם אותו דפדפן תומך באותה תכונה אותה אתם מציינים. שם הפיצ׳ר עליו אני מדבר נקרא @supports ונראה בצורה הבאה:

@supports (display: grid) {

   /* code that will only run if CSS Grid is supported by the browser.  */
   /* for example:  */

  .container {
    display: grid;
  }
}

כנראה ולא תשתמשו רבות בתכונה @supports מכיוון ול CSS ישנה עתודה (fallback) טבעית כך שבמידה והדפדפן אינו מזהה קומבינציה כלשהי של property : value, הוא יתעלם מתכונה זו וישתמש בתכונה אותה הוא מזהה המוגדרת למעלה בשרשרת.

שימוש או ירושה של תכונה הנמצאית מעלה בשרשרת נקרא Cascading.

אך למרות הנאמר לתכונה @supports קיימים לא מעט שימושים. בואו נראה כמה מהם:

/* Here we gonna write the fallback as you'll see in a minute */

@supports (display: grid) {
    .container {
        display: grid;
        grid-template-columns: 1fr 1fr;
        grid-gap: 2rem;
    }
}

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

אז במקרים אלו (אם לא נציין אחרת) ניתן פשוט לאפשר לדפדפן להשתמש בברירת המחדל כך שאותם אלמנטים בקונטיינר יקבלו את התכונה display : block ויופיעו אחד מתחת לשני.

אך בהרבה מצבים זה אינו מספק – נאמר גלריה כלשהי של תמונות. במצבים אלו כנראה ויהיה נכון להשתמש בעתודה שעובדת על Flex כברירת מחדל, ובמידה והדפדפן תומך ב CSS Grid להשתמש באותו Grid – זה נראה משהו בסגנון הבא:

.container {
    display: flex;
    flex-wrap: wrap;
}

.container > div {
    flex: 200px;
    margin: 1rem;
}

@supports (display: grid) {
    .container {
        display: grid;
        grid-template-columns: 1fr 1fr;
        grid-gap: 2rem;
    }

    .container > div {
        margin: 0;
    }
}

שימוש באופרטור not בתכונה supports@

ישנה גם האפשרות להשתמש בלוגיקה "not" עבור התכונה @supports וזה נראה כך:

/* Considered a BAD PRACTICE, at least if you're supporting IE 11 and iOS 8 and older */
@supports not (display: grid) {
    /* Isolated code for non-support of grid */
}
@supports (display: grid) {
    /* Isolated code for support of grid */
}

שימו לב לאופרטור not בו השתמשנו. במקרה זה האופרטור יבדוק ויישם CSS כלשהו רק במידה ואין תמיכה ב CSS Grid. אך אין זה אומר כי בהכרח תרצו להשתמש באפשרות זו והסיבה לכך היא שישנם דפדפנים שאינם תומכים בתכונה @supports עצמה ועליכם לקחת זו בחשבון…

מספר שימושים לתכונה supports@

הנה מספר שימושים נוספים לתכונה @supports, לדוגמה תמיכה בתכונה mix-blend-mode:

.thing {
  opacity: 0.5;
}
    
@supports (mix-blend-mode: multiply) {
  .thing {
    mix-blend-mode: multiply;
    opacity: 0.75;
  }
}

דוגמה נוספת היא תמיכה בתכונה initial-letters שנועדה עבור Drop Caps:

@supports (initial-letter: 4) or (-webkit-initial-letter: 4) {
  p::first-letter {
     -webkit-initial-letter: 4;
     initial-letter: 4;
  }
}

תמיכת דפדפנים בתכונה supports@

התכונה @supports עובדת בכרום, פיירפוקס ואופרה מאז 2013 האמת. היא נתמכת בגירסאות Edge למינהן. סאפרי השיקה תמיכה בשנת 2015:

Data on support for the css-supports-api feature across the major browsers from caniuse.com

מידע נוסף על תמיכת דפדפנים בתכונה תמצאו https://caniuse.com.

בזאת סיימנו, האם אתם משתמשים בתכונה זו בפרוייקטים שלכם? אם כן שתפו אותנו בתגובות וספרו לנו כיצד…. 🙂

Further Reading:

רועי יוסף
רועי יוסף

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

0 תגובות...

תגובה חדשה

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