我正在使用Bootstrap 4文档中的offcanvas实验代码,但是当您在菜单外单击时,它不是设计为关闭的,这是我真的希望这样做。
我已经尝试了Web上的一些jquery代码段,但是它们利用了bootstrap的.collapse,当我编辑它们以包含自定义.offcanvas-collapse类时,它们不起作用。
<nav class="navbar fixed-top navbar-dark bg-dark">
<button class="navbar-toggler p-0 border-0" type="button" data-toggle="offcanvas" data-target="#offcanvasNav" aria-controls="navbarResponsive" aria-expanded="false" aria-label="Toggle navigation">
<i data-feather="menu"></i>
</button>
<a class="navbar-brand" href="#">Sleight of Word</a>
<button class="navbar-toggler p-0 border-0" type="button" data-toggle="searchBar">
<i data-feather="search"></i>
</button>
<form class="form-inline my-2 my-lg-0 d-none">
<input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
<div class="navbar-collapse offcanvas-collapse" id="offcanvasNav">
<ul class="navbar-nav mr-auto">
<li class="nav-item active">
<a class="nav-link" href="#">Dashboard <span class="sr-only">(current)</span></a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Notifications</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Profile</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Switch account</a>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="dropdown01" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">Settings</a>
<div class="dropdown-menu" aria-labelledby="dropdown01">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</li>
</ul>
<form class="form-inline my-2 my-lg-0">
<input class="form-control mr-sm-2" type="text" placeholder="Search" aria-label="Search">
<button class="btn btn-outline-success my-2 my-sm-0" type="submit">Search</button>
</form>
</div>
</nav>
.offcanvas-collapse {
position: fixed;
top: 56px; /* Height of navbar */
bottom: 0;
right: 100%;
width: 240px;
padding-right: 1rem;
padding-left: 1rem;
overflow-y: auto;
visibility: hidden;
background-color: purple;
transition: visibility .2s ease-in-out, -webkit-transform .2s ease-in-out;
transition: transform .2s ease-in-out, visibility .2s ease-in-out;
transition: transform .2s ease-in-out, visibility .2s ease-in-out, -webkit-transform .2s ease-in-out;
}
.offcanvas-collapse.open {
visibility: visible;
-webkit-transform: translateX(100%);
transform: translateX(100%);
}
$(function () {
'use strict'
$('[data-toggle="offcanvas"]').on('click', function () {
$('.offcanvas-collapse').toggleClass('open')
})
})
$(document).on('click',function(){
$('.offcanvas-collapse').offcanvas-collapse('hide');
})
我希望这将使Offcanvas导航可以通过菜单按钮切换(打开和关闭),并且在菜单外部单击时可以关闭导航,但是在导航外部单击则无济于事。
$(document).on('click',function(){
$('.offcanvas-collapse').toggleClass('open');
})
仅此一项,就会在您文档中open
所有具有该类的元素上切换该类offcanvas-collapse
。如果元素具有类,则将其删除,否则将添加它。
如果将以上内容与其他代码段结合使用:
$(function () {
'use strict'
$('[data-toggle="offcanvas"]').on('click', function () {
$('.offcanvas-collapse').toggleClass('open')
})
})
...,每当您单击时[data-toggle="offcanvas"]
,两个代码段都在运行(因为您单击了,[data-toggle="offcanvas"]
但是您也单击了document
(因为click
事件一直冒到document
,除非阻止),因此该类offcanvas-collapse
被切换了两次,因此看起来它不起作用。
那显然不是你所追求的。
您可能想要:
open
在.offcanvas-collapse
元素上切换类,而不允许该事件传播到。[data-toggle="offcanvas"]
click
document
open
.offcanvas-collapse
toggle
click
document
话虽如此,这是实际的做法:
$(function () {
'use strict'
$(document)
.on('click', '[data-toggle="offcanvas"]', function(e) {
$('.offcanvas-collapse').toggleClass('open'); // toggle `.open`
e.stopPropagation(); // and stop propagation
})
.on('click', function() {
$('.offcanvas-collapse').removeClass('open'); // remove `.open`
});
})
编辑:根据评论请求,仅在单击导航栏外部时关闭画布,将第二个替换为.on()
以下内容:
.on('click', function(e) {
if (!$(e.target).closest('nav.fixed-top').is('nav')) {
$('.offcanvas-collapse').removeClass('open'); // remove `.open`
}
});
它检查目标对象是否在<nav>
with类中fixed-top
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句