IE11下zindex为负,事件无法穿透

在项目中发现IE11下a标签点击事件无法响应,而Chrome正常。问题源于IE11的一个bug,当z-index设置为负值时,会导致元素无法获取鼠标事件。通过情景模拟,发现在IE11中,z-index为负的DOM元素无法触发点击事件。解决方法是避免使用负z-index,或者调整z-index为正,从而恢复事件的正常响应。

今天在项目中遇到一个很奇怪的问题,一个a标签的点击事件在IE11中无法响应,在chrome中却可以响应。后来经过仔细的排查问题,发现是IE11下的z-index为负出现的bug,现做如下总结。

情景模拟

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        *{margin:0;padding:0;}
        .inner-1{
            position: absolute;
            height: 400px;            
            left:20px;
            top: 0;
            background-color: red;
            z-index: -1;
        }
        .inner-2{
            margin-top: 200px;
            height: 100px;
            background-color: green;
            overflow: hidden;
            position: relative;
            z-index: 2;
        }
    </style>
</head>
<body>  
       <div  class="inner-1">
            <button  onclick="alert(3)">测试</button>
        </div>
        <div class="inner-2"></div>  
</body>
</html>

界面效果如下

avatar

在chrome下,点击这个按钮,会弹出3,但是在IE11下,神奇的事情发生了,按钮根本不能点击,将鼠标放上去,没有按钮移入的默认样式,更不会触发点击事件了。给人感觉就像是这里没有按钮,事件无法穿透到这个按钮。

然后我猜测,这个应该是因为这个inner-1层的z-index为负值,致使其表现的就像有东西覆盖在其表面,使其无法获取鼠标移入的焦点。但是在IETester的测试结果中,IE8和IE9这个按钮点击时都有默认的效果,拥有明显的点击效果。因此,这就是一个IE11的专属bug。之后自己尝试将inner-1的z-index设置为1,再进行测试,结果豁然开朗!!!成功了,点击事件可以响应了。
avatar

所以,最后的总结就是:在IE11中,不要在z-index为负值的DOM元素中,期待点击事件或者其他鼠标相关事件的发生!!!

### 高德地图多边形点击事件穿透解决方案 在高德地图中实现多边形点击事件穿透功能时,主要挑战在于如何处理多个叠加的图形对象之间的交互行为。当存在多个图层或多边形相互覆盖的情况下,默认情况下只有最上层的对象会接收到用户的点击操作。 为了使底层的地图元素也能响应点击事件,在创建多边形时可以调整其属性设置: 1. **配置多边形参数** 设置`zIndex`来控制同多边形间的层次关系;降低顶层多边形的透明度(`opacity`)以便于视觉区分;最重要的是要禁用顶层多边形的默认点击效果,允许点击事件传递给下一层级[^1]。 ```javascript var polygonOptions = { strokeColor: "#FF33FF", strokeWeight: 3, strokeOpacity: 0.8, fillOpacity: 0.5, // 调整填充完全透明 zIndex: 50, // 控制显示层级 clickable: false // 关键选项:关闭此多边形的可点击状态 }; ``` 2. **监听全局鼠标事件并手动判断位置** 如果单纯依靠上述方法无法满足需求,则可以通过监听整个画布上的click事件,并利用地理坐标转换函数将屏幕坐标转为经纬度坐标,再逐一检测各个多边形是否包含该点。这种方式虽然增加了计算量但是灵活性更高。 ```javascript map.on('click', function(e){ var lnglat = e.lnglat; polygons.forEach(function(polygon){ if (polygon.contains(lnglat)){ console.log("Clicked inside:", polygon); // 执行相应的逻辑... } }); }); ``` 3. **优化性能考虑** 对于大量复杂形状的情况,建议预先构建空间索引结构(如R树),以加速碰撞测试过程。这仅提高了效率也使得应用更加流畅稳定。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值