Bootstrap多级下拉菜单超出屏幕右侧问题求助
解决Bootstrap多级下拉菜单超出屏幕右侧的问题
当前实现仅处理了一级下拉菜单的对齐逻辑,内层子菜单未做屏幕边界检测,导致空间不足时会超出屏幕右侧。以下是优化后的完整解决方案:
修改后的完整代码
HTML
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Dropdown Menu Alignment</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous"> <style> /* 自定义CSS */ body { font-family: Verdana, Geneva, Tahoma, sans-serif; } .navbar { display: flex; flex-direction: column; justify-content: space-between; align-items: center; padding: 10px; background-color: dimgrey; width: 100%; } .navbar-top { display: flex; justify-content: space-between; width: 100%; align-items: center; } .navbar-left { display: flex; align-items: center; } .navbar-brand { margin-right: 20px; } .switch-role-form { display: flex; align-items: center; } .switch-role { margin-right: 10px; } .welcome-message { color: blue; text-align: right; } .logout-button { top: 10px; right: 10px; } .navbar-nav { display: flex; justify-content: center; width: 100%; background-color: palevioletred; } .dropdown-menu li { position: relative; } /* 默认子菜单向右展开 */ .dropdown-menu .dropdown-submenu { display: none; position: absolute; left: 100%; top: -7px; } /* 子菜单向左展开的类 */ .dropdown-submenu-left { right: 100%; left: auto; } .dropdown-menu>li:hover>.dropdown-submenu { display: block; } .nav-item:hover>.dropdown-menu { display: block; } .dropdown-submenu:hover>.dropdown-menu { display: block; } .navbar-expand-lg { width: 100%; display: flex; justify-content: center; } /* 一级下拉菜单右对齐类 */ .dropdown-menu-end { left: auto; right: 0; } </style> </head> <body> <div class="navbar"> <nav class="navbar navbar-expand-lg bg-body-tertiary"> <div class="container-fluid"> <ul class="navbar-nav"> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false"> Menu Item </a> <ul class="dropdown-menu dropdown-menu-end"> <!-- 默认右对齐 --> <li> <a class="dropdown-item" href="#">Submenu Item »</a> <ul class="dropdown-menu dropdown-submenu"> <li><a class="dropdown-item" href="#">Submenu Item 1</a></li> <li><a class="dropdown-item" href="#">Submenu Item 2</a></li> </ul> </li> <li><a class="dropdown-item" href="#">Another Item</a></li> </ul> </li> </ul> </div> </nav> </div> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script> <script> // 动态调整下拉菜单对齐的函数 function adjustDropdownAlignment() { $('.dropdown-menu').each(function() { var $menu = $(this); var rect = $menu[0].getBoundingClientRect(); // 处理一级下拉菜单 if ($menu.hasClass('dropdown-menu-end')) { if (rect.right > window.innerWidth) { $menu.removeClass('dropdown-menu-end'); } else { $menu.addClass('dropdown-menu-end'); } } // 处理子菜单 if ($menu.hasClass('dropdown-submenu')) { if (rect.right > window.innerWidth) { $menu.addClass('dropdown-submenu-left'); } else { $menu.removeClass('dropdown-submenu-left'); } } }); } $(document).ready(function() { // 鼠标悬停时触发调整 $('.nav-item.dropdown, .dropdown-submenu').on('mouseenter', adjustDropdownAlignment); // 窗口大小变化时重新调整 $(window).on('resize', adjustDropdownAlignment); }); </script> </body> </html>
关键修改说明
- 默认对齐设置:给一级下拉菜单默认添加
dropdown-menu-end类,实现初始右对齐 - 全层级检测:遍历所有下拉菜单(包括子菜单),分别处理一级菜单和子菜单的边界检测逻辑
- 响应窗口变化:添加窗口
resize事件监听,确保窗口大小改变时重新计算菜单位置 - 子菜单切换逻辑:当子菜单右侧超出屏幕时,添加
dropdown-submenu-left类切换为向左展开
内容的提问来源于stack exchange,提问作者Yuvraj Jadhav
相关产品推荐
相关产品推荐

