`
flex_莫冲
  • 浏览: 1092441 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

pointerEvents-让事件穿透层

 
阅读更多
参考资料:
http://www.qianduan.net/css3-pointer-event-description.html
http://css-tricks.com/including-navigation-code-on-all-pages-even-with-current-navigation-highlighting/
http://www.cnblogs.com/meteoric_cry/archive/2011/07/03/2096971.html
http://www.vinylfox.com/forwarding-mouse-events-through-layers/

之前考虑怎么在html中做事件穿透,比如有两个同层次的div,如何让底层的div能执行监听事件。

今天偶然看到css有这么一个参数可以设置:pointerEvents

解决这样的问题有以下方案:

1、纯使用CSS的属性pointer-events,设置其为none (默认为auto)

优点:无需额外的代码

缺点:不支持IE(IE不支持此属性,IE9是否支持有待考评..)

2、捕捉事件获取鼠标的位置X、Y,然后触发层级较低元素的相应事件 (平时我们用调试工具选取页面中的元素,高亮显示的区域就是依据这个原理)

优点:兼容各浏览器

缺点:需要编写Javascript,效率并不高

这样获取有也有两种处理方法:

循环获取每一个元素的位置,然后对比鼠标的X、Y,效率低,不推荐;这里推荐使用elementFromPoint(浏览器都支持),直接传入X、Y,便可直接获取相应的DOM元素

我的DEMO:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
		<script src="jquery-1.9.1.min.js"></script>
		<style>
			#mainPage div {
				position:absolute;
				color:#999;
			}
			#slideshowWrap {
				top:200px;
				left:0px;
				width: 200px;
				height:200px;
				z-index: 0;
				background-color:blue;
			}
			
			#scrollWrap {
				z-index: 2;
				top:0px;
				left:0px;
				width:200px;
				height:400px;
				background-color:yellow;
				pointer-events: none;
			}
			
			#slideshowBtn {
				z-index:1;
				width: 20px;
				height:20px;
				top:200px;
				left:180px;
				background-color:black;
			}
			
			#scrollBtn {
				top:380px;
				left:90px;
				width: 20px;
				height:20px;
				background-color:black;
				pointer-events: auto;
			}
			
		</style>
		
		<script>
			$(document).ready(function () {
				var TOP_INDEX = 99,
					scrollWrap = document.getElementById("scrollWrap"),
					slideshowWrap = document.getElementById("slideshowWrap");
				// scrollWrap.addEventListener("click", function (event) {
					// console.log("scroll click");
				// });
				slideshowWrap.addEventListener("click", function (event) {
					console.log("slideshow click");
				});
				
				$("#scrollBtn").on("click", function () {
					console.log("scroller btn click");
				});
				// $("#slideshowBtn").on("click", function () {
					// $("#slideshowWrap").css("z-index", 1);
					// $("#slideshowBtn").css("z-index", 1);
					// $("#scrollWrap").css("z-index", TOP_INDEX);
				// });
				
				// $(document).on("click", "div", function (event) {
					// console.log("document click");
					// console.log(event.currentTarget);
				// });
				
				// $("div").on("click", function (event) {
					// console.log(event.target);
				// })
			});
		</script>
	</head>
	<body>
		<div id="mainPage">
			<div id="slideshowWrap">slideshow</div>
			<div id="scrollWrap">scroll
				<div id="scrollBtn"></div>	
			</div>
			<div id="slideshowBtn"></div>
		</div>
	</body>
</html>

分享到:
评论

相关推荐

    使用CSS的pointer-events属性实现鼠标穿透效果的神奇技巧

    当pointer-events的值设置为none之后,浏览器将不会获得鼠标在当前位置的层上的点击事件,而造成鼠标穿透的效果!下面就来为大家展开讲解一下使用CSS的pointer-events属性实现鼠标穿透效果的神奇技巧

    css3pointer-event介绍.docx

    2. `pointer-events: none` - 当设置此值时,元素将不再响应鼠标事件,而是让事件穿透到其下方的元素。这在需要用户与元素下方的内容进行交互时非常有用。例如,在地图应用中,若有一个覆盖在地图上的层,设置该层的...

    css中pointer-events属性详解

    当`.pointer`类存在时,`.overlay1`和`.overlay2`的`pointer-events`属性被设置为`none`,从而使鼠标能够穿透这两个div,进而触发下方链接和`&lt;span&gt;`的事件。 这个例子展示了`pointer-events`在解决层叠元素交互...

    对vue中的事件穿透与禁止穿透实例详解

    总结来说,Vue.js的事件修饰符和JavaScript的`event.stopPropagation()`提供了阻止事件冒泡的机制,而CSS的`pointer-events`属性则允许我们控制元素是否响应鼠标事件,从而避免事件穿透问题。在实际开发中,根据具体...

    css pointer-events属性实现下面元素可点击

    在示例中,`.overlay`类的元素设置了`pointer-events: none`,这意味着当用户尝试点击这个覆盖层时,事件不会被这个元素捕获,而是继续向下传递到下面的链接元素。这使得用户可以点击原本被遮挡的链接。 为了实现这...

    鼠标穿透.rar

    当`pointer-events:none`时,元素将变得对鼠标事件透明,即实现了“穿透”效果。而在Unity3D等游戏引擎中,可能需要修改碰撞检测设置或自定义事件处理逻辑。 在图形用户界面设计中,鼠标穿透的使用需谨慎,因为它...

    DIV 层 select

    - 使用 CSS 的 `pointer-events` 属性:将 `pointer-events` 设置为 `none` 可以让 `div` 层不响应鼠标事件,这样点击时就不会穿透 `div` 到 `select` 元素。但是,记得在需要交互的地方恢复 `pointer-events` 的...

    鼠标穿透设计技巧.rar

    通过设置`pointer-events`属性为`none`,可以使元素不响应鼠标事件,从而允许鼠标穿透。例如: ```css .穿透元素 { pointer-events: none; } ``` 3. **编程接口**:在桌面应用开发中,如Windows Forms或WPF,...

    android Touch事件传递机制

    在Android系统中,触摸事件(Touch Events)是用户与设备交互的主要方式,它涉及到了复杂的事件传递机制。本文将深入探讨Android的触摸事件处理流程,包括事件的产生、分发以及处理过程,以实例的形式帮助开发者理解...

    div弹出层 定位问题的 处理

    `在不需要交互的元素上,然后在弹出层上设置`pointer-events: auto;`。 通过上述方法,我们可以有效地解决`div`弹出层的定位问题,创建出符合预期且用户体验良好的弹出层。在实际开发中,要结合具体项目需求和...

    div遮罩层

    通过设置`pointer-events: none`,我们可以使遮罩层不响应鼠标事件,从而达到阻止背景操作的效果。如果需要在遮罩层上添加可点击的元素,那么只需要为这些特定元素设置`pointer-events: auto`即可。 在实际应用中,...

    css的pointer鼠标类型详解(支持IE,firefox,chrome)

    当`pointer-events`设置为`none`时,元素将忽略所有的鼠标事件,鼠标指针会穿透该元素并作用于其下的元素。这对于创建覆盖层或者透明元素特别有用,因为即使这些元素位于其他内容之上,也不妨碍用户与底层元素交互。...

    页面CSS水印

    - `pointer-events`属性:让水印元素不响应鼠标事件,防止点击穿透,如`pointer-events: none;`。 - `backdrop-filter`属性:在某些浏览器中,可以使用模糊或饱和度等滤镜效果,使得截图时水印变得模糊。 - `...

    一个滤镜的效果HTML源码

    `:如果想要让用户能够点击覆盖层下的元素,可以添加此属性,使得鼠标事件穿透覆盖层传递至下面的元素。 JavaScript也可能在这个滤镜效果中发挥作用,例如,当用户点击某个按钮时,通过JavaScript动态添加或删除...

    鼠标点击变色,弹出div,禁用页面

    一种方法是创建一个全屏的遮罩层,覆盖整个页面,并设置其`pointer-events`属性为`none`,或者设置页面元素的`disabled`属性: ```html ()"&gt;禁用页面 ; top: 0; left: 0; width: 100%; height: 100%; background...

    vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)

    2. **非阻塞点击穿透**:在vue-particles组件上设置CSS属性`pointer-events: none;`,使其不捕获任何鼠标事件,允许点击事件穿透到下面的按钮元素。 3. **自定义点击事件处理**:如果点击效果是必要的,可以监听全局...

    wxapp_multiFormId:小程序获取多个formId

    4. **CSS样式调整**:为内层元素设置`pointer-events: none`使其不响应点击事件,但请注意这可能会影响其他交互。 在`wxapp_multiFormId`项目中,可能已经提供了相应的处理机制来防止这种问题,通过分析源码,我们...

    基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)

    为了允许文本被选中或点击,可以使用CSS的`pointer-events`属性,将其设为`none`,这样鼠标事件可以穿透覆盖层作用在下面的文字上。 以下是简化的HTML结构、CSS样式和JavaScript代码示例: ```html &lt;!-- 多个...

Global site tag (gtag.js) - Google Analytics