使用纯 CSS 媒体查询(最常用、最推荐)
这是最标准、最优雅的方法,通过检测屏幕宽度,在特定尺寸下直接隐藏菜单。

(图片来源网络,侵删)
核心思想: 当屏幕宽度小于某个“断点”(Breakpoint,768px)时,将菜单的 display 属性设置为 none。
示例代码:
假设你的 HTML 结构是这样的:
<div class="container">
<nav class="sidebar">
<ul class="tab-menu">
<li class="tab-item active"><a href="#tab1">首页</a></li>
<li class="tab-item"><a href="#tab2">产品</a></li>
<li class="tab-item"><a href="#tab3">关于我们</a></li>
<li class="tab-item"><a href="#tab4">联系</a></li>
</ul>
</nav>
<main class="content">
<h1>内容区域</h1>
<p>这里显示 Tab 对应的具体内容...</p>
</main>
</div>
你的 CSS 可能是这样:

(图片来源网络,侵删)
/* 基础样式 */
.container {
display: flex;
min-height: 100vh;
}
.sidebar {
width: 200px;
background-color: #f4f4f4;
padding: 20px;
}
.tab-menu {
list-style: none;
padding: 0;
margin: 0;
}
.tab-item a {
display: block;
padding: 10px 15px;
text-decoration: none;
color: #333;
border-radius: 5px;
margin-bottom: 5px;
}
.tab-item a:hover {
background-color: #ddd;
}
.tab-item.active a {
background-color: #007bff;
color: white;
}
.content {
flex: 1; /* 占据剩余所有空间 */
padding: 20px;
}
/* ---------------- 关键部分 ---------------- */
/* 当屏幕宽度小于 768px 时 */
@media (max-width: 768px) {
.sidebar {
/* 方法1:直接隐藏 */
display: none;
/* 或者,如果你想让它滑出/滑入,可以使用绝对定位和 transform */
/* position: absolute;
left: -200px; /* 将菜单移出可视区域 */
/* transition: left 0.3s ease-in-out; */
}
/* 如果使用了绝对定位,你可能需要一个汉堡菜单按钮来触发显示 */
/* .sidebar.show {
left: 0;
} */
}
优点:
- 简单直接: 只需要几行 CSS 代码。
- 性能好: 不依赖 JavaScript,浏览器原生支持。
- 无障碍性: 屏幕阅读器等辅助工具仍然可以“看到”菜单结构,只是视觉上隐藏了。
缺点:
- 无法手动控制: 用户无法在隐藏后手动显示菜单(除非配合 JavaScript,见方法二)。
结合 CSS 和 JavaScript(可手动控制)
如果你希望用户可以在菜单隐藏后,通过一个按钮(汉堡菜单”)来手动显示/隐藏菜单,就需要使用 JavaScript。
核心思想:

(图片来源网络,侵删)
- 在 HTML 中添加一个“汉堡菜单”按钮。
- 用 JavaScript 监听这个按钮的点击事件。
- 点击时,给
.sidebar添加或移除一个类(.active或.show)。 - 通过 CSS 定义这个类对应的样式,来控制菜单的显示和隐藏。
示例代码:
HTML:
<!-- 在 sidebar 前面添加汉堡菜单按钮 -->
<button class="menu-toggle" id="menuToggle">
<span></span>
<span></span>
<span></span>
</button>
<div class="container">
<nav class="sidebar" id="sidebar">
<!-- ... Tab 菜单内容 ... -->
</nav>
<main class="content">
<!-- ... 内容区域 ... -->
</main>
</div>
CSS:
/* 基础样式保持不变... */
/* 汉堡菜单按钮样式 */
.menu-toggle {
display: none; /* 默认在桌面端隐藏 */
position: fixed;
top: 20px;
left: 20px;
z-index: 1000;
background: none;
border: none;
cursor: pointer;
}
/* 在移动端显示汉堡菜单 */
@media (max-width: 768px) {
.menu-toggle {
display: block;
}
.sidebar {
/* 使用绝对定位,使其可以覆盖在内容上 */
position: fixed;
top: 0;
left: 0;
height: 100vh;
width: 250px;
z-index: 999;
transform: translateX(-100%); /* 默认向左滑出屏幕 */
transition: transform 0.3s ease-in-out;
}
/* 当 sidebar 有 .active 类时,滑入屏幕 */
.sidebar.active {
transform: translateX(0);
}
}
JavaScript:
// 等待 DOM 加载完成
document.addEventListener('DOMContentLoaded', () => {
const menuToggle = document.getElementById('menuToggle');
const sidebar = document.getElementById('sidebar');
// 监听按钮点击事件
menuToggle.addEventListener('click', () => {
// 切换 .active 类
sidebar.classList.toggle('active');
});
// 可选:点击内容区域时关闭菜单
const content = document.querySelector('.content');
content.addEventListener('click', () => {
if (window.innerWidth <= 768) { // 仅在移动端生效
sidebar.classList.remove('active');
}
});
});
优点:
- 用户体验好: 用户可以根据需要随时调出菜单。
- 灵活性高: 可以配合动画效果,让交互更流畅。
缺点:
- 需要 JavaScript: 如果用户禁用了 JS,功能将无法使用。
- 代码量稍多: 需要写 JS 逻辑。
使用 CSS 的 visibility 属性(特殊场景)
在某些情况下,你可能想隐藏菜单但又不希望它占用布局空间。visibility: hidden 可以实现这一点。
核心思想: visibility: hidden 会让元素变得不可见,但它原本占据的布局空间仍然保留。
示例代码:
.sidebar {
/* ... 其他样式 ... */
}
@media (max-width: 768px) {
.sidebar {
visibility: hidden; /* 隐藏,但位置保留 */
}
}
什么时候用?
- 非常罕见,通常用于制作复杂的动画效果,比如一个元素淡出后,另一个元素淡入,且它们不能重叠。
- 对于简单的隐藏菜单,
display: none通常是更好的选择,因为它能完全释放空间。
总结与建议
| 方法 | 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 纯 CSS 媒体查询 | display: none |
简单、高效、无 JS 依赖 | 无法手动控制 | 纯粹的响应式设计,不需要用户手动触发 |
| CSS + JavaScript | transform + JS |
用户体验好、灵活 | 需要 JS、代码稍多 | 现代移动端应用,有“汉堡菜单” |
CSS visibility |
visibility: hidden |
保留布局空间 | 占用空间,可能影响布局 | 特殊动画效果,不适用于常规菜单隐藏 |
我的建议是:
- 对于绝大多数响应式网站,优先使用【方法一:纯 CSS 媒体查询】,它是最简洁、最标准的解决方案。
- 如果你的目标是创建一个类似原生 App 的移动端体验,或者希望用户能随时访问菜单,请使用【方法二:CSS + JavaScript】,这是目前移动端 Web 应用的主流做法。
