יצירת התראות קופצות

התראות קופצות הן הודעות סטטוס זמניות. בניגוד לתפריטים, הן לא אמורות להיסגר כשהמשתמש מבצע אינטראקציה עם חלקים אחרים בדף. המצב popover="manual" הוא אידיאלי כי אין בו התנהגות של "סגירה בלחיצה מחוץ לאלמנט" והוא מאפשר לכמה התראות להתקיים בו-זמנית.

הנחיות להטמעה

  • חובה: משתמשים ב-popover="manual" כדי שההתראה תישאר גלויה עד שסוגרים אותה באופן מפורש או עד שנגמר הזמן שהוקצב לה על ידי סקריפט.
  • מומלץ להשתמש בקונטיינר כדי לנהל את הערימה של כמה הודעות קצרות. מכיוון שחלונות קופצים בשכבה העליונה מתעלמים מ-z-index של ההורה, צריך למקם אותם בנפרד או בתוך קבוצת פריסה משותפת.
  • מומלץ להשתמש ב-sibling-index()‎ כדי להוסיף שוליים בין התראות קופצות, כך שפריטים שנמצאים נמוך יותר בערימה יהיו גלויים.
  • כן כדאי להוסיף כפתור "סגירה" מפורש בתוך ההודעה הקצרה באמצעות popovertargetaction="hide".
  • מומלץ להשתמש ב-JavaScript לטיימרים של סגירה אוטומטית (למשל, קריאה ל-hidePopover()‎ אחרי 3,000 אלפיות השנייה).
  • מומלץ להשתמש ב-transition-behavior: allow-discrete כדי להוסיף אנימציה לכניסה לשכבה העליונה וליציאה ממנה.

שיטות חלופיות

תמיכה בדפדפנים וחלופות ל-Popover

‫Popover API הוא בעיקר שיפור הדרגתי (progressive enhancement), אבל להתנהגויות שמגדירות אותו – קידום לשכבה העליונה, סגירה בלחיצה מחוץ לאלמנט והפעלה של popovertarget – אין מקבילה ב-CSS בלבד. בדפדפנים ישנים יותר צריך להשתמש ב-polyfill, או להגדיר חלופה ידנית אם אתם מעדיפים לא להשתמש ב-polyfill.

Polyfill: כדי לתמוך במאפיין popover בדפדפנים ישנים יותר, צריך לטעון את @oddbird/popover-polyfill באופן מותנה. חובה: צריך לזהות את התכונה על ידי בדיקת המאפיין popover ב-HTMLElement.prototype, ולטעון את ה-polyfill רק כשאין תמיכה מקומית – אל תטענו אותו ללא תנאי.

עם bundler או מפת ייבוא:

// MANDATORY: Feature detect 'popover' on HTMLElement.prototype.
if (!("popover" in HTMLElement.prototype)) {
  import("@oddbird/popover-polyfill");
}

בלי כלי לאריזת קוד, מייבאים מ-CDN בתוך <script type="module">:

<script type="module">
  if (!("popover" in HTMLElement.prototype)) {
    import("https://unpkg.com/@oddbird/popover-polyfill@latest/dist/popover.min.js");
  }
</script>

אזהרה לגבי סגנון: ה-polyfill לא יכול להגדיר את המחלקה המדומה :popover-open, אז הוא מחיל במקום זאת מחלקה .\:popover-open. חובה: צריך לשלב את שניהם עם :is() או :where(), אחרת דפדפנים שאין בהם :popover-open יתעלמו מהכלל כולו:

[popover]:is(:popover-open, .\:popover-open) {
  display: block;
}

לחלופין, כדי להשתמש ב-fallback מדור קודם בלי polyfill, אפשר להשתמש ב-position: fixed ולחשב קואורדינטות באופן ידני באמצעות getBoundingClientRect() או להסתמך על מיקום ברירת המחדל עם inset: auto אם זה מתאים לתרחיש לדוגמה.

‎sibling-index()‎

  • הנחיה: אם אין תמיכה ב-sibling-index()‎, צריך להשתמש באופרטור + כדי להוסיף שוליים באופן ידני. כלומר, popover + popover { margin-top: 1rem }

anchor-positioning

  • הנחיה: השתמשו ב-CSS Anchor Positioning Polyfill. כדי להגדיר חלופה ללא polyfill, מגדירים את ההסבר הקצר כברירת מחדל למיקום קבוע בתחתית אזור התצוגה באמצעות @supports not (anchor-name: --foo).

transition-behavior

  • הנחיה: אם אין תמיכה ב-transition-behavior, צריך להשתמש ב-JavaScript כדי להוסיף אנימציה באמצעות מחלקות כשרכיב ההתראה הקופצת נכנס ויוצא.