I am trying to rephrase my question and will go through all the steps i did and especially where i failed. I don't have a deep knowledge of JS but the will to learn by practice as well as the help of the community.

我试着改写我的问题,并将完成我所做的所有步骤,尤其是我失败的地方。我对JS没有深刻的了解,但对实践以及社区的帮助有了学习的意愿。

I stumbled across this answer and realized the benefit. Since i don't want to use jQuery i started to rewrite it in JS.

我偶然发现了这个答案并意识到了这个好处。由于我不想使用jQuery,我开始在JS中重写它。

  1. First step was a to write a basic simple function to open the menu on 'click' and close it on a click outside of the focused element using the blur(); method.
  2. 第一步是编写一个基本的简单函数来打开“click”菜单,然后使用blur()在焦点元素外面的一个点击上关闭它。方法。

Reference jQuery code from @zzzzBov :

从@zzzzBov引用jQuery代码:

$('a').on('click', function () {
  $(this.hash).toggleClass('active').focus();
});

$('div').on('focusout', function () {
  $(this).removeClass('active');
});

My JS code:

我的JS代码:

var navToggle = document.getElementsByClassName('js-site-nav-btn--toggle')[0];
var navMenu = document.getElementsByClassName('js-site-nav')[0];

navToggle.addEventListener('click', function() {
  this.focus();
  navMenu.classList.toggle('js-site-nav--open');
});

navMenu.addEventListener('blur', function() {
  this.classList.remove('js-site-nav--open');
}, true);

Opening the menu works, the problem is that it will only close on 'click' outside of the menu if the focused element (Menu) is clicked once before:

打开菜单有效,问题是如果在之前单击一次聚焦元素(菜单),它将仅在菜单外部的“单击”时关闭:

var navToggle = document.getElementsByClassName('js-site-nav-btn--toggle')[0];
var navMenu = document.getElementsByClassName('js-site-nav')[0];

navToggle.addEventListener('click', function() {
  this.focus();
  navMenu.classList.toggle('js-site-nav--open');
});

navMenu.addEventListener('blur', function() {
  this.classList.remove('js-site-nav--open');
}, true);
.c-site-nav {
  color: black;
  list-style-type: none;
  padding-top: 20px;
  position: fixed;
  overflow: hidden;
  top: 0;
  right: -200px;
  width: 200px;
  height: 100%;
  transition: right .6s cubic-bezier(0.190, 1.000, 0.220, 1.000);
  opacity: .9;
  background-color: green;
}
.js-site-nav--open {
  right: 0;
}
.c-site-nav-btn:hover {
  cursor: pointer;
  background-color: red;
}
.c-site-nav-btn {
  position: fixed;
  top: 20px;
  right: 20px;
  border: 0;
  outline: 0;
  background-color: black;
  position: fixed;
  width: 40px;
  height: 40px;
}
.c-site-nav-btn__line {
  width: 20px;
  height: 2px;
  background-color: white;
  display: block;
  margin: 5px auto;
}
<button class="c-site-nav-btn js-site-nav-btn--toggle">
  <span class="c-site-nav-btn__line"></span>
  <span class="c-site-nav-btn__line"></span>
  <span class="c-site-nav-btn__line"></span>
</button>
<nav class="c-site-nav js-site-nav" tabindex="-1" role="navigation">
  <ul class="c-site-nav__menu">
    <li>
      <a class="c-site-nav__item js-site-nav__item" href="/">TOPMENU</a>
    </li>
    <li>SUBMENU
      <ul>
        <li>
          <a class="c-site-nav__item js-site-nav__item" href="/">MENU</a>
        </li>
        <li>
          <a class="c-site-nav__item js-site-nav__item" href="/">MENU</a>
        </li>
        <li>
          <a class="c-site-nav__item js-site-nav__item" href="/">MENU</a>
        </li>
      </ul>
    </li>
    <li>
      <a class="c-site-nav__item js-site-nav__item" href="/portfolio">TOPMENU</a>
    </li>
  </ul>
</nav>

更多相关文章

  1. html5在pc能实现下拉菜单,在手机实现不了
  2. 我可以在所有浏览器中使用我的屏幕外菜单吗?
  3. 如何在bootstrap中添加汉堡包菜单
  4. 单击动态创建的复选框时,通过AJAX / PHP更新MySQL中的值?
  5. Zend Framework 2:活动菜单项。
  6. 单击保存按钮(PHP和MSQL)时如何保存记录列表
  7. 如何使用php通过AJAX从数据库中删除记录,以及单击链接时
  8. 如何在提交后有一个自动更新的下拉菜单?
  9. 在javascript中识别/获取选定的上下文菜单项

随机推荐

  1. Android面试系列文章2018之Android部分Fr
  2. Hello, Android 深入(一)
  3. Android知识梳理之BroadcastReceiver整理
  4. Android(安卓)base-adapter-helper 源码
  5. Android安全加密:Https编程
  6. android:weight属性的使用——android开
  7. Android架构组件- Room数据库的使用
  8. Android(安卓)invalidate与postInvalidat
  9. 使用myelipse配置android开发环境
  10. Android开发教程