什么是左侧导航菜单?

在手机等小屏幕设备上,由于屏幕空间有限,将所有导航项都水平或垂直堆叠在顶部会占用大量宝贵空间,左侧导航菜单通过一个“汉堡菜单”图标(☰)来触发,点击后菜单会从屏幕左侧滑出,覆盖或推挤主内容区域,为用户提供一个集中的导航选择。

手机网页 左侧导航菜单
(图片来源网络,侵删)

视觉示例:


实现方式 (HTML, CSS, JavaScript)

这里提供两种最主流的实现方式:纯CSS实现和JS增强实现。

纯CSS实现 (简单、轻量)

这种方式使用CSS的 checked 伪类来控制菜单的显示和隐藏,无需JavaScript,非常适合简单的场景。

核心思路:

手机网页 左侧导航菜单
(图片来源网络,侵删)
  1. 一个 checkbox 作为隐藏的控制器。
  2. 一个 label 用于点击,样式做成汉堡菜单图标。
  3. 导航菜单默认是隐藏的(left: -100%)。
  4. checkbox 被选中时,通过 checked 选择器将菜单滑入(left: 0)。

代码示例:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">手机左侧导航菜单</title>
    <style>
        /* 基础样式和重置 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            background-color: #f4f4f4;
        }
        /* 主内容区域 */
        .main-content {
            padding: 20px;
            transition: margin-left 0.3s ease-in-out; /* 为内容添加过渡效果 */
        }
        .main-content h1 {
            color: #333;
        }
        /* 汉堡菜单按钮 */
        .menu-toggle {
            position: fixed;
            top: 20px;
            left: 20px;
            z-index: 1001;
            width: 40px;
            height: 40px;
            background-color: #fff;
            border: 1px solid #ddd;
            border-radius: 5px;
            cursor: pointer;
            display: flex;
            flex-direction: column;
            justify-content: space-around;
            align-items: center;
        }
        .menu-toggle span {
            display: block;
            width: 25px;
            height: 3px;
            background-color: #333;
            border-radius: 2px;
        }
        /* 隐藏的复选框 */
        #menu-checkbox {
            display: none;
        }
        /* 导航菜单容器 */
        .nav-menu {
            position: fixed;
            top: 0;
            left: -100%; /* 默认隐藏在屏幕外 */
            width: 250px;
            height: 100vh;
            background-color: #2c3e50;
            padding-top: 80px;
            transition: left 0.3s ease-in-out; /* 滑动过渡效果 */
            z-index: 1000;
        }
        /* 当复选框被选中时,菜单滑入 */
        #menu-checkbox:checked ~ .nav-menu {
            left: 0;
        }
        /* 当菜单打开时,主内容向右移动 */
        #menu-checkbox:checked ~ .main-content {
            margin-left: 250px;
        }
        /* 导航链接样式 */
        .nav-menu a {
            display: block;
            padding: 15px 25px;
            color: #ecf0f1;
            text-decoration: none;
            border-bottom: 1px solid #34495e;
            transition: background-color 0.3s;
        }
        .nav-menu a:hover {
            background-color: #34495e;
        }
    </style>
</head>
<body>
    <!-- 隐藏的复选框控制器 -->
    <input type="checkbox" id="menu-checkbox">
    <!-- 汉堡菜单按钮 -->
    <label for="menu-checkbox" class="menu-toggle">
        <span></span>
        <span></span>
        <span></span>
    </label>
    <!-- 导航菜单 -->
    <nav class="nav-menu">
        <a href="#">首页</a>
        <a href="#">产品</a>
        <a href="#">服务</a>
        <a href="#">关于我们</a>
        <a href="#">联系方式</a>
    </nav>
    <!-- 主内容区域 -->
    <main class="main-content">
        <h1>主内容区域</h1>
        <p>点击左上角的汉堡菜单图标来打开导航。</p>
        <p>当菜单打开时,这段内容会向右移动。</p>
    </main>
</body>
</html>

JavaScript增强实现 (更灵活、功能更强)

纯CSS方案在功能上有所局限(点击菜单项后无法自动关闭菜单),使用JavaScript可以提供更灵活的控制和更好的用户体验。

核心思路:

  1. 通过JS监听汉堡菜单的点击事件。
  2. 切换菜单容器的 class(添加/移除 active)。
  3. 可以同时监听菜单项的点击事件,实现点击后自动关闭菜单。

代码示例 (使用原生JS):

手机网页 左侧导航菜单
(图片来源网络,侵删)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">JS增强版左侧导航菜单</title>
    <style>
        /* 基础样式与方案一类似,但通过class控制 */
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { font-family: sans-serif; background-color: #f4f4f4; }
        .main-content {
            padding: 20px;
            transition: margin-left 0.3s ease-in-out;
        }
        .main-content h1 { color: #333; }
        .menu-toggle {
            position: fixed;
            top: 20px;
            left: 20px;
            z-index: 1001;
            width: 40px;
            height: 40px;
            background-color: #fff;
            border: 1px solid #ddd;
            border-radius: 5px;
            cursor: pointer;
            display: flex;
            flex-direction: column;
            justify-content: space-around;
            align-items: center;
        }
        .menu-toggle span {
            display: block;
            width: 25px;
            height: 3px;
            background-color: #333;
            border-radius: 2px;
            transition: all 0.3s ease-in-out; /* 为汉堡图标添加动画 */
        }
        .nav-menu {
            position: fixed;
            top: 0;
            left: -250px; /* 默认隐藏 */
            width: 250px;
            height: 100vh;
            background-color: #2c3e50;
            padding-top: 80px;
            transition: left 0.3s ease-in-out;
            z-index: 1000;
        }
        /* 添加 active class 来显示菜单 */
        .nav-menu.active {
            left: 0;
        }
        .main-content.active {
            margin-left: 250px;
        }
        .nav-menu a {
            display: block;
            padding: 15px 25px;
            color: #ecf0f1;
            text-decoration: none;
            border-bottom: 1px solid #34495e;
        }
        .nav-menu a:hover { background-color: #34495e; }
    </style>
</head>
<body>
    <button class="menu-toggle" id="menuButton">
        <span></span>
        <span></span>
        <span></span>
    </button>
    <nav class="nav-menu" id="navMenu">
        <a href="#" data-link="home">首页</a>
        <a href="#" data-link="products">产品</a>
        <a href="#" data-link="services">服务</a>
        <a href="#" data-link="about">关于我们</a>
        <a href="#" data-link="contact">联系方式</a>
    </nav>
    <main class="main-content" id="mainContent">
        <h1>主内容区域</h1>
        <p>这个版本使用JavaScript来控制菜单的开关。</p>
        <p>点击菜单项后,菜单会自动关闭。</p>
    </main>
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            const menuButton = document.getElementById('menuButton');
            const navMenu = document.getElementById('navMenu');
            const mainContent = document.getElementById('mainContent');
            const navLinks = document.querySelectorAll('.nav-menu a');
            // 切换菜单的函数
            function toggleMenu() {
                navMenu.classList.toggle('active');
                mainContent.classList.toggle('active');
                // 汉堡图标动画
                menuButton.classList.toggle('active');
            }
            // 点击汉堡按钮,切换菜单
            menuButton.addEventListener('click', toggleMenu);
            // 点击导航链接,关闭菜单
            navLinks.forEach(link => {
                link.addEventListener('click', (event) => {
                    event.preventDefault(); // 阻止默认跳转行为,实际项目中可能需要
                    toggleMenu();
                });
            });
            // 点击菜单外部区域,关闭菜单 (可选,但推荐)
            document.addEventListener('click', (event) => {
                if (!navMenu.contains(event.target) && !menuButton.contains(event.target)) {
                    if (navMenu.classList.contains('active')) {
                        toggleMenu();
                    }
                }
            });
        });
    </script>
</body>
</html>

设计与用户体验最佳实践

设计一个优秀的手机导航菜单,不仅要实现功能,更要考虑用户体验。

优点:

  • 节省空间: 释放了宝贵的屏幕顶部和侧边空间。
  • 焦点集中: 将所有导航选项集中在一个地方,用户可以快速找到。
  • 设计感强: 滑动动画和覆盖效果可以提供现代、流畅的交互体验。

缺点与注意事项:

  • 发现性差: 新用户可能不知道左上角的图标可以点击。
  • 操作路径长: 相比于顶部固定导航,用户需要多一次点击才能访问深层页面。
  • 内容遮挡: 覆盖式菜单会完全遮挡主内容,而推挤式则会使内容变形。

最佳实践建议:

  1. 清晰的图标: 使用标准的“三条横线”汉堡图标,如果菜单已打开,图标可以变为“X”或向左的箭头 <,提供明确的关闭信号。
  2. 流畅的动画: 使用CSS transition 实现平滑的滑入/滑出效果,这能极大地提升用户体验。
  3. 层级感: 确保菜单的 z-index 高于主内容,使其始终位于最上层。
  4. 点击菜单项后关闭: 这是最重要的实践之一,用户选择了一个选项后,菜单应该自动关闭,让用户能立刻看到所选内容。
  5. 支持点击外部关闭: 允许用户点击菜单外的任意区域来关闭菜单,这符合用户直觉。
  6. 考虑“返回顶部”: 当用户在长页面中打开菜单时,可以提供一个“返回顶部”的选项。
  7. 避免过深的嵌套: 如果菜单项本身还有子菜单,要谨慎设计,可以考虑在点击子菜单项时,在同一区域向右滑动显示二级菜单,而不是再次打开一个全屏覆盖层,这会非常混乱。
  8. 响应式设计: 在桌面等大屏幕上,左侧导航菜单可以设计成始终显示的侧边栏,而不是抽屉式,这样导航效率更高。

希望这份详细的指南能帮助你完美地实现手机网页的左侧导航菜单!