You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现多层级CSS导航列表的响应式?寻求技术帮助

响应式多层级导航完整解决方案

我来帮你搞定这个响应式多层级导航的改造!下面是完整的可运行代码,包含基础样式、响应式适配和交互逻辑,每部分都做了清晰注释:

完整可运行代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Responsive Multi-level Nav</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        /* 基础全局样式 */
        body{
            margin: 0 auto;
            padding: 0;
            font-family: Arial, sans-serif;
        }
        nav{
            background: #333;
        }

        /* 小屏幕菜单触发按钮 */
        .toggle-nav{
            display: none;
            padding: 15px;
            color: #fff;
            text-decoration: none;
            background: #222;
        }
        .toggle-nav:hover{
            background: #111;
        }

        /* 大屏幕导航基础布局 */
        nav ul{
            list-style: none;
            margin: 0;
            padding: 0;
            display: flex;
            flex-wrap: wrap;
        }
        nav ul li{
            position: relative;
        }
        nav ul li a{
            display: block;
            padding: 15px 20px;
            color: #fff;
            text-decoration: none;
        }
        nav ul li a:hover{
            background: #444;
        }

        /* 二级菜单样式(大屏幕) */
        nav ul li ul{
            position: absolute;
            top: 100%;
            left: 0;
            background: #444;
            display: none;
            flex-direction: column;
            min-width: 200px;
        }
        nav ul li:hover > ul{
            display: flex;
        }

        /* 三级及更深层级菜单(大屏幕) */
        nav ul li ul li ul{
            left: 100%;
            top: 0;
        }

        /* 响应式适配:小屏幕(≤768px) */
        @media (max-width: 768px) {
            .toggle-nav{
                display: block;
            }
            nav ul{
                flex-direction: column;
                display: none; /* 默认隐藏主菜单 */
            }
            nav ul.active{
                display: flex; /* 点击按钮后展开 */
            }
            /* 小屏幕子菜单改为静态布局,避免溢出 */
            nav ul li ul{
                position: static;
                background: #555;
                display: none;
            }
            nav ul li ul.active{
                display: flex;
            }
            /* 给带自菜单的项添加下拉指示器 */
            nav ul li.has-submenu > a::after{
                content: ' ▼';
                font-size: 0.8em;
            }
        }
    </style>
</head>
<body>
    <nav>
        <a href="#" class="toggle-nav">菜单</a>
        <ul>
            <li><a href="#">首页</a></li>
            <li class="has-submenu">
                <a href="#">产品</a>
                <ul>
                    <li><a href="#">产品A</a></li>
                    <li class="has-submenu">
                        <a href="#">产品B系列</a>
                        <ul>
                            <li><a href="#">B1型号</a></li>
                            <li><a href="#">B2型号</a></li>
                        </ul>
                    </li>
                    <li><a href="#">产品C</a></li>
                </ul>
            </li>
            <li><a href="#">关于我们</a></li>
            <li class="has-submenu">
                <a href="#">服务</a>
                <ul>
                    <li><a href="#">售后支持</a></li>
                    <li><a href="#">定制服务</a></li>
                </ul>
            </li>
            <li><a href="#">联系我们</a></li>
        </ul>
    </nav>

    <script>
        jQuery(document).ready(function() {
            // 顶部主菜单展开/收起
            jQuery('.toggle-nav').click(function(e) {
                jQuery(this).toggleClass('active');
                jQuery('nav ul').toggleClass('active');
                e.preventDefault();
            });

            // 小屏幕下子菜单展开/收起逻辑
            jQuery('.has-submenu > a').click(function(e) {
                if (jQuery(window).width() <= 768) {
                    e.preventDefault();
                    jQuery(this).next('ul').toggleClass('active');
                    jQuery(this).parent('.has-submenu').toggleClass('open');
                }
            });

            // 窗口尺寸变化时重置菜单状态(避免大屏/小屏切换时布局错乱)
            jQuery(window).resize(function() {
                if (jQuery(window).width() > 768) {
                    jQuery('nav ul').removeClass('active');
                    jQuery('.toggle-nav').removeClass('active');
                    jQuery('nav ul ul').removeClass('active');
                }
            });
        });
    </script>
</body>
</html>

核心功能说明

1. 双模式适配

  • 大屏幕(>768px):保持传统水平导航,子菜单通过hover展开,层级清晰
  • 小屏幕(≤768px):隐藏主菜单,显示"菜单"触发按钮;点击按钮展开主菜单,点击带下拉指示器的菜单项展开对应子菜单

2. 关键优化点

  • 添加了viewport meta标签,确保移动设备正确识别屏幕宽度
  • 小屏幕下子菜单改为静态布局,避免绝对定位导致的溢出问题
  • 窗口尺寸变化时自动重置菜单状态,防止布局错乱
  • 给带自菜单的项添加了视觉指示器,提升用户体验

如果需要调整响应式断点(比如把768px改成其他宽度),只需要同步修改CSS媒体查询和jQuery中的判断数值即可。

内容的提问来源于stack exchange,提问作者Medli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:53:30