如何从引导程序的文档中单击外部以关闭此自定义offcanvas导航?

贾斯汀·布鲁斯

我正在使用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"]clickdocument
  • 当在文档中的任何位置单击时,元素中删除(而不切换)类如果使用,则关闭画布时打开in可能会打开它,这可能不是您想要的。open.offcanvas-collapsetoggleclickdocument

话虽如此,这是实际的做法:

$(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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在MVC引导程序中自定义导航栏(宽度)

引导程序中的“自定义”按钮

WordPress导航Twitter引导程序自定义

如何使用绑定关闭此自定义模式?

React Native 抽屉导航:如何通过单击特定场景中的自定义按钮打开抽屉?

单击自定义时如何关闭JCombobox的下拉列表?

如何创建自定义模式弹出窗口-以及如何在其外部单击以将其关闭

引导自定义导航栏

下拉菜单项隐藏在引导程序自定义导航栏中的主菜单后面

如何处理自定义alertDialog的外部单击?

在vue webapp中使用引导程序:如何自定义

如何自定义 django 引导程序表单

自定义引导程序宽度不知道如何

在引导程序中自定义输入字段

自定义 django 表单模板(在引导程序中)

如何从Wix托管引导程序或自定义操作中读取某些注册表项?

如何将AngularJS自定义指令注入到引导程序预加载的模态中?

如何在CSS或引导程序中创建自定义列

如何使ASP.net MVC 5中的自定义分页取决于引导程序?

在菜单外部单击以关闭引导栏时,导航栏“闪烁”

如何在Aurelia中的自定义属性中访问单击处理程序?

如何在 Material UI TextField 组件中的关闭图标上添加自定义处理程序?

如何在文档中定义自定义CSS?

自定义引导程序的导航栏切换图标

VueJs 2自定义指令在外部单击不起作用时关闭

使用引导程序的自定义通知

引导程序自定义表宽度

自定义引导程序按钮字体

使用引导程序自定义集合