纯JS幻灯片菜单,能够“点击菜单外点击”
16lz
2021-01-22
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中重写它。
- 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.
- 第一步是编写一个基本的简单函数来打开“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>
更多相关文章
- html5在pc能实现下拉菜单,在手机实现不了
- 我可以在所有浏览器中使用我的屏幕外菜单吗?
- 如何在bootstrap中添加汉堡包菜单
- 单击动态创建的复选框时,通过AJAX / PHP更新MySQL中的值?
- Zend Framework 2:活动菜单项。
- 单击保存按钮(PHP和MSQL)时如何保存记录列表
- 如何使用php通过AJAX从数据库中删除记录,以及单击链接时
- 如何在提交后有一个自动更新的下拉菜单?
- 在javascript中识别/获取选定的上下文菜单项