<dialog> — modal nativo
Novo
HTML
Fazer um modal à mão significa: escurecer o fundo, travar a rolagem, prender o foco dentro dele, fechar no Esc, devolver o foco ao abrir e fechar. O <dialog> entrega tudo isso de fábrica.
<button id="abrir">Ver fotos do evento</button>
<dialog id="galeria">
<img src="evento.webp" alt="Bar montado em casamento">
<button id="fechar">Fechar</button>
</dialog>
const galeria = document.getElementById('galeria');
abrir.addEventListener('click', () => galeria.showModal());
fechar.addEventListener('click', () => galeria.close());
// fechar ao clicar fora (o ::backdrop é o próprio dialog)
galeria.addEventListener('click', (e) => {
if (e.target === galeria) galeria.close();
});
dialog { border: 0; border-radius: 8px; padding: 0; max-width: 90vw; }
dialog::backdrop { background: rgba(0, 0, 0, .7); }
O ::backdrop é o fundo escuro — um pseudo-elemento que o navegador cria sozinho. Você não precisa daquela <div class="overlay">.
showModal() e show() são diferentes. O primeiro trava a página e escurece o fundo; o segundo abre o dialog sem bloquear nada. Para lightbox e modal, é sempre showModal().