穿透层的鼠标事件

标题可能不是一读让人容易明白,上张图(转载的)

需要实现如下的效果,有一个浮动层,需要层级在它之下的一个元素也能照常响应相应的事件

一个100*100的元素,边框为1px solid #406c99,它有两个事件(鼠标移入、鼠标移出):

onmouseover="this.style.borderColor=‘#f00‘;"

onmouseout="this.style.borderColor=‘#406c99‘;"

在不做特殊处理的情况下,它的事件将会是无法触发的,现在想让它正常触发,效果如下:

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

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

优点:无需额外的代码

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

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

优点:兼容各浏览器

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

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

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

比较折中的办法是,针对非IE的浏览器直接使用方案1,IE使用方案2进行优化。这种应用场景,可能会是一个新的产品上线了,需要引导用户如何去使用,会使用蒙板遮住整个页面,然后让某一元素可点击。

elementFromPoint的使用例子(移动鼠标时,如果那一点在某一元素的占位区域则添加3像素的红色边框,鼠标移开该元素时清除边框)

<!DOCTYPE html><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><script type="text/javascript" >var selElem =null;var origBorder ="";

function OnMouseMove (event) {    var posX = event.clientX,         posY =event.clientY;

    var ua = navigator.userAgent,        isIE = /msie/i.test(ua),        isFF = /firefox/i.test(ua);

    if(!isIE && !isFF) {        posX = event.pageX;         posY = event.pageY;    }

    var info = document.getElementById("info");     info.innerHTML = event.clientX + ", " + event.clientY;

    var overElem = document.elementFromPoint(posX, posY);

    if(overElem && !overElem.tagName) {        overElem = overElem.parentNode;    }

    if (selElem) {        if (selElem == overElem) {            return ;        }        selElem.style.border = origBorder;

        selElem = null;    }

    if (overElem && !/^(html|body)$/.test(overElem.tagName.toLowerCase()) ) {         selElem = overElem;        origBorder = overElem.style.border;        overElem.style.border = "3px solid red" ;    }}

    </script>    </head>    <body onmousemove="OnMouseMove (event);">    <div style="height:200px">        test test test test test test test    </div>

    <div style="position:absolute; right:20px; top:30px;">        The current mouse position: <span id="info" style="border:1px solid #606060;  padding:5px;"></span>    </div>    <br/><br/>    <textarea rows="4" style="width:200px; height:100px;">        test test test test test test test test test test test test test test    </textarea>

    <div style="height:100px; margin-top:20px;">        test test test test test test testtest test test test test test testtest test test test test test testtest test test test test test test    </div></body></html>

遍历元素,然后找到相应的元素示例(效率比较低的一种)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> <title>Sandbox</title> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <style type="text/css" media="screen"> body {  padding: 0px; line-height: 1.8; color: rgb(0, 128, 0);">#000; }.box {width: 50px; height: 50px; border: 1px solid white}.highlight {}#controls {position:absolute; top: 300px; color: white;}</style> </head> <body>   <div id="container">      <div class="box" style="position:absolute; top: 25px; left: 25px;"></div>      <div class="box" style="position:absolute; top: 50px; left: 125px;"></div>      <div class="box" style="position:absolute; top: 100px; left: 25px;"></div>      <div class="box" style="position:absolute; top: 125px; left: 180px;"></div>      <div class="box" style="position:absolute; top: 225px; left: 25px;"></div>      <div class="box" style="position:absolute; top: 185px; left: 125px;"></div>      <div id="shield" style="position: absolute; width: 200px; top: 0px;  opacity: 0.5; filter:alpha(opacity=50);"></div>   </div>   <div id="controls">     <input type="checkbox" checked="checked">Pass pointer events through</input>     Try clicking  </div> <script> $(".box").click(function(){     $(this).toggleClass("highlight");});

function passThrough(e) {    $(".box").each(function() {       // check if clicked point (taken from event) is inside element       var mouseX = e.pageX;       var mouseY = e.pageY;       var offset = $(this).offset();       var width = $(this).width();       var height = $(this).height();

       if (mouseX > offset.left && mouseX < offset.left+width            && mouseY > offset.top && mouseY < offset.top+height)         $(this).click(); // force click event    });}

$("#shield").click(passThrough);

var dthen = new Date();

setInterval(function(){    dNow = new Date();    $(‘#shield‘).css(‘height‘, ((dNow.getSeconds()+(dNow.getMilliseconds()/1000))*50)%300 +‘px‘);},10)

var doPassThrough = true;$(‘input‘).click(function(){  doPassThrough =  !doPassThrough;  if (doPassThrough){    $("#shield").click(passThrough);  } else {    $(‘#shield‘).unbind(‘click‘, passThrough);  }});

</script></body> </html>

在非IE浏览器中,控制pointer-events来达到想要的效果的示例

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"><html> <head>  <title>pointer-events test</title>  <meta name="generator" content="editplus" />  <meta name="author" content="" />  <meta name="keywords" content="" />  <meta name="description" content="" />  <meta http-equiv="content-Type" content="text/html;charset=utf-8">  <style type="text/css">    * {margin:0; padding:0;}    body {width:100%; height:100%;}  </style> </head>

 <body>

<div style="border:1px solid #406c99; width:100px; height:100px; margin-top:300px; margin-left:300px;" onmouseover="this.style.borderColor=‘#f00‘;" onmouseout="this.style.borderColor=‘#406c99‘;" title="hahaniu"></div>

<div style="position:absolute; top:0; left:0; width:100%; height:100%;  opacity:.3; filter:alpha(opacity=30); overflow:hidden;" id="mask"></div>

<button style="position:absolute; z-index:9999; left:100px; top:80px; padding:2px;">开启pointer-events支持</button>

<script type=‘text/javascript‘>

var isOpen = false;

document.getElementsByTagName("button")[0].onclick = function(evt) {    evt = evt || window.event;

    this.innerHTML = (isOpen ? "开启" : "关闭") + "pointer-events支持";

    document.getElementById("mask").style.pointerEvents = isOpen ? "" : "none";

    isOpen = !isOpen;}

</script>

 </body></html>
时间: 2024-11-04 08:50:53

穿透层的鼠标事件的相关文章

网站开发div在Jquery中的鼠标事件失去焦点

网站div在Jquery中的鼠标事件失去焦点,今天在做网站开发的时候遇到了个问题,就是我在用Jquery做导航的时候,用到了Jquery的鼠标事件mouseout,但问题出来了,我有两个div,A的div包含了B的div,本来我是想当鼠标移出A的div的时候隐藏div,可是当我的鼠标移到B的div在移出的时候也会触发jquery的隐藏事件,这让人很头痛. 在网上搜了下,找到了解决的法子,就是直接把mouseout换成了mouseleave就可以了,具体的问题请大家参考Jquery的开发文档吧

selenium python (三)鼠标事件

# -*- coding: utf-8 -*-#鼠标事件 #ActionChains类中包括:context_click()  右击:                        # double_click() 双击:                        # drag_and_drop() 拖动:                        # move_to_element()鼠标悬停在一个元素上:                        # click_and_hold

javascript基础——鼠标事件,系统对话框等

1.鼠标事件 (1).onclick:用户点击鼠标左键,以及当焦点在一个按钮上时,用户按Enter键时,发生onclick事件 (2).ondblclick:用户双击鼠标左键时,发生ondblclick事件 (3).onmousedown:用户按下任意鼠标按钮的时候,发生onmousedown事件 (4).onmouseout:当光标在一个元素上,并且用户将其移出元素边界时,发生onmouseout事件 (5).onmouseover:当光标在一个元素之外,并且用户将移动到该元素上时,发生onm

基于OpenGL编写一个简易的2D渲染框架-07 鼠标事件和键盘事件

这次为程序添加鼠标事件和键盘事件 当检测到鼠标事件和键盘事件的信息时,捕获其信息并将信息传送到需要信息的对象处理.为此,需要一个可以分派信息的对象,这个对象能够正确的把信息交到正确的对象. 实现思路: 要实现以上的功能,需要几个对象: 事件分派器:EventDispatcher,负责将 BaseEvent 分派给 EventListener 对象 事件监听器:EventListener,这只是一个接口类,接受 BaseEvent 的对象,真正的处理在它的子类中实现 事件:BaseEvent,储存

JQuery 鼠标事件简介

mouseover事件于用户把鼠标从一个元素移动到另外一个元素上时触发,mouseout事件于用户把鼠标移出一个元素时触发. 下面为你详细介绍下jquery中的鼠标事件: (1):click事件:click事件于用户在元素敲击鼠标左键,并在相同元素上松开左键时触发: $('p').click(function(){ alert('click function is running !'); }); (2):dblclick:dbclick事件在用户完成迅速连续的两次点击之后触发,双击的速度取决于

jQuery事件之鼠标事件

鼠标事件是在用户移动鼠标光标或者使用任意鼠标键点击时触发的.   (1):click事件:click事件于用户在元素敲击鼠标左键,并在相同元素上松开左键时触发.        $('p').click(function(){                alert('click function is running !');              });    (2):dbclick事件:dbclick事件在用户完成迅速连续的两次点击之后触发,双击的速度取决于操作系统的设置.一般双击事件

JavaScript 鼠标事件

鼠标事件是Web开发中最常用的一类事件. DOM3级事件中定义了9个鼠标事件,分别如下: click.dbclick.mousedown.mouseenter.mouseleave.mousemove.mouseover.mouseout.mouseup. click:在用户单击鼠标按钮时,或者按下回车键时触发.这点对确保易访问性很重要,意味着onclick时间处理程序既可以通过键盘也可以通过鼠标执行.

JavaScript的事件对象_鼠标事件

鼠标事件是 Web 上面最常用的一类事件,毕竟鼠标还是最主要的定位设备.那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等. 一.鼠标按钮 只有在主鼠标按钮被单击时(常规一般是鼠标左键)才会触发 click 事件,因此检测按钮的信息并不是必要的. 但对于 mousedown 和 mouseup 事件来说,则在其 event 对象存在一个 button 属性,表示按下或释放按钮. <script type="text/javascript"> window.onload

Extjs 窗体居中,双重窗体弹出时清除父窗体的鼠标事件

这个是监控窗体缩放的事件 缩放中居中主要在 'beforeshow' 和 'destroy'两个事件里面监控 var EditTempWindow; Ext.EventManager.onWindowResize(function() { if (EditTempWindow) { EditTempWindow.center() } }); Ext.define("Define.Class.EditWindow", { id: 'RoomEditWin', xtype: 'window