通过closest实现clickoutside关闭弹窗

一、效果演示
实现效果如下所示,1. 点击显示浮窗按钮,显示浮窗按钮;2. 点击浮窗区域外,关闭弹窗;3. 点击浮窗区域内,弹窗状态不发生改变。
![请添加图片描述](https://img-blog.csdnimg.cn/direct/be81be2df29d408fbc42bf819fe97526.gi请添加图片描述

二、代码实现

  1. 先画出页面元素
 <div class="box">
  <div class="dialog">
    <h1>Hello Wolrd!</h1>
  </div>
  <div class="btn">
      显示浮窗
  </div>
</div>
// css 样式省略
  1. 当点击按钮时,弹出页面,效果如下
const dialog = document.querySelector(".dialog");
const box = document.querySelector(".box");
const btn = document.querySelector(".btn");
btn.addEventListener("click", () => {
  console.log("btn");
  dialog.style.display = "block";
});

请添加图片描述
3. 点击其他区域,关闭浮窗

document.addEventListener("click", (e) => {
  console.log("document");
  const isInDialog = e.target.closest(".dialog");
  if (!isInDialog) {
    dialog.style.display = "none";
  }
})

Element.closest() 方法用来获取:匹配特定选择器且离当前元素最近的祖先元素(也可以是当前元素本身)。如果匹配不到,则返回 null。
上述代码中的e.target.closest(“.dialog”)e.target为点击元素,.dialog为目标元素。用来目标元素dialog是不是元素e.target的祖先元素。如果返回的是true,则点击的区域是在dialog浮窗内部。如果是null,则点击区域在dialog浮窗外部,隐藏浮窗。
请添加图片描述
我们本想实现点击浮窗外的区域关闭浮窗,结果浮窗没能打开,我们查看通过控制台的打印结果可以知道:btn的点击事件先执行打开了弹窗,然后document的点击事件后执行,关闭弹窗,导致弹窗打开的效果没有实现。
在这里插入图片描述
4. 解决问题
基于以上的问题,只要改变点击事件的执行顺序就可以实现效果。因此,我们给document.addEventListener()的第三个参数设置为true.通过控制台,执行顺序改变了,功能也实现了。
在这里插入图片描述
请添加图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值