- Dapat membuat UI popover yang muncul di atas halaman hanya dengan fitur bawaan browser, sehingga pola seperti menu, saran, dan notifikasi bisa diimplementasikan dengan lebih konsisten
- Popover dari Popover API selalu non-modal, jadi untuk UI yang perlu memblokir interaksi halaman, `` lebih cocok
- Toggle sederhana ditangani dengan atribut HTML seperti
popover, popovertarget, dan popovertargetaction; jika perlu, status tampilnya dapat dikontrol dengan metode JavaScript
- Perubahan gaya dan status dapat ditangani dengan
::backdrop, :popover-open, beforetoggle, toggle, dan lainnya; interest invokers mendukung tampilan saat hover/focus tanpa JavaScript
- Ini adalah fitur Baseline 2025 yang berjalan di perangkat dan browser terbaru sejak Januari 2025, tetapi kompatibilitas untuk lingkungan lama atau beberapa fitur detail tetap perlu diperiksa
Masalah yang Diselesaikan Popover API
- Popover API menyediakan mekanisme standar untuk menampilkan konten popover di atas konten halaman lain
- Popover dapat dikontrol hanya dengan atribut HTML, atau status tampil/sembunyinya dapat ditangani langsung dengan JavaScript API
- Pola UI yang di web sering disebut overlays, popups, popovers, dialogs, dan sebagainya dapat diimplementasikan lebih konsisten dengan fitur bawaan browser
Jika Memerlukan Modal, Gunakan ``
- UI popover secara umum dibagi menjadi modal dan non-modal
- Modal tidak memungkinkan interaksi dengan bagian halaman lainnya selama popover ditampilkan
- Non-modal tetap memungkinkan interaksi dengan bagian halaman lainnya meskipun popover sedang muncul
- Popover yang dibuat dengan Popover API selalu non-modal
- Jika membutuhkan popover modal yang memblokir interaksi halaman, elemen `` lebih cocok
- Cara menerapkan
popover pada seperti juga valid, dan memungkinkan penggunaan kontrol popover bersama semantik dialog
Cara Penggunaan Dasar
- Popover API sering dapat digunakan untuk UI yang membutuhkan interaksi pengguna
- Menu aksi
- Notifikasi toast kustom
- Saran elemen form
- Pemilih konten
- UI edukasi
- Tombol toggle popover sederhana dapat dibuat hanya dengan HTML
Toggle the popover
Popover content
- Di JavaScript,
HTMLElement.togglePopover() mengalihkan status tampil/sembunyi popover
- API ini juga menyediakan event yang merespons perubahan status popover dan fitur CSS yang membantu styling
Atribut HTML
interestfor
- Mendefinisikan elemen HTML
, , atau elemen SVG sebagai interest invoker
- Nilainya adalah
id elemen target, dan elemen target akan terpengaruh ketika interest ditampilkan atau hilang dari elemen invoker
popover
- Atribut global yang mengubah elemen menjadi elemen popover
- Dapat menerima status
"auto", "hint", "manual" sebagai nilai
popovertarget
- Menjadikan elemen
atau sebagai tombol kontrol popover
- Nilainya adalah ID elemen popover yang akan dikontrol
popovertargetaction
- Menentukan tindakan yang akan dilakukan tombol kontrol terhadap popover
- Nilai yang mungkin adalah
"hide", "show", "toggle"
Menangani Status Tampilan dengan CSS
::backdrop
- Pseudo-element layar penuh yang ditempatkan tepat di belakang elemen popover
- Jika perlu, dapat memberi efek seperti blur pada konten halaman di belakang popover
interest-delay, interest-delay-start, interest-delay-end
- Menambahkan waktu tunda antara saat pengguna menunjukkan atau kehilangan interest dan saat browser bereaksi
:interest-source, :interest-target
- Saat interest ditampilkan, gaya dapat diterapkan masing-masing pada invoker dan elemen target yang terhubung dengannya
:popover-open
- Pseudo-class yang hanya cocok ketika elemen popover sedang ditampilkan
- Digunakan untuk styling popover dalam status terbuka
Antarmuka JavaScript dan Ekstensi DOM
InterestEvent
- Objek event untuk event
interest dan loseinterest
- Mencakup properti
source yang berisi referensi ke elemen interest invoker yang terhubung
ToggleEvent
- Merepresentasikan event yang terjadi ketika elemen popover beralih antara status tampil dan sembunyi
- Objek event untuk event
beforetoggle dan toggle
interestForElement
- Mengambil atau mengatur referensi elemen yang menjadi target interest invoker
- Dapat digunakan pada
HTMLButtonElement, HTMLAnchorElement, HTMLAreaElement, SVGAElement
HTMLElement.popover
- Mengambil atau mengatur status popover elemen dengan JavaScript
- Menggunakan nilai
"auto", "hint", "manual", dan juga dimanfaatkan untuk deteksi fitur
- Mencerminkan nilai atribut global HTML
popover
popoverTargetElement
- Pada
HTMLButtonElement dan HTMLInputElement, mengambil atau mengatur elemen popover yang dikontrol oleh tombol kontrol
- Merupakan padanan JavaScript untuk atribut HTML
popovertarget
popoverTargetAction
- Pada
HTMLButtonElement dan HTMLInputElement, mengambil atau mengatur tindakan popover yang akan dilakukan
- Menggunakan nilai
"hide", "show", "toggle" dan mencerminkan atribut popovertargetaction
Metode dan Event
HTMLElement.hidePopover()
- Menghapus elemen popover dari top layer dan menyembunyikannya dengan styling
display: none
HTMLElement.showPopover()
- Menambahkan elemen popover ke top layer untuk menampilkannya
HTMLElement.togglePopover()
- Mengalihkan elemen popover antara status tampil dan sembunyi
beforetoggle
- Terjadi tepat sebelum status elemen popover berubah antara tampil dan sembunyi
- Dapat digunakan untuk mencegah popover dibuka, atau memperbarui elemen lain sesuai status popover
toggle
- Terjadi tepat setelah status elemen popover berubah
interest
- Terjadi ketika interest ditampilkan pada elemen target milik interest invoker
loseinterest
- Terjadi ketika interest menghilang dari elemen target milik interest invoker
Contoh dan Tautan Spesifikasi
1 komentar
Komentar di Hacker News
Popover API tampaknya akan membawa perubahan yang sangat besar begitu CSS Anchor Positioning ikut hadir
Anchor positioning memungkinkan elemen ditempatkan relatif terhadap elemen lain di halaman
Jika digabungkan dengan Popover API, tooltip kustom atau menu konteks bisa diimplementasikan secara deklaratif, dan library seperti PopperJS pun tidak lagi diperlukan
https://developer.chrome.com/blog/tether-elements-to-each-ot...
https://popper.js.org/docs/v2/
https://developer.chrome.com/blog/anchor-positioning-api
https://caniuse.com/css-anchor-positioning
Minggu lalu saya mencoba membuat dan merilis sesuatu dengan Popover API baru, tetapi kurangnya dukungan positioning di semua browser membuat use case-nya sangat terbatas
Firefox sebagai browser terakhir tampaknya sudah memasukkan anchor positioning di versi beta, jadi sepertinya tidak akan lama lagi
titleKalau membutuhkan dialog modal, ada juga elemen
<dialog>https://developer.mozilla.org/en-US/docs/Web/HTML/Element/di...
<details>juga bisa dipakaiAnehnya, tidak seperti
<dialog>atau<details>,<popover>tampaknya tidak bisa dibuat dalam keadaanopensecara deklaratif hanya dengan atributRasanya seperti fitur yang hilang, dan semoga keputusan ini punya dasar yang jelas
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/de...
Memang sepenuhnya memungkinkan, tetapi sama sekali bukan pekerjaan sepele
Dukungan Safari memang butuh waktu, tetapi sekarang sudah bisa dipakai di mana-mana
Menurut saya ini lebih baik daripada merangkai tag sendiri
Jika diimplementasikan bersama sistem jendela milik sistem operasi host, fitur ini jelas tampak diperlukan
Sebab saat ini popover selalu harus ditiru dengan cara yang tidak selalu bekerja baik
Misalnya
<select>native browser bisa melebar melewati batas jendela browser, sehingga tidak perlu khawatir terpotong oleh jendela, tetapi select palsu yang mewah dari toolkit seperti Quasar tidak bisa begitu, sehingga pilihan penempatannya terbatasUntuk melakukannya dengan benar, di win32 setiap popover tampaknya harus memiliki
HWNDnative-nya sendiri, dan di Cocoa/macOS harus berada di dalamNSViewtersendiriSaya penasaran apakah browser saat ini benar-benar mengimplementasikannya seperti ini, atau hanya menggambarnya di dalam jendela browser
Jika situs web diizinkan menggambar di luar viewport yang ditentukan, selain kasus yang sangat terbatas seperti
alert(),confirm(), dan[title], akan jauh lebih mudah meniru dialog browser atau sistem operasi secara meyakinkanMisalnya, sebuah halaman bisa meniru widget unlock dari ekstensi password manager
Ini risiko keamanan besar, dan menurut saya tidak sepadan dibanding manfaatnya yang terbatas
Ini bukan kekhawatiran teoretis
Selama bertahun-tahun, penipu telah membuat UI palsu yang sangat meyakinkan, termasuk jendela popup palsu lengkap dengan chrome browser, bahkan bisa diseret
Fakta bahwa mereka tidak bisa menggambar di luar batas viewport adalah hampir satu-satunya batasan yang belum bisa mereka lewati
Di perangkat kecil, browser web hampir selalu memenuhi seluruh layar, dan bahkan di monitor besar biasanya setidaknya menyentuh salah satu sudut
Begitu juga untuk aksesibilitas dan crawlability, serta berguna jika seseorang ingin membuat plugin “pemblokir popup”
Fitur ini diekspos melalui elemen XUL yang hanya bisa dipakai oleh [X]HTML berhak istimewa yang dirender di proses utama browser
Sepertinya tidak ada pengembang browser yang ingin memberi halaman web biasa izin untuk membuat jendela sistem operasi tanpa border
Fakta bahwa beberapa kontrol standar berperilaku seperti itu adalah efek samping implementasi spesifik OS karena diimplementasikan secara native oleh sistem operasi, dan tidak berarti harus selalu diimplementasikan begitu
Browser memiliki pemblokir popup bawaan, jadi agak lucu juga mereka membuat API seperti ini
Saya tahu ada perbedaannya, tapi tetap saja
Saya sudah cukup tua untuk mengingat perang popup/popunder pada akhir 90-an dan awal 2000-an
Sepertinya pertempuran itu sudah dimenangkan, tetapi perang memperebutkan perhatian kita masih jauh dari selesai
Popover adalah elemen mengambang yang menampilkan informasi kontekstual saat dibutuhkan
Yang disebutkan itu sesuatu yang sama sekali berbeda
Popup menyebarkan jendela sampah ke sistem operasi dan, dalam kasus terburuk, mengganggu penggunaan komputer itu sendiri
Dialog popover selesai begitu tab ditutup
Popover gaya seperti ini cukup berguna untuk menampilkan informasi, dan sudah lama digunakan
Memang bisa dipakai dengan menyebalkan, tetapi seperti modal, ada banyak use case nyata juga
Sekarang pun popover bisa diimplementasikan dengan
divyang ada, dan sebagainyaContoh: https://getbootstrap.com/docs/5.3/components/popovers/
Yang berubah adalah popover bisa diimplementasikan tanpa library tambahan yang seperti sulap
Memblokir elemen “popover” yang eksplisit pun orang-orang hanya akan terus memakai library kustom
Orang membenci popup karena intrusif dan punya jendela terpisah
API ini menggantikan modal
div, sehingga mengurangi waktu dan kode developerAPI ini tidak melanggar batas tersebut
Jika batas itu dilanggar, kegunaan dan keamanan sistem menurun, jadi itu arah yang tidak diinginkan
Katanya “popover yang dibuat dengan Popover API selalu non-modal. Jika ingin membuat popover modal, elemen
<dialog>adalah pilihan yang tepat”, tetapi saya tidak tahu kenapa begituIni adalah use case yang sah untuk popover
Apalagi jika latar belakang dibuat blur saat terbuka; jika tombol yang diburamkan masih bisa tidak sengaja diklik pengguna, saya jadi bertanya-tanya kenapa fitur itu disediakan
Setelah dicari, ternyata keduanya bisa digabungkan
Kurang lebih “jika ingin menggabungkan kontrol popover dan semantik dialog, elemen
<dialog>bisa dijadikan popover”Kalau begitu, rasanya atribut seperti
modallebih masuk akal di siniKarena use case-nya jelas diakui
<dialog>sudah ada jauh lebih duluSangat bagus
Kalau saya memahaminya dengan benar, ini bukan memperkenalkan fitur baru, melainkan menyederhanakan bagian yang sebelumnya membutuhkan modal
div, maskdiv, containerdiv, dan CSS positioning yang merepotkanPseudo-class yang memudahkan styling juga ditambahkan, saya suka
Tidak perlu memaksa memakai checkbox tersembunyi
Saya tidak tahu sejauh apa popover dengan styling dan animasi bisa berjalan tanpa JS, tetapi dukungan tanpa JS dengan penanganan fokus yang benar itu bagus
Saya ingin mengatakan dukungan aksesibilitas juga sudah bawaan, tetapi saya tidak bisa menemukannya di spesifikasi saat ini
Jika sampai menangani pemberitahuan elemen ke alat aksesibilitas seperti screen reader, itu akan sangat membantu
Karena saat melakukannya manual, hal seperti itu cukup mudah terlewat
Jelas berguna
Demo: https://mdn.github.io/dom-examples/popover-api
Karena belum ada yang mengimplementasikan delay sebelum submenu menghilang di Chrome maupun Firefox
Puluhan tahun riset pengalaman pengguna hilang, dan itu hampir sesuai dugaan
https://mdn.github.io/dom-examples/popover-api/nested-popove...
Terlihat keren, tetapi saya tidak mengerti kenapa halaman ini sama sekali tidak punya gambar yang menunjukkan apa itu popover
https://mdn.github.io/dom-examples/popover-api/
Memang menautkan ke contoh interaktif, tetapi gaya default popover tidak terlihat terlalu menarik
https://mdn.github.io/dom-examples/popover-api/
Luar biasa
Implementasi kustom yang dibuat dengan Stimulus menggunakan Popper ada di sini
https://github.com/tramlinehq/tramline/blob/main/app/javascr...
Dan implementasi untuk dialog ada di sini
https://github.com/tramlinehq/tramline/blob/main/app/javascr...