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>