- ब्राउज़र की मूल सुविधाओं से ही पेज के ऊपर दिखने वाला पॉपओवर UI बनाया जा सकता है, जिससे menu, suggestion और notification जैसे पैटर्न को अधिक consistent तरीके से लागू किया जा सकता है
- Popover API के पॉपओवर हमेशा non-modal होते हैं, इसलिए जिस UI में पेज interaction को रोकना हो, उसके लिए `` अधिक उपयुक्त है
- सरल toggle को
popover, popovertarget, popovertargetaction जैसे HTML attributes से संभाला जाता है, और जरूरत पड़ने पर JavaScript methods से display state को control किया जाता है
::backdrop, :popover-open, beforetoggle, toggle आदि से style और state changes को संभाला जा सकता है, और interest invokers hover/focus पर display को JavaScript के बिना support करते हैं
- यह जनवरी 2025 से modern devices और browsers पर काम करने वाली Baseline 2025 feature है, लेकिन पुराने environments या कुछ detailed features की compatibility जांचना जरूरी है
Popover API जिन समस्याओं को हल करता है
- Popover API दूसरे page content के ऊपर popover content दिखाने के लिए एक standard mechanism देता है
- पॉपओवर को केवल HTML attributes से control किया जा सकता है, और JavaScript API से show/hide state को सीधे manage भी किया जा सकता है
- web पर overlays, popups, popovers, dialogs आदि कहे जाने वाले UI patterns को browser की built-in capability से अधिक consistent तरीके से लागू किया जा सकता है
modal चाहिए तो `` का उपयोग करें
- पॉपओवर UI को मोटे तौर पर modal और non-modal में बांटा जाता है
- modal में popover दिखने के दौरान बाकी page से interact नहीं किया जा सकता
- non-modal में popover खुले होने पर भी बाकी page से interact जारी रखा जा सकता है
- Popover API से बनाए गए पॉपओवर हमेशा non-modal होते हैं
- अगर page interaction को रोकने वाला modal popover चाहिए, तो `` element उपयुक्त है
की तरह पर popover apply करने का तरीका भी valid है, और इससे popover control और dialog semantics साथ में इस्तेमाल किए जा सकते हैं
बुनियादी उपयोग का तरीका
- Popover API अक्सर ऐसे UI में इस्तेमाल हो सकता है जिनमें user interaction चाहिए
- action menu
- custom toast notification
- form element suggestions
- content selector
- educational UI
- सिर्फ HTML से एक सरल popover toggle button बनाया जा सकता है
Toggle the popover
Popover content
- JavaScript में
HTMLElement.togglePopover() से popover की show/hide state toggle की जाती है
- API popover state changes पर react करने वाले events और styling में मदद करने वाली CSS features भी साथ में देता है
HTML attributes
interestfor
- HTML
, , elements या SVG element को interest invoker के रूप में define करता है
- value target element का
id होती है, और invoker element पर interest दिखने या गायब होने पर target element प्रभावित होता है
popover
- element को popover element में बदलने वाला global attribute है
- value के रूप में
"auto", "hint", "manual" states ले सकता है
popovertarget
या element को popover control button बनाता है
- value उस popover element की ID होती है जिसे control करना है
popovertargetaction
- control button popover पर कौन-सा action करेगा, यह specify करता है
- संभव values
"hide", "show", "toggle" हैं
CSS से display state संभालना
::backdrop
- popover element के ठीक पीछे रखा जाने वाला full-screen pseudo-element है
- जरूरत होने पर popover के पीछे के page content पर blur जैसा effect दे सकता है
interest-delay, interest-delay-start, interest-delay-end
- user द्वारा interest दिखाने या खोने के समय और browser के respond करने के समय के बीच delay जोड़ते हैं
:interest-source, :interest-target
- interest दिखे हुए state में invoker और उससे जुड़े target element पर क्रमशः style apply कर सकते हैं
:popover-open
- यह pseudo-class केवल तब match होती है जब popover element display में हो
- open state वाले popover को style करने में इस्तेमाल होती है
JavaScript interfaces और DOM extensions
InterestEvent
interest और loseinterest events का event object है
- इससे जुड़े interest invoker element का reference रखने वाली
source property शामिल होती है
ToggleEvent
- popover element के show state और hide state के बीच switch होने पर होने वाले event को represent करता है
beforetoggle और toggle events का event object है
interestForElement
- interest invoker जिस element को target बनाता है, उसका reference get या set करता है
HTMLButtonElement, HTMLAnchorElement, HTMLAreaElement, SVGAElement में इस्तेमाल किया जा सकता है
HTMLElement.popover
- JavaScript से element की popover state get या set करता है
"auto", "hint", "manual" values का उपयोग करता है और feature detection में भी काम आता है
- HTML global attribute
popover की value को reflect करता है
popoverTargetElement
HTMLButtonElement और HTMLInputElement में control button जिस popover element को control करता है, उसे get या set करता है
- यह HTML
popovertarget attribute की JavaScript counterpart functionality है
popoverTargetAction
HTMLButtonElement और HTMLInputElement में किया जाने वाला popover action get या set करता है
"hide", "show", "toggle" values का उपयोग करता है और popovertargetaction attribute को reflect करता है
methods और events
HTMLElement.hidePopover()
- popover element को top layer से हटाकर
display: none से style करता है और hide करता है
HTMLElement.showPopover()
- popover element को top layer में add करके display करता है
HTMLElement.togglePopover()
- popover element को show state और hide state के बीच toggle करता है
beforetoggle
- popover element की state show और hide के बीच बदलने से ठीक पहले होता है
- popover opening को रोकने या popover state के अनुसार दूसरे elements update करने के लिए इस्तेमाल किया जा सकता है
toggle
- popover element की state बदलने के तुरंत बाद होता है
interest
- interest invoker के target element पर interest दिखने पर होता है
loseinterest
- interest invoker के target element से interest गायब होने पर होता है
examples और specification links
1 टिप्पणियां
Hacker News की राय
Popover API में अगर CSS Anchor Positioning भी आ जाए, तो यह सच में बड़ा बदलाव ला सकता है
Anchor Positioning किसी एलिमेंट को पेज के किसी दूसरे एलिमेंट के आधार पर place करने देता है
Popover API के साथ मिलाने पर custom tooltip या context menu को declarative तरीके से implement किया जा सकता है, और PopperJS जैसी libraries की जरूरत भी नहीं रहेगी
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
पिछले हफ्ते नए Popover API से कुछ बनाकर deploy करने की कोशिश की थी, लेकिन सभी browsers में positioning support की कमी के कारण use cases काफी सीमित हो गए
लगता है आखिरी browser Firefox भी beta में Anchor Positioning ला चुका है, इसलिए अब ज्यादा समय नहीं लगेगा
titleजैसा कोई tooltip attribute नहीं है, यह हैरानी की बात हैअगर modal dialog चाहिए, तो
<dialog>element भी हैhttps://developer.mozilla.org/en-US/docs/Web/HTML/Element/di...
<details>इस्तेमाल किया जा सकता हैअजीब बात है कि
<dialog>या<details>के उलट,<popover>में सिर्फ attribute से declarative तरीके सेopenstate बनाना संभव नहीं लगतायह missing feature जैसा लगता है, और उम्मीद है कि इस फैसले के पीछे कोई वजह रही होगी
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/de...
यह पूरी तरह संभव तो है, लेकिन बिल्कुल भी trivial काम नहीं है
Safari support आने में समय लगा था, लेकिन अब इसे हर जगह इस्तेमाल किया जा सकता है
मुझे लगता है यह खुद tags जोड़कर बनाने से बेहतर है
अगर यह host operating system के window system के साथ implement हो, तो यह feature निश्चित रूप से जरूरी लगता है
क्योंकि अभी popovers की नकल ऐसे तरीकों से करनी पड़ती है जो हमेशा सही काम नहीं करते
उदाहरण के लिए browser-native
<select>browser window की boundary से बाहर तक extend हो सकता है, इसलिए window से कटने की चिंता नहीं करनी पड़ती, लेकिन Quasar जैसे toolkit का fancy fake select ऐसा नहीं कर सकता, जिससे placement options सीमित हो जाते हैंसही तरीके से करने के लिए win32 पर हर popover का अपना native
HWNDहोना चाहिए, और Cocoa/macOS पर शायद अपनेNSViewके अंदर होना चाहिएजानना चाहूंगा कि browsers अभी सच में ऐसा implement करते हैं या बस browser window के अंदर overlay draw करते हैं
अगर websites को तय viewport के बाहर draw करने की अनुमति दी जाए, तो
alert(),confirm(),[title]जैसे बेहद सीमित मामलों को छोड़कर browser या operating system dialogs की विश्वसनीय नकल करना बहुत आसान हो जाएगाउदाहरण के लिए page किसी password manager extension के unlock widget की नकल कर सकता है
यह बड़ा security risk है, और सीमित लाभ की तुलना में इसके लायक नहीं लगता
यह सिर्फ theoretical चिंता नहीं है
scammers सालों से browser chrome तक शामिल करने वाली fake popup windows जैसी बेहद विश्वसनीय fake UI बनाते रहे हैं, और उन्हें drag भी किया जा सकता था
viewport boundary के बाहर draw न कर पाना लगभग इकलौती सीमा थी जिसे वे bypass नहीं कर पाए थे
छोटे devices पर web browser लगभग हमेशा पूरी screen ढकता है, और बड़े monitors पर भी आमतौर पर कम से कम एक corner को touch कर रहा होता है
accessibility और crawlability के लिए भी, और जब कोई “popup blocker” plugin बनाना चाहे तब भी उपयोगी होगा
यह feature XUL elements के जरिए expose होता है, जिन्हें केवल browser main process में render होने वाले privileged [X]HTML में इस्तेमाल किया जा सकता है
मुझे नहीं लगता कोई browser developer सामान्य web pages को borderless operating-system windows बनाने की permission देना चाहेगा
कुछ standard controls का ऐसा behave करना इसलिए है क्योंकि वे operating-system-native रूप में implement किए गए हैं, और यह OS-specific implementation side effect है; इन्हें जरूरी नहीं कि इसी तरह implement किया जाए
ब्राउज़र में built-in popup blocker होते हैं, और ऐसे में इस तरह की API बनाना थोड़ा मज़ाकिया लगता है
पता है कि इनमें फर्क है, फिर भी बात वही है
90s के आखिर और 2000s की शुरुआत के popup/popunder wars याद रखने लायक उम्र हो गई है
लगता है वह लड़ाई हमने जीत ली, लेकिन हमारे ध्यान को लेकर युद्ध अभी बहुत लंबा बाकी है
popover एक floating element है जो ज़रूरत पड़ने पर contextual जानकारी दिखाता है
आपने जो कहा वह पूरी तरह अलग चीज़ है
popup OS में कचरा windows फैला देते हैं और सबसे खराब हालत में कंप्यूटर इस्तेमाल करने में ही बाधा बनते हैं
popover dialog तो tab बंद करते ही खत्म हो जाता है
इस style के popover जानकारी दिखाने में काफी उपयोगी हैं और हम इन्हें बहुत पहले से इस्तेमाल करते आए हैं
इन्हें परेशान करने वाले तरीके से इस्तेमाल किया जा सकता है, लेकिन modal की तरह इनके भी कई वास्तविक use cases हैं
अभी भी मौजूदा
divआदि से popover implement किए जा सकते हैंउदाहरण: https://getbootstrap.com/docs/5.3/components/popovers/
फर्क बस यह है कि किसी जादुई extra library के बिना popover implement किए जा सकेंगे
explicit “popover” element को रोक भी दें, तो लोग custom libraries इस्तेमाल करते ही रहेंगे
लोग popup से इसलिए नफरत करते हैं क्योंकि वे intrusive होते हैं और उनकी अलग window होती है
यह API
divmodal की जगह लेकर developer का समय और code कम करती हैयह API उस सीमा को नहीं तोड़ती
अगर वह सीमा टूटे तो system की usability और safety घटती है, इसलिए वह दिशा वांछित नहीं है
कहा गया है, “Popover API से बने popover हमेशा non-modal होते हैं। अगर modal popover बनाना चाहते हैं तो
<dialog>element सही है”, लेकिन समझ नहीं आता क्योंयह popover का वैध use case है
खासकर तब जब खुलने पर background को blur किया जाए; और अगर blurred buttons पर user की गलती से click हो सकती है, तो समझ नहीं आता यह function क्यों दिया गया है
देखने पर पता चला कि दोनों को combine किया जा सकता है
मतलब, “अगर popover control और dialog semantics को मिलाना चाहते हैं, तो
<dialog>element को popover बनाया जा सकता है” जैसा कुछतो यहाँ
modalजैसी attribute ज़्यादा समझदारी वाली नहीं लगती?क्योंकि use case को साफ तौर पर मान्यता दी जा रही है
<dialog>काफी पहले से मौजूद थाबहुत अच्छा
अगर मैंने सही समझा है, तो यह कोई नया feature introduce करने से ज़्यादा उन हिस्सों को सरल बनाता है जहाँ modal
div, maskdiv, containerdiv, और असुविधाजनक positioning CSS की ज़रूरत पड़ती थीstyling आसान करने वाली pseudo-classes भी जुड़ रही हैं, अच्छा लगा
hidden checkbox को जबरन इस्तेमाल करने की जरूरत नहीं
styling और animation वाले popover तक JS के बिना कितनी दूर जाया जा सकेगा, पता नहीं, लेकिन focus handling ठीक से करने वाला no-JS support अच्छा है
कहना चाहूंगा कि accessibility support भी built-in है, लेकिन मौजूदा spec में नहीं मिला
अगर यह screen reader जैसे accessibility tools को element के बारे में बताने तक संभालता है, तो बहुत मदद मिलेगी
क्योंकि manually करते समय इसे छोड़ देना काफी आसान है
निश्चित रूप से उपयोगी है
Demo: https://mdn.github.io/dom-examples/popover-api
क्योंकि Chrome या Firefox में submenu गायब होने से पहले delay time implement करने वाला कोई नहीं है
दशकों की user experience research गायब हो गई, और लगभग उम्मीद के मुताबिक ही
https://mdn.github.io/dom-examples/popover-api/nested-popove...
अच्छा दिखता है, लेकिन इस page में popover क्या होता है यह दिखाने वाली image एक भी क्यों नहीं है, समझ नहीं आता
https://mdn.github.io/dom-examples/popover-api/
interactive example की ओर link है, लेकिन popover की default style बहुत दिलचस्प नहीं लगती
https://mdn.github.io/dom-examples/popover-api/
शानदार
Popper का इस्तेमाल करके Stimulus में बनाया गया custom implementation यहाँ है
https://github.com/tramlinehq/tramline/blob/main/app/javascr...
और dialog के लिए implementation यहाँ है
https://github.com/tramlinehq/tramline/blob/main/app/javascr...