תוכן מתקפל עם details ו-summary
עטפו תוכן ב-<details> ושימו <summary> ראשון. ה-summary נשאר גלוי; כל השאר מוסתר עד שהקורא לוחץ עליו:
לחצו על השאלה כדי לפתוח אותה, ושוב כדי לסגור. הדפדפן מוסיף את סימן המשולש, הופך את ה-summary לבר מיקוד, פותח וסוגר אותו עם Enter או Space, ואומר לקוראי מסך אם הוא מורחב או מכווץ. אין כאן JavaScript בכלל.
אם משמיטים את <summary>, הדפדפן מציג במקומו תווית ברירת מחדל ("Details" באנגלית).
פתוח כברירת מחדל
המאפיין הבוליאני open מציג את התוכן מההתחלה. הדפדפן מוסיף ומסיר את open כשהקורא פותח וסוגר, כך שזה גם הוו לעיצוב:
לתיבה הפתוחה יש גבול כחול מ-details[open]. פתחו את "Returns" וגם היא תהפוך לכחולה; שתיהן יכולות להיות פתוחות בו זמנית.
אקורדיון: רק אחד פתוח בכל פעם
תנו לכמה אלמנטי <details> את אותו name והם יהפכו לקבוצה בלעדית: פתיחה של אחד סוגרת את האחרים. פעם זה דרש JavaScript, ועכשיו זה עובד עם המאפיין בלבד בגרסאות הנוכחיות של Chrome, Edge, Firefox ו-Safari:
פתחו את השאלה השנייה והראשונה תיסגר. הסירו את מאפייני name והן יחזרו להיפתח באופן עצמאי. אקורדיון בלעדי מסתיר תוכן שהקורא אולי ירצה להשוות, אז השתמשו בו כשהקטעים הם חלופות, וב-<details> רגיל כשאנשים עשויים לרצות כמה פתוחים.
עיצוב הסימן
המשולש הוא סימן רשימה על ה-summary. list-style: none מסיר אותו (הכלל ::-webkit-details-marker מטפל ב-Safari), ופסאודו אלמנט יכול לצייר סימן משלכם:
סימן הפלוס מסתובב 45 מעלות והופך לאיקס כשהקטע נפתח. השאירו סגנון מיקוד גלוי כמו ה-outline של :focus-visible כאן: ברגע שמסירים את סימן ברירת המחדל, טבעת המיקוד היא מה שמשתמשי מקלדת נשענים עליו.
האירוע toggle והמאפיין open
JavaScript יכול לקרוא ולהגדיר את details.open, והאירוע toggle נורה אחרי כל שינוי, בין אם לחיצה, מקש או סקריפט גרמו לו:
"Expand all" מגדיר open על שניהם, והיומן מציג את אירוע ה-toggle האחרון. האירוע לא מבעבע, אז האזינו על כל אלמנט <details> ולא על הורה.
מה נכנס ל-summary
summary מכיל טקסט, אלמנטים inline, או כותרת כשהכותרת של הקטע שייכת למבנה העמוד:
<details>
<summary><h3>Refund policy</h3></summary>
<p>...</p>
</details>
הימנעו מקישורים, כפתורים ושדות טופס בתוך <summary>: ה-summary כבר הוא פקד, כך שקל לפספס פקד בתוכו או ללחוץ עליו בטעות, וקוראי מסך מכריזים על פקדים מקוננים בצורה גרועה. שימו תוכן אינטראקטיבי בגוף ה-<details> במקום.
טעויות נפוצות
- בניית מתג עם
<div>ו-JavaScript.<details>כבר מטפל בלחיצות, במקשים ובמצב עבור קוראי מסך. כשבאמת צריך מתג מותאם, השתמשו בכפתור עםaria-expanded. - שימת
<summary>בכל מקום חוץ מראשון. הוא חייב להיות הילד הראשון של<details>. - הסתרת הסימן בלי תחליף. תנו לקוראים סימן כלשהו לכך שה-summary נפתח, כמו סימן הפלוס שלמעלה.
- שימוש ב-
displayכדי להסתיר את התוכן. החליפו אתopenבמקום; CSS שמכריח את התוכן להיות גלוי או מוסתר נלחם במצב של הדפדפן. - קבוצות בלעדיות לתוכן שאנשים משווים. השתמשו ב-
nameרק כשהגיוני שיהיה קטע פתוח אחד בכל פעם.
שאלות נפוצות
מה עושים details ו-summary ב-HTML?
<details> יוצר רכיב חשיפה: קטע שאפשר לפתוח ולסגור. הילד הראשון שלו, <summary>, הוא התווית שתמיד גלויה; לחיצה עליו (או Enter או Space כשהוא במיקוד) מציגה או מסתירה את כל השאר בתוך <details>.
איך גורמים לאלמנט details להיות פתוח כברירת מחדל?
הוסיפו את המאפיין הבוליאני open: <details open>. הדפדפן מוסיף ומסיר את המאפיין הזה כשהמשתמש פותח וסוגר, כך ש-CSS יכול לעצב את details[open].
איך יוצרים אקורדיון שבו רק קטע אחד פתוח?
תנו לכל <details> בקבוצה את אותו מאפיין name, למשל name="faq". פתיחה של אחד סוגרת את האחרים באותה קבוצה, בלי JavaScript.
איך מסירים או משנים את החץ ב-summary של details?
הגדירו list-style: none על summary והוסיפו summary::-webkit-details-marker { display: none; } בשביל Safari. אחר כך ציירו סימן משלכם, למשל עם summary::after, ושנו אותו עם details[open] summary::after.
אפשר לזהות מתי אלמנט details נפתח?
כן. האזינו לאירוע toggle על האלמנט <details> וקראו את המאפיין open שלו. הגדרה של details.open = true ב-JavaScript פותחת אותו.