只用 HTML 即可实现弹窗

前言

今天周六,打开 Youtube 时,看到一个 外国小哥🔗 介绍了一个 html 标签上的属性,可以不借助 js 打开一个弹窗,感觉有点意思,在此记录一下

实现效果如下:

popover

这是在 mdn 上关于 popover🔗 的介绍

在 任意元素 上添加属性 popover , 同时在触发元素上添加 popovertarget 属性指向这个元素的 id 即可触发

简单来说,我们只需要下面的代码就可以实现一个简单的弹窗

html 复制代码
<button popovertarget="my-popover">打开 Popover</button>

<div popover id="my-popover">大家好!欢迎你们!</div>

(没有添加 css,所以显得比较简陋)

添加 css

可以看到,添加 popover 属性的元素刚好处于整个页面的中间位置,这是由于有默认样式

我们简单的添加一些 css 来美化这个弹窗

css 复制代码
   /*  背景 */
  ::backdrop {
      background-color: rgb(150, 148, 148);
      backdrop-filter: blur(30px);
    }

    /* popover 元素 */
    :popover-open {
      background-color: #ff7008;
      color: white;
      border-radius: 10px;
      padding: 20px;
    }

添加 css 样式之后长这样

添加 js

但是这样弹窗有个小问题,就是无法执行关闭回调方法,而且只要点击背景就会关闭,无法手动控制,我们想要更加精细的控制弹窗隐藏,查看文档,找到对应的方法

  1. hidePopover 关闭弹窗
  2. showPopover 打开弹窗
  3. beforetoggle 切换之前
  4. toggle 切换之后

假如我们的 html 长这样

html 复制代码
   <button id="button">打开弹窗</button>
   
   <div id="info" popover>
      <p> 一个简单的弹窗</p>
      <button id="closeBtn">关闭</button>
   </div>

我们使用 button 来打开关闭 弹窗

js 复制代码
const button = document.getElementById("button");
const info = document.getElementById("info");
const closeBtn = document.getElementById("closeBtn");

 // 打开弹窗
  button.addEventListener("click",()=>{
     info.showPopover()
  })
   
 // 关闭弹窗
  closeBtn.addEventListener("click",()=>{
     info.hidePopover()
  })

等到打开/关闭的时候,我们可以监听到相应的回调方法

js 复制代码
   info.addEventListener("beforetoggle", (event) => {
      if (event.newState === "open") {
        console.log("Popover is being shown");
      } else {
        console.log("Popover is being hidden");
      }
    });

    info.addEventListener("toggle", (event) => {
      if (event.newState === "open") {
        console.log("Popover has been shown");
      } else {
        console.log("Popover has been hidden");
      }
    });

更多信息可以查看英文版 🔗mdn popover

dialog

mdn 关于 🔗dialog 的解释

根据 mdn例子 做一个简化版

html 复制代码
<button id="updateDetails">Update details</button>

  <dialog id="dialog">
    <form method="dialog">
      <p>Greetings, one and all!</p>
      <button id="button">OK</button>
    </form>
  </dialog>
js 复制代码
   const updateButton = document.getElementById("updateDetails");
   const dialog = document.getElementById("dialog");

    updateButton.addEventListener("click", () => {
      dialog.showModal()
    })
    
    dialog.addEventListener("close", () => {
      console.log(1213)
    })

对,你没有看错, dialog 嵌套了 一个 form,而且 methoddialog

效果如下⬇️

不知道为啥要这样设计这种方法, 但是 中文mdn文档 的关闭方法只有这一个,经过查阅英文的 mdn,发现还有一种关闭方法 ------ close,这种方法不必使用 form

js 复制代码
  button.addEventListener("click", () => {
      dialog.close()
   })

总结

我们可以使用 dialog 标签 或者在 元素上添加属性 popover 来创建一个 弹窗

如果是 dialog 标签,可以使用 showModalclose 方法来打开关闭

如果使用 popover 属性,默认是点击蒙层即可关闭,我们可以添加 popover="manual" 手动控制显示隐藏,调用 showPopover / hidePopover 方法控制显示隐藏,同时我们也可以监听 beforetoggle/toggle 方法来 显示隐藏状态的变化

相关推荐
崔庆才丨静觅4 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了5 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅5 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅5 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅5 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅6 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊6 小时前
jwt介绍
前端
爱敲代码的小鱼6 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax