隐藏元素的这些细节,你都知道吗?

2,065 阅读4分钟

display: none

  • 这是我们开发过程中使用到的最多的一种方式,这种隐藏方式会将元素彻底从页面中删除,不会触发任何事件
  • 元素也不占用任何空间,但通过该属性控制显示隐藏,会导致页面的回流和重绘
  • 其子孙元素即使重新设置display: block也无法显示
  • 读屏软件无法读到该元素的内容
.hide{
  display: none;
}

visibility: hidden

  • 相当于是该元素现在是透明的了,元素在页面中仍占据空间,但是不会响应绑定的监听事件
  • 该属性是可以继承的,所以如果不显式的设置其子元素的属性,则其子元素的visibility也为hidden,但若将其子元素显式设置 visibility: visible,则该子元素依然可见,并且绑定的事件能够生效,并且可以通过冒泡触发父元素绑定的事件
    • 所以如果点击了下方的son元素,控制台会依次打印sonfather
  • 这种方式会触发页面的重绘,但是不会触发页面回流
  • 元素在读屏软件中也会被隐藏
<style>
  .father {
    visibility: hidden;
    width: 400px;
    height: 400px;
    margin-bottom: 20px;
    color: #fff;
    background-color: #000;
  }
  
  .son {
    visibility: visible;
    width: 100px;
    height: 100px;
    background-color: red;
  }
</style>

<body>
  <div class="father">
    <div class="son"></div>
  </div>
</body>
<script>
  const father = document.querySelector('.father')
  const son = document.querySelector('.son')
  // 由于子元素设置了visibility: visible;所以其依然是可见的,并且能够通过点击触发点击事件
  son.addEventListener('click', () => {
    console.log('son');
  })
  // 子元素被点击后会通过冒泡触发父元素绑定的点击事件
   father.addEventListener('click', () => {
    console.log('father');
  })
</script>

opacity: 0

  • 将元素的透明度设置为 0,以此来实现元素的隐藏,元素实际还是在页面存在的,仍然在页面中占据着空间
  • 即使其子孙元素重新设置了opacity: 1也无法显示
  • opacity 不同的是它能响应元素绑定的监听事件
  • 此外,元素和它所有的内容会被读屏软件阅读
.hide{
  opacity: 1;
}

position: absolute

假设有一个元素你想要与它交互,但是你又不想让它影响你的网页布局,没有合适的属性可以处理这种情况(opacity 和 visibility 影响布局, display 不影响布局但又无法直接交互)。在这种情况下,你只能考虑将元素移出可视区域

  • 视觉上的隐藏,实际显示在屏幕的可视区之外,以此来实现元素的隐藏
  • 绝对定位会脱离文档流,不会占据空间,不影响其他元素的布局,且响应元素绑定的监听事件
  • 元素的内容可以被读屏软件读取
.hide{
  position: absolute;
  top: -999999px;
  left: -999999px;
}

z-index

  • z-index 只适用于元素有定位(position值不为static)的情况
  • 来使其他元素遮盖住该元素,以而实现隐藏
<style>
  .element1 {
    width: 400px;
    height: 400px;
    background-color: #000;
  }
  
  .element2 {
    position: absolute;
    top: 0;
    left: 0;
    z-index: -1;
    width: 100px;
    height: 100px;
    background-color: red;
  }
</style>

<body>
  <div class="element1"></div>
  <div class="element2"></div>
</body>

可以看到开启了绝对定位的红色盒子element2被遮挡住了

clip-path

  • clip-path 属性使用裁剪方式创建元素的可显示区域。区域内的部分显示,区域外的隐藏。可以指定一些特定形状,当我们指定的形状大小为0时,就可以实现元素的隐藏
  • 元素仍在页面中占据位置,但是不会响应绑定的监听事件(区域内和区域外的都不会)
.hide{
    clip-path: polygon(0px 0px,0px 0px,0px 0px,0px 0px);
}

transform: scale(0)或transform: translate(-9999px, -9999px)

  1. transform: scale(0)
  • 将元素缩放为 0,来实现元素的隐藏
  • 元素的内容可以被读屏软件读取
  • 元素仍在页面中占据位置,但是不会响应绑定的监听事件
  1. transform: translate(-9999px, -9999px)
  • 视觉上的隐藏,隐藏元素的依然占据着空间,影响其他元素的布局
  • 元素的内容可以被读屏软件读取
.hide{
  transform: scale(0);
}
// 或
.hide{
  transform: translate(-9999px, -9999px);
}

设置height、width属性为0,再结合overflow: hidden进行隐藏

  • 这种方式就是通过将元素的宽高设置为0,使其不占据页面空间,最好将display设置为block,因为给行内元素设置宽高不会生效
  • 使用属性overflow:hidden控制其子元素的隐藏,并清除会影响页面的布局的属性,比如marginpaddingborder
  • 视觉上的隐藏,隐藏元素的不会占据任何空间,不会影响其他元素的布局,用户无法与其进行直接的交互
.hide{
  display:block;
  overflow:hidden;
  width:0;
  height:0;
  padding:0;
  margin:0border:0;
}

hidden

  • HTML5新增的hidden属性,可以直接隐藏元素
  • display: none表现一致
<div hidden>
  我是被隐藏的元素
</div>

补充:单独隐藏文字的方法

  1. text-indent:-9999
  • 只能达到隐藏文字的效果,没有其他副作用
  • 想进行SEO优化但又不想显示这段文字,就可以使用这个方法
.hide{
  text-indent:-9999;
}
  1. font-size:0px
  • 隐藏文字的效果,没有其他副作用

总结

实现元素显示隐藏的方式有多种,在开发中具体采用哪种实现方式,要考虑到显示隐藏操作引发的回流与重绘问题

隐藏方式占据原来的空间直接跟用户交互直接响应DOM事件
opacity
visibility
display
hidden
position
clip-path
overflow
transform

参考文章

juejin.cn/post/708455…

juejin.cn/post/690553…

juejin.cn/post/684490…

www.cnblogs.com/pssp/p/5902…