Konten buka tutup dengan details dan summary
Bungkus konten dengan <details> dan taruh <summary> di urutan pertama. Summary tetap terlihat; semua yang lain tersembunyi sampai pembaca mengkliknya:
Klik pertanyaannya untuk membukanya, lalu klik lagi untuk menutupnya. Browser menambahkan penanda segitiga, membuat summary bisa difokus, membuka dan menutupnya dengan Enter atau Space, dan memberi tahu screen reader apakah bagian itu sedang terbuka atau tertutup. Tidak ada JavaScript yang terlibat.
Kalau kamu tidak menulis <summary>, browser menampilkan label default ("Details" dalam bahasa Inggris).
Terbuka secara default
Atribut boolean open menampilkan kontennya sejak awal. Browser menambahkan dan menghapus open saat pembaca membuka dan menutupnya, jadi atribut ini juga menjadi pegangan untuk styling:
Kotak yang terbuka punya border biru dari details[open]. Buka "Returns" dan kotak itu juga menjadi biru; keduanya bisa terbuka bersamaan.
Accordion: hanya satu yang terbuka
Beri beberapa elemen <details> name yang sama dan semuanya menjadi grup eksklusif: membuka satu akan menutup yang lain. Dulu hal ini butuh JavaScript, sekarang cukup dengan atribut itu saja di Chrome, Edge, Firefox, dan Safari versi saat ini:
Buka pertanyaan kedua dan pertanyaan pertama tertutup. Hapus atribut name dan semuanya kembali terbuka secara terpisah. Accordion eksklusif menyembunyikan konten yang mungkin ingin dibandingkan pembaca, jadi pakai saat bagian-bagiannya adalah alternatif, dan pakai <details> biasa saat orang mungkin ingin membuka beberapa bagian.
Memberi gaya penanda
Segitiga itu adalah penanda list di summary. list-style: none menghapusnya (aturan ::-webkit-details-marker menangani Safari), dan pseudo-element bisa menggambar penanda sendiri:
Tanda plus berputar 45 derajat menjadi silang saat bagiannya terbuka. Pertahankan gaya fokus yang terlihat seperti outline :focus-visible di sini: setelah kamu menghapus penanda default, cincin fokus itulah yang diandalkan pengguna keyboard.
Event toggle dan property open
JavaScript bisa membaca dan mengatur details.open, dan event toggle dipicu setelah setiap perubahan, entah disebabkan klik, tombol keyboard, atau script:
"Expand all" mengatur open di keduanya, dan log menampilkan event toggle terakhir. Event ini tidak bubble, jadi dengarkan di setiap elemen <details>, bukan di elemen induknya.
Apa yang ditaruh di summary
Summary berisi teks, elemen inline, atau heading saat judul bagian itu termasuk dalam kerangka halaman:
<details>
<summary><h3>Refund policy</h3></summary>
<p>...</p>
</details>
Hindari link, tombol, dan field form di dalam <summary>: summary sudah merupakan kontrol, jadi kontrol di dalamnya mudah terlewat atau tidak sengaja tertekan, dan screen reader mengumumkan kontrol bersarang dengan buruk. Taruh konten interaktif di badan <details>.
Kesalahan umum
- Membuat toggle dengan
<div>dan JavaScript.<details>sudah menangani klik, tombol keyboard, dan status untuk screen reader. Saat kamu memang butuh toggle buatan sendiri, pakai button denganaria-expanded. - Menaruh
<summary>di mana pun selain urutan pertama. Summary harus menjadi anak pertama<details>. - Menyembunyikan penanda tanpa pengganti. Beri pembaca tanda bahwa summary bisa dibuka, seperti tanda plus di atas.
- Memakai
displayuntuk menyembunyikan konten. Ubahopen; CSS yang memaksa konten terlihat atau tersembunyi bertentangan dengan status browser. - Grup eksklusif untuk konten yang dibandingkan orang. Pakai
namehanya saat masuk akal membuka satu bagian dalam satu waktu.
Pertanyaan yang sering diajukan
Apa fungsi details dan summary di HTML?
<details> membuat widget pengungkap: sebuah bagian yang bisa dibuka dan ditutup. Elemen anak pertamanya, <summary>, adalah label yang selalu terlihat; mengkliknya (atau menekan Enter atau Space saat summary sedang difokus) menampilkan atau menyembunyikan semua isi lain di dalam <details>.
Bagaimana cara membuat elemen details terbuka secara default?
Tambahkan atribut boolean open: <details open>. Browser menambahkan dan menghapus atribut itu saat pengguna membuka dan menutupnya, jadi CSS bisa memberi gaya pada details[open].
Bagaimana cara membuat accordion yang hanya membuka satu bagian?
Beri setiap <details> di grup itu atribut name yang sama, misalnya name="faq". Membuka satu bagian akan menutup bagian lain di grup itu, tanpa JavaScript.
Bagaimana cara menghapus atau mengganti tanda panah di summary?
Atur list-style: none di summary dan tambahkan summary::-webkit-details-marker { display: none; } untuk Safari. Lalu gambar penanda sendiri, misalnya dengan summary::after, dan ubah dengan details[open] summary::after.
Bisakah aku mendeteksi saat elemen details terbuka?
Bisa. Dengarkan event toggle di elemen <details> lalu baca property open-nya. Mengatur details.open = true di JavaScript akan membukanya.