【发布时间】:2018-02-14 19:49:39
【问题描述】:
如何在元素层次结构上实现 Bootstrap 4 折叠(在我的例子中是导航栏)
我的页面的某些元素具有以下层次结构,我希望在此“树”中使用折叠行为。
特别希望以下行为
(我认为这是有道理的)
绿色表示导航栏已显示,红色表示已折叠
与当前状态
然后点击选项 B1
这只是折叠导航栏 B1
在另一个例子中点击选项 A
这显示了导航栏 A
并折叠选项 B 的所有后代
(导航栏 B 和导航栏 B1)
这些规则可以归结为 3 个简单的规则:
1) 当点击一个元素时,一些子元素(可能还有其他后代)处于活动状态(这里是活动的,我的意思是显示)所有子元素和后代都会崩溃。
2) 单击没有活动子元素的元素 X 时,显示 X 的(直接)子元素并折叠 X 的兄弟姐妹的所有后代。
3) 主导航的所有后代都被折叠加载
我可以使用自定义 javascript 代码获得所需的行为,不幸的是,我需要忽略引导程序中的折叠插件已经提供的一些所需功能,并根据我的需要重新实现它们。
去这里Bootply
这是简化的 HTML 部分
<nav id="main-nav" class="navbar navbar-expand-lg navbar-dark">
<ul class="navbar-nav align-nav">
<li class="nav-item">
<a id="togglenavA" class="nav-link" href="#" data-target="#navA" aria-controls="navA" aria-expanded="false" aria-label="Toggle navigation">Option A</a>
</li>
<li class="nav-item">
<a id="togglenavB" class="nav-link" href="#" data-target="#navB" aria-controls="navB" aria-expanded="false" aria-label="Toggle navigation">Option B</a>
</li>
</ul>
</nav>
<div id="navA" class="collapse">
<nav id="NAVA" class="navbar navbar-expand-lg navbar-dark">
<ul class="navbar-nav align-nav">
<li class="nav-item">
<a class="nav-link" href="#">Option A1</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Option A2</a>
</li>
</ul>
</nav>
</div>
<div id="navB" class="collapse">
<nav id="NAVB" class="navbar navbar-expand-lg navbar-dark">
<ul class="navbar-nav align-nav">
<li class="nav-item">
<a id="togglenavB1" class="nav-link" href="#" data-target="#navB1" aria-controls="navB1" aria-expanded="false" aria-label="Toggle navigation">Option B1</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Option B2</a>
</li>
</ul>
</nav>
</div>
<div id="navB1" class="collapse">
<nav id="NAVB1" class="navbar navbar-expand-lg navbar-dark">
<ul class="navbar-nav align-nav">
<li class="nav-item">
<a class="nav-link" href="#">Option B1.1</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Option B1.2</a>
</li>
</ul>
</nav>
</div>
这里是重新实现手风琴风格的 Javascript,但兄弟姐妹的孩子的额外折叠
$(document).ready(function() {
$('#togglenavA').click(function() {
$('#navB').collapse('hide')
$('#navB1').collapse('hide')
$('#navA').collapse('toggle')
$('#navA').on('hidden.bs.collapse', function () {
$('#togglenavA').attr("aria-expanded","false");
}) // for screen readers purpose
$('#navA').on('shown.bs.collapse', function () {
$('#togglenavA').attr("aria-expanded","true");
})
});
$('#togglenavB').click(function() {
$('#navA').collapse('hide')
$('#navB1').collapse('hide')
$('#navB').collapse('toggle')
$('#navB').on('hidden.bs.collapse', function () {
$('#togglenavB').attr("aria-expanded","false");
})
$('#navB').on('shown.bs.collapse', function () {
$('#togglenavB').attr("aria-expanded","true");
})
});
$('#togglenavB1').click(function() {
$('#navB1').collapse('toggle')
$('#navB1').on('hidden.bs.collapse', function () {
$('#togglenavB1').attr("aria-expanded","false");
})
$('#navB1').on('shown.bs.collapse', function () {
$('#togglenavB1').attr("aria-expanded","true");
})
});
});
注意:尽管此解决方案解决了我的问题,但这样做的代价是忽略了 Bootstrap 已经实现的手风琴并从某些链接中删除了一些数据属性,以避免插件中的某些自动功能与我的自定义代码发生冲突.
【问题讨论】:
-
您不能期望答案中没有自定义 javascript,因为这可能是 bootstrap 4 当前的实现存在缺陷。您自己也没有尝试过,您尝试过的一些html代码会很好。
-
你需要展示一些研究成果或你尝试过的一些代码。
-
你们俩都是对的!我已经做了一些研究,并想出了我自己的定制代码来工作。我正在寻找一种更有原则的方式来做到这一点
-
我建议使用小提琴或用您所做的答案更新您的问题,这将显示您的努力,并且我很乐意将我的 -1 删除为 +1。表明您使用 cusom 尝试过但正在寻找非。自定义 javascript。
-
我不相信没有自定义 JavaScript 可以做到这一点。但是,我相信有一种使用 Bootstrap 的 Collapse API 的简单方法(我认为这仍然是最佳实践。)我只是犹豫发布,因为它不满足“没有自定义 javascript”的期望。
标签: jquery css twitter-bootstrap bootstrap-4