javascript - 如何使 Bootstrap 拆分按钮下拉菜单看起来像折叠导航栏中的标准下拉菜单
问题描述
我正在尝试制作一个包含拆分下拉按钮的导航栏,但是当屏幕很窄并且导航栏在切换开关后面折叠时它看起来不对,或者当屏幕很宽并且导航栏没有折叠时它看起来不对。
我正在使用 Bootstrap 5.0.2。
我发现了将类添加到按钮组的建议d-table
,在垂直模式下看起来不错,但在水平模式下却不行,如下所示:
如果我在按钮组中没有 d-table 类,它在垂直模式下看起来很奇怪,在水平模式下看起来很好,如下所示:
作为参考,我希望它在小屏幕上看起来像这样,只需使用拆分按钮:
一种可能的解决方案是使用 Javascript 根据屏幕宽度添加/删除 d-table 类,但我想避免对屏幕宽度值进行硬编码。如果有某种方法可以检测导航栏何时崩溃,那也可以。
这是我用于此示例的代码:
CSS:
.dropdown-toggle-split {
border: none;
outline: none;
position: relative;
}
.dropdown-toggle-split::before {
background: #444444;
position: absolute;
content: "";
left: 0;
bottom: 25%;
height: 50%;
width: 1px;
box-sizing: content-box;
}
.dropdown-toggle-split {
padding-left: .5rem !important;
}
.dropdown-link {
padding-right: .5rem !important;
}
main > .container {
padding-top: 60px;
}
HTML:
<!DOCTYPE html>
<html lang="en" class="h-100">
<head>
<!-- Meta -->
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
crossorigin="anonymous">
<!-- Page -->
<title>Split Button Dropdown</title>
</head>
<body class="d-flex flex-column h-100">
<header>
<nav class="navbar navbar-expand-md navbar-light ap-bg-light fixed-top">
<div class="container-fluid">
<a class="navbar-brand" href="">
TEST
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item dropdown">
<div class="btn-group d-table"> <!-- This is the d-table class that I've been adding/removing -->
<a class="nav-link d-inline active dropdown-link"
href="https://stackoverflow.com/">Clickable link</a>
<div class="nav-link d-inline active dropdown-toggle dropdown-toggle-split"
id="navbarDropdown" role="button" data-bs-toggle="dropdown"
aria-expanded="false" aria-haspopup="true">
</div>
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
<li><a class="dropdown-item" href="#">
List item</a></li>
<li><a class="dropdown-item"
href="#">
List item</a></li>
<li><a class="dropdown-item"
href="#">
List item</a></li>
<li><a class="dropdown-item"
href="#">
List item</a></li>
<li><a class="dropdown-item" href="#">
List item</a></li>
</ul>
</div>
</li> <!-- nav-item dropdown -->
<li class="nav-item">
<a class="nav-link active"
href="#">Another link</a>
</li>
<li class="nav-item">
<a class="nav-link active"
href="#">Final link</a>
</li>
</ul>
<!-- Search box -->
<form class="d-flex search">
<input class="form-control me-2 term" type="search" placeholder="Search"
aria-label="Search">
<button class="btn btn-outline-success" type="submit">
Search
</button>
</form>
</div>
</div>
</nav>
</header>
<!-- Page content -->
<main class="flex-shrink-0">
<div class="container">
</div>
</main>
<!-- JS -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
crossorigin="anonymous"></script>
</body>
</html>
如果有人有任何建议或知道现有答案,将不胜感激!
解决方案
好吧,我不知道这是否是最好的解决方案,但我想出了一些可行的方法。我添加了以下 Javascript,用于检测导航栏何时折叠并更新 DOM:
function checkNavBar() {
let dropdownWrapper = $('#dropdownWrapper')
if ($('#navToggle').is(':visible')) {
dropdownWrapper.addClass("d-table");
} else {
dropdownWrapper.removeClass("d-table");
}
}
$(window).resize(function () {
checkNavBar();
})
$(window).ready(function () {
checkNavBar();
})
第一个函数使用 JQueryis()
函数来测试导航栏切换按钮是否可见,并且在调整窗口大小和加载页面时调用该函数。
为了使下拉菜单扩展为全宽,我添加了一些 CSS,仅选择作为所示子项的按钮组.navbar-collapse
:
.navbar-collapse.show .btn-group {
width: 100%;
}
不是世界上最优雅的解决方案,但它似乎有效。
推荐阅读
- python - 将 csv 转换为 json(嵌套对象)
- sparql - year() 函数在 SPARQL (Protege) 中不起作用
- javascript - 如何使用 angularfire2 读取和更新同一个文档?
- reactjs - 打字稿类型描述在函数中的位置
- c++ - 为什么 C++ 对象方法不像 python 那样期望 self 参数?
- python - 从客户端与具有相同网络的服务器连接
- kubernetes - 无法将新节点加入 k8s 集群
- c# - SDK 期望被分配一个 Frame 值 C#
- h2o - 来自 H2O 服务器的 GBMV3 对象与 H2O 库中的 GBMV3 类是否不同?
- python - 带有 fastcgi 的 Django 2.0.7 在浏览器中给出 404 但在命令行上工作