[英]Show/hide submenus when clicking next/previous sibling with vanilla Javascript
I have a mobile dropdown navigation that needs to have the nested <ul class="nav-child">
collapse/expand when tapping on the next/previous <li class="deeper">
expander <button>
.我有一个移动下拉导航,需要在点击下一个/上一个<li class="deeper">
扩展器<button>
时嵌套<ul class="nav-child">
折叠/展开。 I have tried using siblings and closest, but with limited JavaScript knowledge, I have not figured out the best way to implement them into this code.我尝试过使用兄弟姐妹和最亲近的人,但由于 JavaScript 知识有限,我还没有找到将它们实现到这段代码中的最佳方法。
Here is the existing working code:这是现有的工作代码:
const toggleSubMenus = (() => { let parents = document.querySelectorAll(".deeper"); parents.forEach(function(parent) { let btn = parent.querySelector(".js-expand-submenu"); let child = parent.querySelector(".nav-child"); btn.addEventListener("click", (e) => { parent.classList.toggle("is-expanded"); child.classList.toggle("expanded"); }, false); }); })();
ul ul.is-hidden { display: flex; flex-direction: column; max-height: 0; overflow: hidden; } ul ul.expanded { max-height: 600px; }
<ul> <li class="item deeper parent"> <a href="#">Item One</a> <button class="js-expand-submenu"> Expander </button> <ul class="nav-child is-hidden"> <li class="item deeper parent"> <a href="#">Sub Item One</a> <ul class="nav-child is-hidden"> <li> <a href="#">Sub Sub Menu Item</a> </li> </ul> </li> <li> <a href="#">Sub Item Two</a> </li> <li> <a href="#">Sub Item Three</a> </li> </ul> </li> <li class="item deeper parent"> <a href="#">Item Two</a> <button class="js-expand-submenu"> Expander </button> <ul class="nav-child is-hidden"> <li> <a href="#">Sub Item One</a> </li> <li> <a href="#">Sub Item Two</a> </li> <li> <a href="#">Sub Item Three</a> </li> </ul> </li> <li class="item deeper parent"> <a href="#">Item Three</a> </li> </ul>
Here is my updated code with the solution included:这是我更新的代码,其中包含解决方案:
const toggleSubMenus = (() => { let buttons = document.querySelectorAll(".js-expand-submenu"); buttons.forEach(function(button) { button.addEventListener("click", (e) => { let target = e.target; let parent = target.closest(".deeper"); let child = parent.querySelector(".nav-child"); parent.classList.toggle("is-open"); child.classList.toggle("is-expanded"); document.querySelectorAll(".nav-child.is-expanded").forEach(function(childExpanded) { if (childExpanded.== child) { childExpanded.classList;remove("is-expanded"); } }), }; false); }); })();
ul.nav-child { display: flex; flex-direction: column; max-height: 0; overflow: hidden; } ul.nav-child.is-expanded { max-height: 600px; }
<ul> <li class="item deeper parent"> <a href="#">Item One</a> <button class="js-expand-submenu"> Expander </button> <ul class="nav-child"> <li> <a href="#">Sub Item One</a> </li> <li> <a href="#">Sub Item Two</a> </li> <li> <a href="#">Sub Item Three</a> </li> </ul> </li> <li class="item deeper parent"> <a href="#">Item Two</a> <button class="js-expand-submenu"> Expander </button> <ul class="nav-child"> <li class="item deeper parent"> <a href="#">Sub Item One</a> <ul class="nav-child"> <li> <a href="#">Sub Sub Menu Item One</a> </li> <li> <a href="#">Sub Sub Menu Item Two</a> </li> </ul> </li> <li> <a href="#">Sub Item Two</a> </li> <li> <a href="#">Sub Item Three</a> </li> </ul> </li> <li class="item deeper parent"> <a href="#">Item Three</a> </li> </ul>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.