只用 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 方法来 显示隐藏状态的变化

相关推荐
窝子面34 分钟前
手搓最简前后端协作-node
javascript·数据库
qetfw1 小时前
MXU:Tauri 2 + React 的 MaaFramework 跨平台 GUI 源码
前端·python·react.js·前端框架·开源项目·效率工具
甲维斯1 小时前
我要开始吹牛逼了!Kimi K3 “宇宙无敌”!
前端·人工智能
a1117761 小时前
微光小屋-前端养成小游戏 开源项目
前端
kyriewen1 小时前
我让AI给前端项目做了一次完整的Code Review——它和人类的差距,比我想的大得多
前端·javascript·ai编程
张鑫旭1 小时前
快速过下我2026年上半年的前端学了些啥
前端
এ慕ོ冬℘゜2 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript
hoLzwEge2 小时前
拯救低效调试!code-inspector-plugin 让代码定位如虎添翼
前端·前端框架·node.js
J船长2 小时前
烂笔头扫盲:LLM Eval 入门:从「感觉挺好」到「数据说话」的工程化落地
前端