一、CSS 隐藏方式
1. display: none ⭐️ 最常用
.hide {
display: none;
}
特点:
- 元素完全从渲染树中移除,不占据空间
- 不会触发点击等事件
- 会引起重排和重绘(性能影响较大)
- 屏幕阅读器无法读取,对可访问性不友好
2. visibility: hidden
.hide {
visibility: hidden;
}
特点:
- 元素不可见,但仍占据布局空间
- 不会响应鼠标事件
- 只会引起重绘(比重排性能好)
- 子元素可通过
visibility: visible重新显示 - 屏幕阅读器可能读取(取决于实现)
3. opacity: 0
.hide {
opacity: 0;
}
特点:
- 元素完全透明,但保留布局空间
- 仍能响应事件(除非配合
pointer-events: none) - 支持CSS过渡动画
- 屏幕阅读器可以读取
- 适合淡入淡出效果
4. position + 移出视口
.hide {
position: absolute;
left: -9999px;
top: -9999px;
}
/* 或 */
.hide {
position: fixed;
transform: translateX(-100vw);
}
特点:
- 视觉上隐藏,屏幕阅读器可正常读取
- 仍保留在DOM中,占用内存
- 适合隐藏但需要可访问性的内容(如导航标签)
5. clip-path / clip
.hide {
clip-path: polygon(0 0, 0 0, 0 0, 0 0);
}
/* 旧版写法 */
.hide {
position: absolute;
clip: rect(0 0 0 0);
}
特点:
- 裁剪元素使其不可见
- 占据布局空间,屏幕阅读器可读取
- 适合隐藏部分内容
6. transform: scale(0)
.hide {
transform: scale(0);
/* 可选:彻底隐藏 */
width: 0;
height: 0;
overflow: hidden;
}
特点:
- 元素缩放到0,视觉上消失
- 配合尺寸设为0可完全不占空间
- 支持动画过渡
7. 尺寸归零 + overflow: hidden
.hide {
width: 0;
height: 0;
overflow: hidden;
/* 可选清除内边距 */
padding: 0;
margin: 0;
border: 0;
}
特点:
- 完全不占空间
- 内容被溢出隐藏
- 屏幕阅读器行为不确定
8. 滤镜隐藏
.hide {
filter: opacity(0); /* 类似 opacity: 0 */
}
二、HTML 属性隐藏
hidden 属性 ⭐️ HTML5标准
<div hidden>隐藏内容</div>
特点:
- HTML5原生属性,相当于
display: none - 语义化明确
- 浏览器默认样式:
[hidden] { display: none } - 屏幕阅读器不读取
三、JavaScript 隐藏方式
1. style.display
element.style.display = 'none'; // 隐藏
element.style.display = ''; // 显示(恢复原状)
2. classList 操作
// 隐藏
element.classList.add('hidden-class');
// 显示
element.classList.remove('hidden-class');
// 切换
element.classList.toggle('hidden-class');
3. remove() / detach()
// 完全移除元素
element.remove();
// jQuery
$(element).detach(); // 保留数据和事件
四、特殊隐藏场景
1. 隐藏但保留可访问性
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
用途: 屏幕阅读器专用内容
2. 占位符隐藏
.hide-with-placeholder {
color: transparent;
background-color: transparent;
border-color: transparent;
}
用途: 保持布局结构
3. 内容隐藏
.hide-content {
font-size: 0;
line-height: 0;
color: transparent;
}
五、对比总结表
| 方法 | 占据空间 | 事件响应 | 重排/重绘 | 动画支持 | 可访问性 | 使用场景 |
|---|---|---|---|---|---|---|
| display: none | ❌ 否 | ❌ 否 | 重排+重绘 | ❌ 否 | ❌ 不可读 | 完全移除元素 |
| visibility: hidden | ✅ 是 | ❌ 否 | 仅重绘 | ❌ 否 | ⚠️ 可能读 | 保留布局位置 |
| opacity: 0 | ✅ 是 | ✅ 是 | 仅重绘 | ✅ 是 | ✅ 可读 | 淡入淡出动画 |
| position移出 | ❌ 否 | ⚠️ 视情况 | 重排+重绘 | ✅ 是 | ✅ 可读 | 屏幕阅读器内容 |
| hidden属性 | ❌ 否 | ❌ 否 | 重排+重绘 | ❌ 否 | ❌ 不可读 | HTML5语义化隐藏 |
| width/height: 0 | ❌ 否 | ❌ 否 | 重排+重绘 | ✅ 是 | ⚠️ 不确定 | 动态展开内容 |
| transform: scale(0) | ✅ 是 | ⚠️ 视情况 | 仅重绘 | ✅ 是 | ✅ 可读 | 缩放动画效果 |
六、最佳实践建议
根据需求选择:
- 需要完全移除元素 →
display: none或hidden属性 - 需要动画效果 →
opacity: 0或transform: scale(0) - 需要保留布局空间 →
visibility: hidden - 需要屏幕阅读器读取 →
position移出视口 或sr-only类 - 需要临时切换显示 → 使用
classList.toggle() - 需要性能优化 → 避免频繁使用
display: none(引起重排)
性能优化技巧:
/* 使用 will-change 优化动画 */
.fade-element {
opacity: 1;
transition: opacity 0.3s;
will-change: opacity;
}
.fade-element.hidden {
opacity: 0;
pointer-events: none; /* 禁用事件 */
}
可访问性考虑:
- 使用
aria-hidden="true"辅助隐藏 - 确保隐藏内容对键盘导航友好
- 测试屏幕阅读器行为
选择隐藏方式时,需综合考虑布局影响、交互需求、动画效果、可访问性和性能表现。