Os popovers estão em toda parte na web. Eles aparecem em menus, dicas de ferramentas e caixas de diálogo, que podem ser exibidos como configurações da conta, widgets de divulgação e visualizações de cards de produtos. Apesar da prevalência desses componentes, criá-los em navegadores ainda é surpreendentemente complicado. É necessário adicionar scripts para gerenciar o foco, os estados de abertura e fechamento, ganchos acessíveis nos componentes, vinculações de teclado para entrar e sair da experiência. Tudo isso antes mesmo de começar a criar a funcionalidade útil, exclusiva e principal do seu pop-up.
Para resolver esse problema, um novo conjunto de APIs HTML declarativas para criar pop-ups está chegando aos navegadores, começando com a API popover
no Chromium 114.
Atributo pop-over
Em vez de gerenciar toda a complexidade por conta própria, você pode deixar que o navegador cuide dela com o atributo popover
e o conjunto de recursos seguintes. Os pop-ups HTML são compatíveis com:
- Promoção para a camada superior. Os pop-ups vão aparecer em uma camada separada acima do restante da página, para que você não precise mexer no índice z.
- Funcionalidade de dispensa simples. Clicar fora da área do pop-up fecha o pop-up e retorna o foco.
- Gerenciamento de foco padrão. Abrir o pop-over faz a próxima guia parar dentro dele.
- Vinculação de teclado acessível. Pressionar a tecla
esc
fecha o pop-over e retorna o foco. - Vinculação de componentes acessível. Conexão semântica de um elemento de pop-up a um gatilho de pop-up.
Agora você pode criar pop-ups com todos esses recursos sem usar o JavaScript. Um pop-over básico requer três coisas:
- Um atributo
popover
no elemento que contém o popover. - Uma
id
no elemento que contém o pop-up. - Um
popovertarget
com o valor doid
do pop-up no elemento que abre o pop-up.
<button popovertarget="my-popover"> Open Popover </button>
<div id="my-popover" popover>
<p>I am a popover with more information.</p>
</div>
Agora você tem um pop-over básico totalmente funcional.
Esse pop-up pode ser usado para transmitir informações adicionais ou como um widget de exibição.
Padrões e substituições
Por padrão, como no snippet de código anterior, configurar um pop-up com um popovertarget
significa que o botão ou elemento que abre o pop-up vai alternar entre aberto e fechado. No entanto, também é possível criar pop-ups explícitos usando popovertargetaction
. Isso substitui a ação padrão alternar. As opções de popovertargetaction
incluem:
popovertargetaction="show"
: mostra o popover.
popovertargetaction="hide"
: oculta o pop-over.
Usando popovertargetaction="hide"
, é possível criar um botão "Fechar" em um pop-over, como no snippet a seguir:
<button popovertarget="my-popover" popovertargetaction="hide">
<span aria-hidden="true">❌</span>
<span class="sr-only">Close</span>
</button>
Popovers automáticos x manuais
O uso do atributo popover
sozinho é um atalho para popover="auto"
. Quando aberto, o popover
padrão forçará o fechamento de outros pop-ups automáticos, exceto os ancestrais. Ele pode ser dispensado com a dispensa de luz ou um botão de fechamento.
Por outro lado, definir popover=manual
cria outro tipo de pop-up: um pop-up manual. Eles não forçam o fechamento de nenhum outro tipo de elemento e não são fechados com a dispensa de iluminação. Você precisa fechá-los por meio de um timer ou uma ação de fechamento explícita. Os tipos de pop-over adequados para popover=manual
são elementos que aparecem e desaparecem, mas não afetam o restante da página, como uma notificação de aviso.
Se você conferir a demonstração acima, vai perceber que clicar fora da área do pop-up não o dispensa. Além disso, se houver outros pop-ups abertos, eles não fecharão.
Para analisar as diferenças:
Pop-ups com popover=auto
:
- Quando aberto, feche outros pop-up à força.
- Pode ser dispensado.
Pop-ups com popover=manual
:
- Não force o fechamento de nenhum outro tipo de elemento.
- Não dispensar a luz. Feche-as usando uma ação de alternar ou fechar.
Como definir o estilo dos pop-ups
Até agora, você aprendeu sobre popovers básicos em HTML. Mas o popover
também tem alguns recursos de estilo interessantes. Uma delas é a capacidade de definir o estilo de ::backdrop
.
Nos pop-ups auto
, essa é uma camada diretamente abaixo da camada superior (onde o pop-up fica), que fica acima do restante da página. No exemplo a seguir, ::backdrop
recebe uma cor semitransparente:
#size-guide::backdrop {
background: rgb(190 190 190 / 50%);
}
A diferença entre um popover
e um dialog
É importante observar que o atributo popover
não fornece semântica por conta própria. Embora agora seja possível criar experiências semelhantes a caixas de diálogo com popover="auto"
, há algumas diferenças importantes entre as duas:
Um elemento dialog
aberto com dialog.showModal
(uma caixa de diálogo modal) é uma experiência que exige interação explícita do usuário para fechar a caixa modal.
Um popover
oferece suporte à dispensa leve. Um modal dialog
não faz isso.
Uma caixa de diálogo modal torna o restante da página inerte. Um popover
não.
A demonstração acima é uma caixa de diálogo semântica com comportamento de pop-up. Isso significa que o restante da página não fica inerte e que o pop-up da caixa de diálogo recebe um comportamento de dispensa de luz. Crie essa caixa de diálogo com o comportamento de pop-over usando o seguinte código:
<button popovertarget="candle-01">
Quick Shop
</button>
<dialog popover id="candle-01">
<button class="close-btn" popovertarget="candle-01" popovertargetaction="hide">...</button>
<div class="product-preview-container">
...
</div>
</dialog>
Em breve
Entrada e saída interativas
A capacidade de animar propriedades discretas, incluindo animação de e para display: none
e animação de e para a camada superior, ainda não está disponível em navegadores. No entanto, eles estão planejados para uma versão futura do Chromium, logo após este lançamento.
Com a capacidade de animar propriedades discretas e usando :popover-open
e @starting-style
, você poderá configurar estilos antes e depois da mudança para permitir transições suaves ao abrir e fechar pop-ups. Veja o exemplo anterior. A animação de entrada e saída fica muito mais suave e oferece uma experiência do usuário mais fluida:
Posicionamento de âncora
Os pop-ups são ótimos quando você quer posicionar um alerta, modal ou notificação com base na janela de visualização. No entanto, os pop-overs também são úteis para menus, dicas de ferramenta e outros elementos que precisam ser posicionados em relação a outros elementos. É aí que entra a ancoragem CSS.
A demonstração de menu radial a seguir usa a API de popover com o posicionamento de âncora do CSS para garantir que o #menu-items
do popover seja sempre ancorado ao gatilho de alternância, o botão #menu-toggle
.
A configuração de âncoras é semelhante à configuração de pop-ups:
<button id="menu-toggle" popovertarget="menu-items">
Open Menu
</button>
<ul id="menu-items" popover anchor="menu-toggle">
<li class="item">...</li>
<li class="item">...</li>
</ul>
Para configurar uma âncora, atribua a ela um id
(neste exemplo, #menu-toggle
) e use anchor="menu-toggle"
para conectar os dois elementos. Agora, você pode usar anchor()
para estilizar o popover. Um menu pop-up centralizado que é ancorado à linha de base do botão de ativação pode ter o seguinte estilo:
#menu-items {
bottom: anchor(bottom);
left: anchor(center);
translate: -50% 0;
}
Agora você tem um menu pop-up totalmente funcional ancorado ao botão ativar e com todos os recursos integrados, sem a necessidade de JavaScript.
Conclusão
A API popover é a primeira etapa de uma série de novos recursos para facilitar o gerenciamento e tornar a criação de aplicativos da Web mais acessível por padrão. Mal posso esperar para saber como você usa os pop-ups.