- Tarayıcının yerleşik özellikleriyle sayfanın üzerinde görünen popover UI oluşturulabilir; böylece menü, öneri ve bildirim gibi desenler daha tutarlı biçimde uygulanabilir
- Popover API’nin popover’ları her zaman modal olmayan yapıdadır; bu nedenle sayfa etkileşimini engellemesi gereken UI’lar için `` daha uygundur
- Basit aç/kapat işlemleri
popover, popovertarget, popovertargetaction gibi HTML öznitelikleri ile yapılabilir; gerekirse JavaScript metotlarıyla görünürlük durumu kontrol edilebilir
::backdrop, :popover-open, beforetoggle, toggle gibi özelliklerle stil ve durum değişimleri ele alınabilir; interest invoker özelliği ise JavaScript olmadan hover/focus gösterimini destekler
- 2025 Ocak’tan itibaren modern cihaz ve tarayıcılarda çalışan bir Baseline 2025 özelliğidir; ancak eski ortamlar ve bazı ayrıntı özellikler için uyumluluk kontrolü gerekir
Popover API’nin çözdüğü sorun
- Popover API, diğer sayfa içeriğinin üzerinde popover içeriği göstermeye yönelik standart bir mekanizma sunar
- Popover’lar yalnızca HTML öznitelikleriyle kontrol edilebilir ya da JavaScript API’si ile gösterme/gizleme durumu doğrudan yönetilebilir
- Web’de overlays, popups, popovers, dialogs gibi adlarla anılan UI desenleri, tarayıcının yerleşik yetenekleriyle daha tutarlı biçimde uygulanabilir
Modal gerekiyorsa `` kullanın
- Popover UI genel olarak modal ve modal olmayan olarak ikiye ayrılır
- Modal yapıda, popover görünürken sayfanın geri kalanıyla etkileşim kurulamaz
- Modal olmayan yapıda ise popover açıkken sayfanın geri kalanıyla etkileşim sürer
- Popover API ile oluşturulan popover’lar her zaman modal olmayan yapıdadır
- Sayfa etkileşimini engelleyen modal bir popover gerekiyorsa `` öğesi uygundur
gibi üzerine popover uygulamak da geçerlidir; böylece hem popover kontrolü hem de dialog anlambilimi birlikte kullanılabilir
Temel kullanım biçimi
- Popover API, kullanıcı etkileşimi gerektiren UI’larda sıkça kullanılabilir
- Aksiyon menüleri
- Özel toast bildirimleri
- Form öğesi önerileri
- İçerik seçicileri
- Eğitim amaçlı UI
- Yalnızca HTML ile basit bir popover aç/kapat düğmesi oluşturulabilir
Toggle the popover
Popover content
- JavaScript tarafında
HTMLElement.togglePopover() ile popover’ın gösterilme/gizlenme durumu değiştirilir
- API ayrıca popover durum değişimlerine tepki veren event’ler ve stil vermeyi kolaylaştıran CSS özellikleri de sunar
HTML öznitelikleri
interestfor
- HTML
, , öğeleri veya SVG öğesi bir interest invoker olarak tanımlanır
- Değer, hedef öğenin
id değeridir; invoker öğede interest görünür olduğunda ya da kaybolduğunda hedef öğe etkilenir
popover
- Öğeyi bir popover öğesine dönüştüren genel özniteliktir
- Değer olarak
"auto", "hint", "manual" durumlarını alabilir
popovertarget
veya öğesini bir popover kontrol düğmesine dönüştürür
- Değer, kontrol edilecek popover öğesinin ID’sidir
popovertargetaction
- Kontrol düğmesinin popover üzerinde gerçekleştireceği işlemi belirtir
- Olası değerler
"hide", "show", "toggle" şeklindedir
CSS ile görünürlük durumunu yönetme
::backdrop
- Popover öğesinin hemen arkasına yerleştirilen tam ekran sözde öğedir
- Gerekirse popover’ın arkasındaki sayfa içeriğine bulanıklık gibi efektler uygulanabilir
interest-delay, interest-delay-start, interest-delay-end
- Kullanıcının interest göstermesi ya da kaybetmesi ile tarayıcının buna tepki vermesi arasına gecikme süresi ekler
:interest-source, :interest-target
- Interest gösterildiğinde, sırasıyla invoker’a ve ilişkili hedef öğeye stil uygulanmasını sağlar
:popover-open
- Yalnızca popover öğesi görünür durumdayken eşleşen sözde sınıftır
- Açık durumdaki popover’ı stillendirmek için kullanılır
JavaScript arayüzü ve DOM genişletmeleri
InterestEvent
interest ve loseinterest event’lerinin event nesnesidir
- İlişkili interest invoker öğesine referans veren
source özelliğini içerir
ToggleEvent
- Popover öğesi görünür ve gizli durumlar arasında geçiş yaptığında oluşan event’i temsil eder
beforetoggle ve toggle event’lerinin event nesnesidir
interestForElement
- Interest invoker’ın hedeflediği öğeye ait referansı alır veya ayarlar
HTMLButtonElement, HTMLAnchorElement, HTMLAreaElement, SVGAElement üzerinde kullanılabilir
HTMLElement.popover
- Bir öğenin popover durumunu JavaScript ile alır veya ayarlar
"auto", "hint", "manual" değerlerini kullanır ve özellik algılama için de yararlıdır
- HTML genel özniteliği
popover değerini yansıtır
popoverTargetElement
HTMLButtonElement ve HTMLInputElement üzerinde, kontrol düğmesinin yönettiği popover öğesini alır veya ayarlar
- HTML
popovertarget özniteliğinin JavaScript karşılığıdır
popoverTargetAction
HTMLButtonElement ve HTMLInputElement üzerinde gerçekleştirilecek popover işlemini alır veya ayarlar
"hide", "show", "toggle" değerlerini kullanır ve popovertargetaction özniteliğini yansıtır
Metotlar ve event’ler
HTMLElement.hidePopover()
- Popover öğesini top layer’dan kaldırır ve
display: none ile gizler
HTMLElement.showPopover()
- Popover öğesini top layer’a ekleyerek gösterir
HTMLElement.togglePopover()
- Popover öğesini görünür ve gizli durumlar arasında değiştirir
beforetoggle
- Popover öğesinin durumu görünür ve gizli arasında değişmeden hemen önce tetiklenir
- Popover’ın açılmasını engellemek veya popover durumuna göre başka öğeleri güncellemek için kullanılabilir
toggle
- Popover öğesinin durumu değiştikten hemen sonra tetiklenir
interest
- Interest invoker’ın hedef öğesinde interest gösterildiğinde tetiklenir
loseinterest
- Interest invoker’ın hedef öğesinde interest kaybolduğunda tetiklenir
Örnekler ve spesifikasyon bağlantıları
1 yorum
Hacker News yorumları
Popover API, CSS Anchor Positioning de geldiğinde gerçekten büyük bir değişim yaratacak gibi görünüyor
Anchor positioning, bir öğenin sayfadaki başka bir öğeyi referans alarak konumlandırılmasını sağlıyor
Popover API ile birleştiğinde özel tooltip’ler veya context menu’ler bildirimsel olarak uygulanabiliyor ve PopperJS gibi kütüphanelere de gerek kalmıyor
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
Geçen hafta yeni Popover API ile bir şey yapıp yayımlamaya çalıştım ama tüm tarayıcılarda konumlandırma desteği yetersiz olduğu için kullanım alanı çok kısıtlı kaldı
Son eksik tarayıcı olan Firefox da anchor positioning’i zaten beta sürümüne eklemiş gibi görünüyor, o yüzden çok uzun sürmez gibi
titlebenzeri bir tooltip özelliği olmaması şaşırtıcıModal diyalog gerekiyorsa
<dialog>öğesi de varhttps://developer.mozilla.org/en-US/docs/Web/HTML/Element/di...
<details>kullanılabilirGarip şekilde,
<dialog>veya<details>’ten farklı olarak<popover>için yalnızca öznitelikle bildirimsel biropendurumu oluşturulamıyor gibi görünüyorBu eksik bir özellik gibi hissettiriyor; umarım bu kararın bir gerekçesi vardır
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/de...
Elbette yapılabilir ama hiç de önemsiz bir iş değil
Safari desteğinin gelmesi zaman aldı ama artık her yerde kullanılabiliyor
Bence etiketleri kendin birleştirmekten daha iyi
Ana işletim sisteminin pencere sistemi ile birlikte uygulanırsa bu özellik kesinlikle gerekli görünüyor
Çünkü şu an popover’lar her zaman iyi çalışmayan bir yöntemle taklit edilmek zorunda
Örneğin tarayıcının yerel
<select>bileşeni, tarayıcı penceresinin sınırlarının dışına taşabildiği için pencere tarafından kırpılma konusunda endişe etmiyor; ama Quasar gibi araç takımlarındaki gösterişli sahte select bileşenleri bunu yapamıyor, bu yüzden yerleşim seçenekleri sınırlı kalıyorDüzgün yapılacaksa win32’de her popover’ın kendi yerel
HWND’si olması, Cocoa/macOS’ta da kendiNSView’u içinde yer alması gerekir gibi duruyorTarayıcıların bunu gerçekten böyle mi uyguladığını, yoksa sadece tarayıcı penceresi içinde üstüne çiziyormuş gibi mi yaptığını merak ediyorum
Web sitelerinin belirlenmiş viewport’un dışına çizmesine izin verilirse,
alert(),confirm(),[title]gibi son derece sınırlı durumlar dışında tarayıcı ya da işletim sistemi diyaloglarını inandırıcı şekilde taklit etmek çok daha kolay hale gelirÖrneğin bir sayfa, parola yöneticisi eklentisinin kilit açma widget’ını taklit edebilir
Bu büyük bir güvenlik riski olur ve sınırlı faydasına kıyasla buna değmez
Bu teorik bir endişe değil
Dolandırıcılar yıllardır tarayıcı chrome’unu bile içeren sahte açılır pencereler gibi son derece ikna edici sahte arayüzler yapıyor ve bunları sürüklenebilir bile hale getiriyordu
Viewport sınırlarının dışına çizilememesi, onların aşamadığı neredeyse tek kısıttı
Küçük cihazlarda web tarayıcısı neredeyse her zaman tam ekranı kaplıyor; büyük monitörlerde bile genelde en az bir köşeye değmiş oluyor
Erişilebilirlik ve taranabilirlik açısından da, biri “popup engelleyici” eklenti yapmak isterse onun için de faydalı olur
Bu özellik, yalnızca tarayıcının ana sürecinde render edilen ayrıcalıklı [X]HTML içinde kullanılabilen XUL öğeleri üzerinden sunuluyor
Sanırım hiçbir tarayıcı geliştiricisi, normal web sayfalarına çerçevesiz işletim sistemi pencereleri oluşturma yetkisi vermek istemez
Bazı standart kontrollerin böyle davranması, bunların işletim sistemi yereli olarak uygulanmasından kaynaklanan işletim sistemine özgü uygulama yan etkileri; mutlaka böyle uygulanmaları gerektiği anlamına gelmiyor
Tarayıcılarda yerleşik açılır pencere engelleyicileri var; böyle bir API yapmaları biraz komik geliyor
Arada fark olduğunu biliyorum ama yine de öyle
90'ların sonu ve 2000'lerin başındaki popup/popunder savaşlarını hatırlayacak yaştayım
O savaşı kazanmış gibi görünüyoruz ama dikkatimizi kuşatan savaş daha epey sürecek
Popover, gerektiğinde bağlamsal bilgi gösteren yüzen bir öğe
Bahsedilen şey ise tamamen farklı
Popup'lar işletim sistemine çöp pencereler saçarak en kötü durumda bilgisayarı kullanmayı bile engeller
Popover diyaloğu ise sekmeyi kapatınca biter
Bu tarz popover'lar bilgi göstermek için oldukça kullanışlı, zaten uzun zamandır da kullanılıyor
Rahatsız edici şekilde kullanılabilirler ama modal'larda olduğu gibi gerçek kullanım senaryoları da çok
Zaten bugün de sıradan
divvb. ile popover yapılabiliyorÖrnek: https://getbootstrap.com/docs/5.3/components/popovers/
Değişen şey, sihirli ek kütüphaneler olmadan popover yapılabilmesi
Açık bir “popover” öğesini engelleseniz bile insanlar yine özel kütüphaneler kullanmaya devam eder
İnsanların popup'lardan nefret etmesinin nedeni, müdahaleci olmaları ve ayrı bir pencere açmaları
Bu API,
divmodal'larının yerini alarak geliştiricinin zamanını ve kodunu azaltıyorBu API o sınırı bozmuyor
O sınır bozulduğunda sistemin kullanılabilirliği ve güvenliği düşer; bu yüzden istenen yön bu değil
“Popover API ile yapılan popover her zaman non-modal'dır. Modal bir popover istiyorsanız doğru öğe
<dialog>'dur” deniyor ama nedenini anlamıyorumBu, popover'ın gayet meşru bir kullanım senaryosu
Özellikle açıldığında arka plan bulanıklaştırılıyorsa daha da öyle; bulanıklaşmış düğmeler kullanıcının yanlışlıkla tıklamasına yol açabiliyorsa bu özelliğin neden sunulduğu soru işareti
Bakınca ikisinin birleştirilebildiğini gördüm
“Popover kontrolü ile diyalog semantiğini birleştirmek istiyorsanız
<dialog>öğesini popover yapabilirsiniz” gibi bir ifade varO zaman burada
modalgibi bir öznitelik daha anlamlı olmaz mıydı diye düşünüyorumÇünkü kullanım senaryosunu açıkça kabul ediyor
<dialog>öğesinin çok daha önce var olmasıdırÇok iyi
Doğru anladıysam yeni bir özellik getirmekten çok, modal
div, maskediv, kapsayıcıdivve zahmetli konumlandırma CSS'inin gerektiği yerleri basitleştiriyorStillemeyi kolaylaştıran sözde sınıflar da ekleniyor, hoşuma gitti
Gizli checkbox'lara zorla başvurmak gerekmiyor
Stil ve animasyon içeren popover'larda JS'siz desteğin ne kadar ileri gideceğinden emin değilim ama odağın düzgün yönetildiği JS'siz destek güzel
Erişilebilirlik desteğinin de yerleşik olduğunu söylemek isterdim ama mevcut spesifikasyonda bunu bulamadım
Eğer ekran okuyucu gibi erişilebilirlik araçlarına öğeyi duyurmayı da hallediyorsa bu büyük yardım olur
Çünkü elle yaparken bunu atlamak oldukça kolay
Kesinlikle faydalı
Demo: https://mdn.github.io/dom-examples/popover-api
Çünkü Chrome ya da Firefox'ta alt menü kaybolmadan önce bir gecikme süresi uygulayan kimse yok
Onlarca yıllık kullanıcı deneyimi araştırması yok sayılmış ve sonuç neredeyse beklendiği gibi
https://mdn.github.io/dom-examples/popover-api/nested-popove...
Güzel görünüyor ama bu sayfada neden popover'ın ne olduğunu gösteren bir görsel hiç yok, anlamıyorum
https://mdn.github.io/dom-examples/popover-api/
Etkileşimli örneğe yönlendiriyorlar ama popover'ın varsayılan stili pek ilginç görünmüyor
https://mdn.github.io/dom-examples/popover-api/
Harika
Popper kullanılarak Stimulus ile yapılmış özel uygulama burada
https://github.com/tramlinehq/tramline/blob/main/app/javascr...
Diyalog için olan uygulama da burada
https://github.com/tramlinehq/tramline/blob/main/app/javascr...