简体   繁体   English

当我们关注vanilla javascript中的其他元素时如何关闭子菜单

[英]How to close submenu when we focus on other element in vanilla javascript

I am new to Javascript and I am trying to build a navbar with sub menus using vanilla Javascript.我是 Javascript 的新手,我正在尝试使用 vanilla Javascript 构建一个带有子菜单的导航栏。 I have tried to set the submenu to show / hide on click but I would like also the submenu to hide when we move focus on another element.我试图将子菜单设置为在单击时显示/隐藏,但我也希望在我们将焦点移到另一个元素上时隐藏子菜单。 I have tried but can't make it.我试过了,但做不到。

Here is my code if you can please take a look: HTML:这是我的代码,如果您可以请看一下:HTML:

<nav id="navigation" class="main-nav">
        <div class="wrapper">
            <a href="index.html" class="nav-logo">MAIN LOGO</a>
            <div id="sidebarNav" class="sidebar-nav">
                <button class="closeBtn" id="closeMenu">
                    <i class="bi bi-x"></i>
                </button>
                <ul class="menu">
                    <li class="menu-item"><a href="index.html" class="menu-link">Home</a></li>
                    <li class="menu-item"><a href="#" class="menu-link">About</a></li>
                    <li class="menu-item menu-item-has-children">
                        <a href="#" class="menu-link">
                            Dropdown
                        </a>
                        <ul class="sub-menu">
                            <li class="menu-item"><a href="#" class="menu-link">Home Grid</a></li>
                            <li class="menu-item"><a href="#" class="menu-link">Home Grid 3 col</a></li>
                            <li class="menu-item"><a href="#" class="menu-link">Home Grid 3 col Full</a></li>
                        </ul>
                    </li>
                    <li class="menu-item"><a href="#" class="menu-link">Contact</a></li>
                    <li class="menu-item"><a href="#" class="menu-link">Link</a></li><li class="menu-item menu-item-has-children">
                        <a href="#" class="menu-link">
                            Dropdown
                        </a>
                        <ul class="sub-menu">
                            <li class="menu-item"><a href="#" class="menu-link">Home Grid</a></li>
                            <li class="menu-item"><a href="#" class="menu-link">Home Grid 3 col</a></li>
                            <li class="menu-item"><a href="#" class="menu-link">Home Grid 3 col Full</a></li>
                        </ul>
                    </li>
                    <li class="menu-item"><a href="#" class="menu-link">Blog</a></li>
                </ul>
            </div>
            <button id="toggleSidebar" class="toggle-button">
                <i class="bi bi-list"></i>
            </button>
        </div><!-- .wrapper -->
    </nav>

CSS: CSS:

.site-header {
width: 100%;
position: relative;
z-index: 999;

.toggle-button {
    border: 1px groove rgba(0, 0, 0, 0.1);
    padding: 3px 8px;
    margin: 8px 0;
    text-align: center;
    cursor: pointer;
    display: none;

    i {
        font-size: 22px;
    }
}

.main-nav {
    background: #ddd;

    .wrapper {
        display: flex;
        align-items: center;
        justify-content: space-between;

        .sidebar-nav {
            display: flex;
            align-items: center;
            justify-content: flex-end;
        }

        .menu {
            display: flex;
            align-items: center;
            justify-content: space-between;
            list-style: none;
            padding: 0;
            margin: 0;

            .menu-item {
                list-style: none;
                margin: 0;
                padding: 0;

                a {
                    padding: 20px 15px;
                    display: block;
                }
            }
        }

        .menu-item {

            &.menu-item-has-children {
                position: relative;

                .sub-menu {
                    position: absolute;
                    top: 100%;
                    left: 0;
                    padding: 0;
                    margin: 0;
                    text-align: left;
                    background: #fff;
                    border-top: 3px solid green;
                    min-width: 180px;
                    line-height: 1;
                    text-align: left;
                    z-index: 999;
                    box-shadow: 0 0 2px 1px rgba(0,0,0,0.2);
                    display: none;

                    li {
                        margin: 0;
                        padding: 0;
                        display: block;
                        border-bottom: 1px solid rgba(189, 188, 188, 0.3);

                        a {
                            font-size: .9rem;
                            font-weight: 400;
                            line-height: 1.2em;
                            letter-spacing: 0.6px;
                            padding: 15px;
                            text-transform: capitalize;
                            color: #555555;
                        }
                    }

                    
                }
            }

            &.active {
                .sub-menu {
                    display: block;
                }
            }
        }

        .menu-item-has-children > a::after {
            margin-left: .2rem;
            vertical-align: 0;
            border: none !important;
            content: "\2193" !important;
            font: normal;
            font-size: 13px;
            font-weight: 900;
            color: #333;
        }
    }
}

} }

JS: JS:

function dropdownMenu() {

const submenus = document.querySelectorAll(".menu-item-has-children");

for (var i = 0; i < submenus.length; i++) {
    submenus[i].addEventListener("click", function (e) {
        e.preventDefault();
        e.stopPropagation();
        var last = this.closest('ul').querySelector('.active');
        if (last && last !== this) last.classList.remove("active");
        this.classList.toggle("active");
    });
}

document.addEventListener("click", function () {
    var last = document.querySelector('.main-nav .active');
    if (last) last.classList.remove("active");
    if (last && last ) last.classList.remove("active");
});

} dropdownMenu(); } 下拉式菜单();

Try this example.试试这个例子。 I added to into your for loop extra addEventListener for mouseleave and clean up unnecessary lines in js file.我在你的 for 循环中为mouseleave添加了额外的addEventListener并清理了 js 文件中不必要的行。

 function dropdownMenu() { const submenus = document.querySelectorAll('.menu-item-has-children'); for (let i = 0; i < submenus.length; i++) { submenus[i].addEventListener('click', function (e) { e.stopPropagation(); const last = this.closest('ul').querySelector('.active'); if (last && last !== this) last.classList.remove('active'); this.classList.toggle('active'); }); // Added lines submenus[i].addEventListener('mouseleave', function () { const last = document.querySelector('.main-nav .active'); if (last) last.classList.remove('active'); }); //=== } document.addEventListener('click', function () { const last = document.querySelector('.main-nav .active'); if (last) last.classList.remove('active'); }); } dropdownMenu();
 .site-header { width: 100%; position: relative; z-index: 999; } .toggle-button { border: 1px groove rgba(0, 0, 0, 0.1); padding: 3px 8px; margin: 8px 0; text-align: center; cursor: pointer; display: none; } .toggle-button i { font-size: 22px; } .main-nav { background: #ddd; } .wrapper { display: flex; align-items: center; justify-content: space-between; } .sidebar-nav { display: flex; align-items: center; justify-content: flex-end; } .menu { display: flex; align-items: center; justify-content: space-between; list-style: none; padding: 0; margin: 0; } .menu-item { list-style: none; margin: 0; padding: 0; } .menu-item a { padding: 20px 15px; display: block; } .menu-item.menu-item-has-children { position: relative; } .sub-menu { position: absolute; top: 100%; left: 0; padding: 0; margin: 0; text-align: left; background: #fff; border-top: 3px solid green; min-width: 180px; line-height: 1; text-align: left; z-index: 999; box-shadow: 0 0 2px 1px rgba(0, 0, 0, 0.2); display: none; } .sub-menu li { margin: 0; padding: 0; display: block; border-bottom: 1px solid rgba(189, 188, 188, 0.3); } .sub-menu a { font-size: 0.9rem; font-weight: 400; line-height: 1.2em; letter-spacing: 0.6px; padding: 15px; text-transform: capitalize; color: #555555; } .menu-item-has-children.active .sub-menu { display: block; } .menu-item-has-children > a::after { margin-left: 0.2rem; vertical-align: 0; border: none !important; content: '\\2193' !important; font: normal; font-size: 13px; font-weight: 900; color: #333; }
 <nav id="navigation" class="main-nav"> <div class="wrapper"> <a href="index.html" class="nav-logo">MAIN LOGO</a> <div id="sidebarNav" class="sidebar-nav"> <button class="closeBtn" id="closeMenu"> <i class="bi bi-x"></i> </button> <ul class="menu"> <li class="menu-item"> <a href="index.html" class="menu-link">Home</a> </li> <li class="menu-item"><a href="#" class="menu-link">About</a></li> <li class="menu-item menu-item-has-children"> <a href="#" class="menu-link"> Dropdown </a> <ul class="sub-menu"> <li class="menu-item"> <a href="#" class="menu-link">Home Grid</a> </li> <li class="menu-item"> <a href="#" class="menu-link">Home Grid 3 col</a> </li> <li class="menu-item"> <a href="#" class="menu-link">Home Grid 3 col Full</a> </li> </ul> </li> <li class="menu-item"><a href="#" class="menu-link">Contact</a></li> <li class="menu-item"><a href="#" class="menu-link">Link</a></li> <li class="menu-item menu-item-has-children"> <a href="#" class="menu-link"> Dropdown </a> <ul class="sub-menu"> <li class="menu-item"> <a href="#" class="menu-link">Home Grid</a> </li> <li class="menu-item"> <a href="#" class="menu-link">Home Grid 3 col</a> </li> <li class="menu-item"> <a href="#" class="menu-link">Home Grid 3 col Full</a> </li> </ul> </li> <li class="menu-item"><a href="#" class="menu-link">Blog</a></li> </ul> </div> <button id="toggleSidebar" class="toggle-button"> <i class="bi bi-list"></i> </button> </div> </nav>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何只使用vanilla JavaScript打开新表单时如何关闭其他表单? - How do I close other form(s) when a new form is opened, using only vanilla JavaScript? 如何制作下拉菜单 onclick 并仅在使用 Vanilla javascript 单击外部元素时关闭? - How to make dropdown menu onclick and close when clicking outside element with Vanilla javascript only? vanilla javascript:element.close()不在元素上工作 - vanilla javascript: element.close() not working on element 单击另一个子菜单时如何关闭子菜单 - How to close submenu when click on another submenu 如何更改代码以查看动作“其他子菜单打开时关闭子菜单” ..? - How it change code to see action “close submenu when other submenu open”..? 单击香草javascript中的文档时如何关闭输入 - How to close input when click on document in vanilla javascript 当我们删除 Javascript 数组中的一个元素时,其他元素是如何排列的? - When We Delete an Element in a Javascript Array, How Are Other Elements Arranged? 单击其他关闭按钮显示下拉菜单,仅在单个元素Vanilla Javascript上显示 - Show dropdown menu on click over other close button, only on single element Vanilla Javascript 如何在vanilla javascript中选择这个元素? - How to select this element in vanilla javascript? Javascript(香草)-使用querySelectorAll时如何指定元素的类型? - Javascript (vanilla) - How to specify the type of an element when using querySelectorAll?
相关标签
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM