你一定要知道的小细节!dom元素被隐藏是否都是不能触发事件的呢

这是一个小细节问题,相信大家在学习前端过程中,了解过一些隐藏dom的方法,那么探讨一个问题,dom被隐藏后是否可以触发相关的事件呢,或者说隐藏后保留占位的元素,是否仍然可点击呢

元素隐藏方法

  • display:none
  • visibility: hidden
  • opacity: 0
  • (特别的方法:移出去)position: absolute; left: -10000px
  • (特别的方法:盖起来)z-index: -1

相关的测试及其特点总结

代码情况如下,简单来说,就是给每个dom元素绑定了相关的隐藏事件,并打印相关信息。

display:none

点击第一个区域: display:none隐藏

此时元素不占位。

并且无法点击到相关的区域

visibility: hidden

点击第二个区域: visibility: hidden隐藏

此时的元素,隐藏且占位的

注意:此时大家可能会认为,占位那就是存在,存在就是可以被点击触发的,而事实上并不能触发相关事件(当我多次点击占位区域,但是并不能触发 console.log 打印)

opacity: 0

点击第三个区域:opacity:0

元素隐藏并占位

注意:此时占位被点击会触发相关事件(当我多次点击占位区域,触发了多次 console.log 打印)

总结

对于我们常用的方法中,虽然有些元素隐藏后仍然占位可以点击,但是不会触发相关事件。

隐藏事件
display:none不占位,不触发。会引起重绘重排
visibility:hide占位,不触发。会引起重绘,一般不会引起重排它仍然占据文档流中的空间
opacity:0占位,触发。 会引起重绘,一般不会引起重排它仍然占据文档流中的空间

除了css的隐藏方法,还有我们框架中也有相关的隐藏方式,比如vue中的v-ifv-show指令,在使用一些隐藏情况的时候,我们也要去考虑重绘重排的问题,提高性能。

测试代码

<style>
        .display {
            width: 100px;
            height: 100px;
            background-color: blueviolet;
        }

        .visibility {
            width: 100px;
            height: 100px;
            background-color: aqua;
        }

        .opacity {
            width: 100px;
            height: 100px;
            background-color: brown;
        }
    </style>
</head>
<body>
    <div style="border: 3px solid red ;">
        <div class="display">这里是display:none</div>
        <div class="visibility">这里是 visibility: hidden</div>
        <div class="opacity">这里是 opacity: 0</div>
    </div>
    
    <script>
        var display = document.querySelector('.display');
        var visibility = document.querySelector('.visibility');
        var opacity = document.querySelector('.opacity');

        display.addEventListener('click', function () {
            display.style.display = 'none';
            console.log('display')
        })
        visibility.addEventListener('click', function () {
            visibility.style.visibility = 'hidden';
            console.log('visibility')
        })
        opacity.addEventListener('click', function () {
            opacity.style.opacity = '0';
            console.log('opacity')
        })
    </script>
</body>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值