首页 > 其他分享 >div等元素如何阻止点击穿透和实现点击穿透?

div等元素如何阻止点击穿透和实现点击穿透?

时间:2024-12-05 09:13:43浏览次数:7  
标签:元素 穿透 点击 事件 div pointer events

在前端开发中,阻止点击穿透(也称为点击吞噬)和实现点击穿透是常见的需求,尤其是在处理叠加元素(例如弹出层、模态框)时。div 元素本身并没有直接的“阻止点击穿透”或“实现点击穿透”属性。我们需要结合 CSS 和 JavaScript 来实现这些效果。

1. 阻止点击穿透 (防止点击底层元素):

几种常见的方法:

  • pointer-events: none; (推荐): 这是最简洁有效的方法。将该 CSS 属性应用于你想阻止点击穿透的元素。这意味着该元素及其子元素将不再成为鼠标事件的目标。点击事件会“穿透”到其下面的元素。

    .overlay { /* 例如,一个覆盖层 */
        pointer-events: none; 
    }
    .overlay > button { /* 但是,你想让覆盖层上的按钮可以点击 */
        pointer-events: auto; /* 恢复按钮的点击事件 */
    }
    
  • e.stopPropagation() (JavaScript): 在点击事件的处理函数中使用 stopPropagation() 方法可以阻止事件冒泡到父元素。这适用于需要更精细控制的情况,例如只想阻止某些特定事件的穿透。

    const overlay = document.querySelector('.overlay');
    overlay.addEventListener('click', (e) => {
        e.stopPropagation(); // 阻止点击事件冒泡
        // ...其他逻辑...
    });
    
  • 透明遮罩层: 创建一个透明的 div 覆盖在底层元素上,并捕获点击事件。这种方法相对笨重,不如前两种方法灵活,但有时在处理复杂布局时可能有用。

2. 实现点击穿透 (允许点击底层元素):

  • pointer-events: none; 的反向应用: 如果之前使用了 pointer-events: none; 来阻止点击穿透,那么只需将其移除或设置为 auto 即可恢复点击。

  • 在遮罩层上设置点击事件监听,并将事件手动派发到底层元素: 这种方法比较复杂,需要获取底层元素的坐标并手动触发点击事件。通常情况下不推荐使用,除非其他方法无法满足需求。

    overlay.addEventListener('click', (e) => {
      const targetElement = document.elementFromPoint(e.clientX, e.clientY); // 获取底层元素
      if (targetElement) {
        const clickEvent = new MouseEvent('click', {
          clientX: e.clientX,
          clientY: e.clientY,
          bubbles: true, // 允许事件冒泡
          cancelable: true,
        });
        targetElement.dispatchEvent(clickEvent); // 手动触发点击事件
      }
    });
    

选择哪种方法?

pointer-events: none; 通常是首选方法,因为它简洁、高效且易于理解。如果需要更精细的控制或处理一些特殊情况,可以使用 e.stopPropagation()。 避免使用手动派发事件,除非绝对必要。

总结:

理解 pointer-eventsstopPropagation() 是处理点击穿透的关键。选择合适的方法可以使你的代码更简洁、易于维护,并提供更好的用户体验。

标签:元素,穿透,点击,事件,div,pointer,events
From: https://www.cnblogs.com/ai888/p/18587721

相关文章

  • a链接被点击后,在跳转之前的处理事件
    在HTML中,<a>标签通常用于创建链接,使用户能够点击并跳转到另一个页面或网址。如果你想在跳转前处理一些事件,你可以使用JavaScript来实现这一功能。以下是一个简单的示例,展示了如何在用户点击<a>链接并在页面跳转之前执行一些JavaScript代码:<!DOCTYPEhtml><htmllang="en">......
  • ISUP协议视频平台EasyCVR视频设备轨迹回放平台安防监控中P2P的穿透方法
    在现代视频监控领域,尤其是ISUP协议视频平台EasyCVR这样的跨区域网络化视频监控集中管理平台中,实现远程访问和数据传输的高效性至关重要。P2P(Peer-to-Peer)穿透技术因其在NAT(网络地址转换)环境下的高效性和稳定性,成为了实现远程监控的关键技术之一。本文将探讨P2P穿透技术的原理、应......
  • Codeforces Round 990 (Div. 2) 题解 (A ~ E)
    A.AlyonaandaSquareJigsawPuzzle模拟即可#include<bits/stdc++.h>usingi64=longlong;voidsolve(){ intn;std::cin>>n; intcur=0; intans=0; for(inti=0,j=1;i<n;i++) { intx;std::cin>>x; cur+=x; ......
  • 隐藏div内文字的方法有哪些?
    隐藏div内文字的方法有很多,以下是几种常见的方法,并附带一些示例和适用场景:1.display:none;效果:元素完全从文档流中移除,不占据空间,就像它不存在一样。后续的元素会填补它留下的空白。适用场景:当你想完全隐藏内容,并且不希望它影响页面布局时。示例:.hidden-div{di......
  • Educational Codeforces Round 172 (Rated for Div. 2)(A~D)
    比赛链接:https://codeforces.com/contest/2042这场爆了,卡死在C题了,QWQ.卡题得跳题啊!!!A.GreedyMonocarp题面:有\(n\)个箱子,第\(i\)个箱子最初包含\(a_i\)枚硬币。对于每个箱子,你可以选择任意非负数(0或更大)的硬币添加到该箱子中,有一个约束条件:所有箱子中的硬币总数必须变......
  • Educational Codeforces Round 172 (Rated for Div. 2) A ~ D
    EducationalCodeforcesRound172(RatedforDiv.2)广告:starrycoding九折优惠码(FV7B04LL)A思路需要拿至少\(k\)枚硬币.从大到小拿.拿到的硬币最少.题目没有要求补硬币的数目,要求回答的是拿最少硬币时至少补多少.而拿取的最小值最少为\(k\).求从大到小拿取到......
  • Educational Codeforces Round 172 (Rated for Div. 2) D. Recommendations
    算法听别人说这题比较简单,我来看看怎么个事转化题意,对于\(n\)条线段\([l_i,r_i]\),求每条线段被哪些线段完全覆盖,并求这些线段的交集减去其的长度显然的,\(j\)线段覆盖\(i\)线段,应该满足\(l_j\leql_i,r_i\leqr_j\)那么我们考虑将每一条线段当做一个点......
  • ssh 隧道 只需要一台中间服务器(带外网)实现内网穿透
    ssh隧道只需要一台中间服务器(带外网)实现内网穿透ssh隧道把服务器上的请求转发到本地,把本地请求转发到服务器把本地端口-L选项用于本地(Local)-R选项用于远程(Remote)1.开启服务器ssh网关功能修改/etc/ssh/sshd_config文件,将GatewayPorts修改为yes,并放开AllowAgentForwa......
  • 题解:CF1968G2 Division + LCP (hard version)
    https://www.luogu.com.cn/problem/CF1968G2CF1968G2Division+LCP(hardversion)题解前言这题可以\(O(n\sqrt{n}\logn)\)再各种优化做,算法是二分、哈希(不知道包不包含根号分治,但是有用到根号分治的思想)。如果读题解有些抽象的话可以看代码辅助理解。题意转化由于......
  • html5点击返回键怎样不让它返回上一页?
    Youcanpreventthedefaultbackbuttonbehavior(navigatingtothepreviouspage)inHTML5usingJavaScript.Here'showyoucandoit,alongwithexplanationsanddifferentapproachesdependingonwhatyouwanttoachieve:1.Usinghistory.pushStat......