CSS 中 display:none 和 visibility:hidden 的区别是什么?
比较 display: none 和 visibility: hidden 的区别及其对布局的影响。
display: none
和 visibility: hidden
都可以隐藏元素,但它们在文档布局、渲染行为和继承等方面存在关键差异:
- 空间占用与文档流影响:
display: none
:元素被完全移除文档流,不占据任何空间,如同不存在一样。页面的布局重新调整以适应移除的元素。示例:切换display: none
时,相邻元素会自动填补空白,导致布局回流(reflow)。visibility: hidden
:元素视觉上隐藏但保持占用原位置,不影响整体布局。示例:切换该值,页面位置保留,内容不重新计算。
- 浏览器渲染与性能:
display: none
:切换时会触发全局回流(reflow),浏览器必须重构渲染树,性能开销较大。visibility: hidden
:仅导致重绘(repaint),元素位置不变,性能更轻量。
- 子元素继承:
display: none
:该属性不可继承;父元素的display: none
会强制隐藏所有子元素,子元素不能覆盖。visibility: hidden
:属性可继承,但子元素可通过设置visibility: visible
单独显示:.parent { visibility: hidden; /* 子默认隐藏 */ } .child { visibility: visible; /* 此子元素可见 */ }
- 支持动画与交互:
display: none
:元素被移除树状结构,无法应用任何动画效果。visibility: hidden
:可与opacity: 0
结合创建淡入淡出动画:.hidden-element { visibility: hidden; opacity: 0; transition: all 0.3s ease; } .hidden-element.active { visibility: visible; opacity: 1; }
- 实际应用场景:
display: none
适用于临时移除元素(如折叠菜单),布局变化显著场合。visibility: hidden
更适合保留空间结构(如隐藏后恢复内容)或实现平滑过渡动画。
注意:两者都不可用于键盘或屏幕阅读器访问,若需完全隐藏但对辅助工具可用,可使用 .sr-only
类或其他隐藏方法结合 aria-hidden=true
。