区别
| display: none | visibility: hidden | opacity: 0 | |
|---|---|---|---|
| 是否占据页面空间 | 不占据 | 占据 | 占据 |
| 子元素设置该属性,其他值是否可以继续显示 | 不可以 | 可以 | 不可以 |
| 自身绑定的事件是否能继续触发 | 不能触发 | 不能触发 | 能触发 |
| 是否影响遮挡住的元素触发事件 | 不影响 | 不影响 | 影响 |
| 属性值改变是否产生回流 | 产生 | 不产生 | 不产生 |
| 属性值改变是否产生重绘 | 产生 | 产生 | 不一定产生 |
| 该属性是否支持transition | 不支持 | 支持 | 支持 |
一. 共同点
- 都可以隐藏元素,让元素不可见
二. 不同点
-
空间占据
- display: none会使元素脱离文档流,不占据原来的空间,页面重新渲染。
- visibility: hidden和opacity: 0 虽然会使元素不可见,但是元素仍然占据原来的位置。
-
回流与渲染
- dispaly 属性会产生回流,而 opacity 和 visibility 属性不会产生回流
- dispaly 和 visibility 属性会产生重绘,而 opacity 属性不一定会产生重绘。
使用visibility:hidden比display:none性能上要好。
回流必将引起重绘,而重绘不一定会引起回流。
-
子元素继承
- display: none,不会被子元素继承,会一起隐藏,并且当子元素设置display:block属性时并无效果。
- opacity:0也是一样的。当父级已经设置opacity:0后,子元素是基于父元素的opacity:0基础上的opacity值。无论子元素设置opacity为多大时均无效果。
- visibility:hidden 会被子元素继承,可以通过设置子元素visibility:visibile时会让子元素显示出来。
-
事件绑定
- display:none属性使该元素无法再触发事件。
- visibility:hidden也无法触发事件。
- opacity: 0仍然可以触发事件
-
动画效果
- display: none无法使用transition动画的,不会呈现过渡的效果
- transition是支持visibility的,visibility过渡过程的值范围是0-1,但是当visibility的值大于0就显示,所以不支持淡入淡出。transform:visibility会立即显示,隐藏时会延时
- 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>
</head>
<body>
<div class="container">
<div class="target">
<p>I am target, and you ?</p>
</div>
</div>
<style>
.container {
margin: 0 auto;
width: 500px;
min-height: 30px;
background-color: skyblue;
}
.target {
width: 200px;
height: 50px;
line-height: 50px;
text-align: center;
margin: 0 auto;
background-color: plum;
color: #fff;
transition: all linear 1s;
cursor: pointer;
}
.clickBlock {
display: none;
}
.clickVisibility {
visibility: hidden;
}
.clickOpacity {
opacity: 0;
}
.clickRgba {
background-color: rgba(221, 160, 221, 0);
}
.clickZindex {
z-index: -1;
position: absolute;
}
</style>
<script>
const _target = document.getElementsByClassName("target")[0];
_target.onclick = (() => {
let i = 1; // click 次数
return () => {
// _target.attributes.class.value += " clickBlock";
// _target.attributes.class.value += " clickVisibility";
// _target.attributes.class.value += " clickOpacity";
// _target.attributes.class.value += " clickRgba";
_target.attributes.class.value += " clickZindex";
console.log(`第${i}次点击`);
i++;
}
})();
</script>
</body>
</html>
rgba
- background:rgba(R, G, B, 0),只是背景颜色透明,元素透明,依然占据空间。
- background:rgba(R, G, B, 0)不会被子元素继承
- 依然能触发已经绑定的事件。
- transition有效。
z-index: -1
- 在元素当前dom脱离文档流(position:absolute)的前提下,设置z-index才起作用。
- 设置z-index:-1本质是改变当前dom的层叠上下文,使器置于其他元素之下,达到被隐藏的目的。
- 部分重排,不影响其他图层布局
- 被其他元素遮挡部分,无法响应事件,即使上层元素设置了pointer-events:none;也无法点击到(注:这个属性会被继承的)