前端开发中,难免会遇到一些元素被其他元素遮挡,比如想要点击box2,刚好又被box1元素挡住,无法实现点击效果

<style>
  .box1 {
    position: absolute;
    top: 0;
    width: 270px;
    line-height: 270px;
    z-index: 1;
    background-color: rgba(255, 194, 204, 0.5);
  }
  .box2 {
    position: absolute;
    top: 0;
    width: 100px;
    line-height: 100px;
    background: skyblue;
  }
</style>
<!-- box1将box2完全遮挡住,但是点击事件又是在box2上面 -->
<div class="box1"></div>
<div class="box2" onclick="abc()"></div>

<script>
  function abc() {
    console.log('box2点击事件');
  }
</script>

这时候,就可以使用该属性了:pointer-events,鼠标是否可以穿透当前元素,抵达被覆盖的元素

默认值

描述

auto

鼠标可以点击访问该元素,默认值

none

鼠标点击,该元素不做任何响应

inherit

继承父级属性

给box1加上pointer-events: none; 这样box2就不会收到box1的遮挡,也能发生鼠标点击事件了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box1 {
            position: absolute;
            top: 0;
            width: 270px;
            line-height: 270px;
            z-index: 1;
            pointer-events: none;
            background-color: rgba(255, 194, 204, 0.5);
        }
        .box2 {
            position: absolute;
            top: 0;
            width: 100px;
            line-height: 100px;
            background: skyblue;
        }
    </style>
</head>
<body>
    <!-- box1将box2完全遮挡住,但是点击事件又是在box2上面 -->
    <div class="box1">box1</div>
    <div class="box2" onclick="abc()">box2</div>

    <script>
        function abc() {
            console.log('box2点击事件');
        }
    </script>
</body>
</html>

如果一个鼠标点击事件不能发生,首先应检查它是否被遮挡,然后可以使用pointer-events属性。然后检查是否有其它的事件冲突,比如mousedown等。

在子元素中,绑定一个阻止冒泡的点击事件 @click.stop,可以解决点击子元素触发父元素点击事件的问题。