- Se puede crear una UI de popover que aparece sobre la página usando solo funciones nativas del navegador, lo que permite implementar patrones como menús, sugerencias y notificaciones de forma más consistente
- Los popovers de la Popover API siempre son no modales, por lo que para interfaces que deben bloquear la interacción con la página es más adecuado ``
- Los toggles simples se manejan con atributos HTML como
popover, popovertarget y popovertargetaction, y, si hace falta, el estado de visualización se controla con métodos de JavaScript
- Con
::backdrop, :popover-open, beforetoggle, toggle, etc., se pueden manejar estilos y cambios de estado, y los interest invokers admiten visualización por hover/focus sin JavaScript
- Es una función Baseline 2025 que funciona en dispositivos y navegadores modernos desde enero de 2025, pero es necesario verificar la compatibilidad en entornos antiguos o con algunas funciones específicas
Qué problema resuelve la Popover API
- La Popover API proporciona un mecanismo estándar para mostrar contenido de popover sobre otro contenido de la página
- Los popovers pueden controlarse solo con atributos HTML, o bien se puede manejar directamente su estado de mostrar/ocultar con la API de JavaScript
- Permite implementar de forma más consistente, con funciones nativas del navegador, patrones de UI que en la web se conocían como overlays, popups, popovers, dialogs, etc.
Si necesitas un modal, usa ``
- Las interfaces de popover se dividen principalmente en modales y no modales
- En un modal, no se puede interactuar con el resto de la página mientras el popover está visible
- En uno no modal, se puede seguir interactuando con el resto de la página aunque el popover esté abierto
- Los popovers creados con la Popover API siempre son no modales
- Si necesitas un popover modal que bloquee la interacción con la página, el elemento `` es el adecuado
- También es válido aplicar
popover a como en, lo que permite usar a la vez el control de popover y la semántica de dialog
Uso básico
- La Popover API puede usarse con frecuencia en interfaces que requieren interacción del usuario
- Menús de acciones
- Notificaciones toast personalizadas
- Sugerencias en elementos de formulario
- Selectores de contenido
- UI educativa
- Con solo HTML se puede crear un botón simple para alternar un popover
Toggle the popover
Popover content
- En JavaScript,
HTMLElement.togglePopover() alterna el estado de mostrar/ocultar del popover
- La API también ofrece eventos para reaccionar a los cambios de estado del popover y funciones CSS que ayudan con el estilizado
Atributos HTML
interestfor
- Define elementos HTML
, , o un elemento SVG como interest invoker
- El valor es el
id del elemento de destino, y ese elemento se ve afectado cuando aparece o desaparece el interest en el elemento invoker
popover
- Es un atributo global que convierte un elemento en un elemento popover
- Puede recibir como valor los estados
"auto", "hint" o "manual"
popovertarget
- Convierte un elemento
o en un botón de control del popover
- El valor es el ID del elemento popover que se controlará
popovertargetaction
- Especifica la acción que el botón de control realizará sobre el popover
- Los valores posibles son
"hide", "show" y "toggle"
Manejar el estado de visualización con CSS
::backdrop
- Es un pseudoelemento de pantalla completa ubicado justo detrás del elemento popover
- Si hace falta, puede aplicar efectos como desenfoque al contenido de la página detrás del popover
interest-delay, interest-delay-start, interest-delay-end
- Agregan un tiempo de retraso entre el momento en que el usuario muestra o pierde el interest y el momento en que el navegador reacciona
:interest-source, :interest-target
- Permiten aplicar estilos, respectivamente, al invoker y al elemento de destino vinculado mientras el interest está visible
:popover-open
- Es una pseudoclase que solo coincide cuando el elemento popover está visible
- Se usa para estilizar el popover en estado abierto
Interfaces de JavaScript y extensiones del DOM
InterestEvent
- Es el objeto de evento de los eventos
interest y loseinterest
- Incluye la propiedad
source, que contiene una referencia al elemento interest invoker vinculado
ToggleEvent
- Representa el evento que se dispara cuando un elemento popover alterna entre los estados visible y oculto
- Es el objeto de evento de los eventos
beforetoggle y toggle
interestForElement
- Obtiene o establece la referencia al elemento que el interest invoker tiene como destino
- Puede usarse en
HTMLButtonElement, HTMLAnchorElement, HTMLAreaElement y SVGAElement
HTMLElement.popover
- Obtiene o establece mediante JavaScript el estado popover de un elemento
- Usa los valores
"auto", "hint" y "manual", y también se utiliza para detección de funciones
- Refleja el valor del atributo global HTML
popover
popoverTargetElement
- En
HTMLButtonElement y HTMLInputElement, obtiene o establece el elemento popover que controla el botón de control
- Es la contraparte en JavaScript del atributo HTML
popovertarget
popoverTargetAction
- En
HTMLButtonElement y HTMLInputElement, obtiene o establece la acción de popover que se realizará
- Usa los valores
"hide", "show" y "toggle", y refleja el atributo popovertargetaction
Métodos y eventos
HTMLElement.hidePopover()
- Elimina el elemento popover del top layer y lo oculta aplicándole estilo
display: none
HTMLElement.showPopover()
- Muestra el elemento popover agregándolo al top layer
HTMLElement.togglePopover()
- Alterna el elemento popover entre los estados visible y oculto
beforetoggle
- Se dispara justo antes de que el estado del elemento popover cambie entre visible y oculto
- Puede usarse para impedir que el popover se abra o para actualizar otros elementos según el estado del popover
toggle
- Se dispara justo después de que cambia el estado del elemento popover
interest
- Se dispara cuando aparece el interest en el elemento de destino del interest invoker
loseinterest
- Se dispara cuando desaparece el interest en el elemento de destino del interest invoker
Ejemplos y enlaces a especificaciones
- Popover API examples: colección de ejemplos de la Popover API
- interest invoker examples: colección de ejemplos de interest invokers
- Las especificaciones relacionadas están incluidas en las secciones popover,
beforetoggle y toggle de la especificación HTML
1 comentarios
Opiniones en Hacker News
La Popover API parece que va a generar un cambio enorme cuando también llegue CSS Anchor Positioning (posicionamiento con anclas en CSS).
El posicionamiento con anclas permite colocar un elemento en relación con otro elemento de la página.
Combinado con la Popover API, permite implementar de forma declarativa tooltips personalizados o menús contextuales, y ya no harían falta bibliotecas como PopperJS.
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
La semana pasada intenté crear y desplegar algo con la nueva Popover API, pero la falta de soporte de posicionamiento en todos los navegadores limitó mucho los casos de uso.
Parece que Firefox, el último navegador que faltaba, ya incorporó el posicionamiento con anclas en la beta, así que no debería tardar demasiado.
title.Si necesitas un cuadro de diálogo modal, también existe el elemento
<dialog>.https://developer.mozilla.org/en-US/docs/Web/HTML/Element/di...
<details>.Curiosamente, a diferencia de
<dialog>o<details>, parece que<popover>no puede ponerse en estadoopende forma declarativa solo con un atributo.Se siente como una función faltante, y espero que haya habido una razón para esa decisión.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/de...
Es totalmente posible, pero de ninguna manera es algo trivial.
El soporte en Safari tardó, pero ahora se puede usar en todas partes.
Me parece mejor que armarlo combinando etiquetas manualmente.
Si se implementa junto con el sistema de ventanas del sistema operativo anfitrión, esta funcionalidad claramente parece necesaria.
Esto se debe a que, hoy, los popovers siempre tienen que imitarse de formas que no funcionan bien.
Por ejemplo, un
<select>nativo del navegador puede extenderse más allá de los límites de la ventana del navegador, así que no tienes que preocuparte de que quede recortado por la ventana; en cambio, un select falso y vistoso de un toolkit como Quasar no puede hacerlo, por lo que sus opciones de posicionamiento quedan limitadas.Para hacerlo bien, en win32 cada popover debería tener su propio
HWNDnativo, y en Cocoa/macOS parece que debería estar dentro de su propioNSView.Me pregunto si los navegadores actuales realmente lo implementan así, o si simplemente lo dibujan encima dentro de la ventana del navegador.
Si se permitiera que un sitio web dibuje fuera del viewport asignado, salvo casos muy limitados como
alert(),confirm()y[title], sería mucho más fácil imitar de forma convincente diálogos del navegador o del sistema operativo.Por ejemplo, una página podría imitar el widget de desbloqueo de una extensión de gestor de contraseñas.
Eso es un gran riesgo de seguridad, y no creo que valga la pena frente a los beneficios limitados.
No es una preocupación teórica.
Durante años, los estafadores han creado interfaces falsas muy convincentes, incluidas ventanas emergentes falsas con el chrome del navegador, e incluso se podían arrastrar.
La imposibilidad de dibujar fuera de los límites del viewport era casi la única restricción que no habían podido esquivar.
En dispositivos pequeños, el navegador web casi siempre cubre toda la pantalla, y aun en monitores grandes normalmente toca al menos una esquina.
Eso también ayuda a la accesibilidad y a la capacidad de rastreo, y sería útil si alguien quisiera crear un plugin de “bloquear popups”.
Esta función se expone mediante elementos XUL que solo pueden usarse en [X]HTML privilegiado renderizado por el proceso principal del navegador.
No creo que ningún desarrollador de navegadores quiera dar a páginas web normales el permiso de crear ventanas del sistema operativo sin bordes.
Que algunos controles estándar se comporten así es un efecto secundario de implementación específico de cada OS, porque están implementados de forma nativa en el sistema operativo, y no es obligatorio implementarlos de esa manera.
Los navegadores tienen bloqueadores de pop-ups integrados, así que resulta un poco gracioso que creen una API como esta
Sé que hay una diferencia, pero aun así
Tengo edad suficiente para recordar las guerras de pop-ups/pop-unders de fines de los 90 y principios de los 2000
Creo que ganamos esa batalla, pero la guerra por nuestra atención todavía tiene mucho camino por delante
Un popover es un elemento flotante que muestra información contextual cuando hace falta
Lo que mencionas es algo completamente distinto
Los pop-ups llenan el sistema operativo de ventanas basura y, en el peor de los casos, impiden usar la computadora
Un cuadro de diálogo popover se termina cerrando la pestaña
Este estilo de popover es bastante útil para mostrar información y se viene usando desde hace mucho
Puede usarse de forma molesta, pero como los modales, también tiene muchos casos de uso reales
Hoy también se pueden implementar popovers con
divexistentes, etc.Ej.: https://getbootstrap.com/docs/5.3/components/popovers/
Lo que cambia es que se pueden implementar popovers sin una biblioteca adicional medio mágica
Aunque bloquees un elemento explícito “popover”, la gente seguirá usando bibliotecas personalizadas
La gente odia los pop-ups porque son intrusivos y tienen una ventana separada
Esta API reemplaza los modales con
divy reduce el tiempo y código de los desarrolladoresEsta API no rompe ese límite
Si ese límite se rompe, la usabilidad y la seguridad del sistema empeoran, así que no es el camino deseado
Dicen: “Los popovers creados con la Popover API siempre son no modales. Si quieres crear un popover modal, el elemento
<dialog>es lo correcto”, pero no entiendo por quéEste es un caso de uso válido para los popovers
Sobre todo si al abrirse se difumina el fondo; y si un botón difuminado puede terminar recibiendo un clic accidental del usuario, me pregunto por qué ofrecen esa función
Al buscarlo, vi que se pueden combinar ambos
Algo como: “Si quieres combinar el control de popover con la semántica de diálogo, puedes convertir un elemento
<dialog>en popover”Entonces me parece que aquí tendría más sentido un atributo como
modalPorque están reconociendo claramente el caso de uso
<dialog>existe desde mucho antesMuy bueno
Si lo entendí bien, más que introducir una función nueva, parece simplificar lo que antes requería un
divmodal, undivde máscara, undivcontenedor y CSS incómodo para posicionamientoTambién se agregan pseudoclases que facilitan el styling, me gusta
No hace falta forzar el uso de un checkbox oculto
No sé hasta dónde se podrá llegar sin JS con popovers con styling y animaciones, pero es bueno tener soporte sin JS con manejo correcto del foco
Quisiera decir que el soporte de accesibilidad también viene incorporado, pero no lo encuentro en la especificación actual
Si también se encargara de anunciar el elemento a herramientas de accesibilidad como lectores de pantalla, sería de gran ayuda
Porque al hacerlo manualmente es bastante fácil olvidarlo
Definitivamente es útil
Demo: https://mdn.github.io/dom-examples/popover-api
Porque nadie implementó en Chrome ni Firefox el tiempo de espera antes de que desaparezca el submenú
Décadas de investigación en experiencia de usuario desaparecieron y, casi como era de esperarse
https://mdn.github.io/dom-examples/popover-api/nested-popove...
Se ve genial, pero no entiendo por qué esta página no tiene ni una imagen que muestre qué es un popover
https://mdn.github.io/dom-examples/popover-api/
Aunque enlaza a ejemplos interactivos, el estilo básico del popover no se ve demasiado interesante
https://mdn.github.io/dom-examples/popover-api/
Excelente
Una implementación personalizada hecha con Stimulus usando Popper está aquí
https://github.com/tramlinehq/tramline/blob/main/app/javascr...
Y la implementación para diálogos está aquí
https://github.com/tramlinehq/tramline/blob/main/app/javascr...