محتوى قابل للطي بـ details وsummary
أحط المحتوى بـ <details> وضع <summary> أولًا. يبقى summary ظاهرًا، وكل ما عداه مخفي حتى ينقر عليه القارئ:
انقر السؤال لفتحه، ومرة أخرى لإغلاقه. يضيف المتصفح علامة المثلث، ويجعل summary قابلًا للتركيز، ويبدّله بـ Enter أو المسافة، ويخبر قارئات الشاشة إن كان موسَّعًا أم مطويًا. لا دخل لـ 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 درجة لتصبح علامة ضرب حين يُفتح القسم. أبقِ نمط تركيز ظاهرًا مثل إطار :focus-visible هنا: فبمجرد إزالة العلامة الافتراضية تصبح حلقة التركيز هي ما يعتمد عليه مستخدمو لوحة المفاتيح.
حدث toggle والخاصية open
تستطيع JavaScript قراءة details.open وضبطها، وحدث toggle ينطلق بعد كل تغيير، سواء سببه نقرة أو مفتاح أو سكربت:
«Expand all» تضبط open على الاثنين، ويُظهر السجل آخر حدث toggle. الحدث لا ينتشر صعودًا إلى العناصر الأب (no bubbling)، لذلك استمع على كل عنصر <details> لا على العنصر الأب.
ما الذي يوضع في summary
يحتوي summary على نص، أو عناصر سطرية، أو عنوان حين يكون عنوان القسم جزءًا من مخطط الصفحة:
<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 أو المسافة حين يكون التركيز عليه) يُظهر أو يخفي كل ما عداه داخل <details>.
كيف أجعل عنصر details مفتوحًا افتراضيًا؟
أضف السمة المنطقية open: <details open>. يضيف المتصفح هذه السمة ويزيلها حين يبدّل المستخدم الحالة، فيستطيع CSS تنسيق details[open].
كيف أصنع أكورديون لا يُفتح فيه إلا قسم واحد؟
أعطِ كل <details> في المجموعة السمة name نفسها، مثل name="faq". فتح أحدها يغلق الأخرى في تلك المجموعة، من دون JavaScript.
كيف أزيل السهم في details summary أو أغيّره؟
اضبط 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 يفتحه.