面试取经:Display & Visbility & Opacity三者的区别

216 阅读1分钟

display:none

  • DOM结构:浏览器不会渲染display属性为none的元素,不占据空间
  • 事件监听:无法进行DOM事件监听;
  • 性能:动态改变此属性会引起重排,性能较差;
  • 继承:不会被子元素继承,毕竟子类也不会渲染;
  • transition:transition不支持display。

visibility:hidden

  • DOM结构:元素被隐藏,但是会渲染不会消失,占据空间
  • 事件监听:无法进行DOM事件监听;
  • 性能:动态改变此属性时会引起重绘,性能较高;
  • 继承:会被子元素继承,子元素可以通过设置visibility:visible; 来取消隐藏
  • transition:visibility 会立即显示,隐藏时会延时。

opacity:0

  • DOM结构:透明度为100%,元素隐藏占据空间
  • 事件监听:可以进行DOM事件监听;
  • 性能:提升为合成层,不会触发重绘,性能较高;
  • 继承:会被子元素继承,但子元素不能通过opacity:1来取消隐藏
  • transition:opacity 可以延时显示和隐藏。

演示代码

<!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>
        .div1{
            width: 200px;
            height: 200px;
            background-color: red;
            display: none;
        }
        .div2{
            width: 200px;
            height: 200px;
            background-color: red;
            visibility: hidden;
        }
        .div3{
            width: 200px;
            height: 200px;
            background-color: red;
            opacity: 0;
        }
        .child{
            width: 100px;
            height: 100px;
            background-color: blue;
            /* visibility: visible; */
            opacity: 1;
        }
    </style>
</head>
<body>
    <div class="div1" onclick="handleClick()">
        <div class="child">我是子盒子</div>
    </div>
    <div class="div2" onclick="handleClick()">
        <div class="child">我是子盒子</div>
    </div>
    <div class="div3" onclick="handleClick()">
        <div class="child">我是子盒子</div>
    </div>
    <script>
     function handleClick(){
            console.log('被点击了');
        }
    </script>
</body>
</html>