保存菜单状态 CSS - 手风琴菜单 - 否 Jquery
Saving menu state CSS - Accordian Menu - no Jquery
我有一个所有页面通用的手风琴菜单。当用户单击子菜单时,用户将转到该子菜单 link 但由于加载了一个全新的页面,菜单已折叠回去。
是否有使用 Vanilla Javascript 保存菜单状态的方法?我已经看到使用 Jquery 的解决方案未被使用。
下面有我的菜单片段供参考。
.nav_bar {
font-family: sans-serif;
font-size: 20px;
width: 250px;
height: 100vh;
position: fixed;
top: 0px;
left: 0px;
}
.nav_bar .nav_header {
text-align: center;
margin: 0;
padding: 0;
}
.nav_bar .nav_header .nav_logo {
width: 180px;
}
.nav_bar .menu {
margin: 20px;
overflow: hidden;
}
.nav_bar .menu .item {
display: block;
margin: 20px;
position: relative;
}
.nav_bar .menu .item .sub_menu {
overflow: hidden;
-webkit-transition: 0.3s;
transition: 0.3s;
max-height: 0;
}
.nav_bar .menu .item .sub_menu a::before {
content: '';
width: 2px;
background: #280F98;
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.nav_bar .menu .item .sub_menu a {
display: block;
font-size: 14px;
padding: 10px 5px 10px 10px;
position: relative;
}
.nav_bar .menu .item:target .sub_menu {
max-height: 10em;
}
<nav class="nav_bar">
<div class="menu">
<div class="item" id="our_work">
<a href="#our_work" class="button">Our Work</a>
<div class="sub_menu">
<a href="our_work">Our mission</a>
<a href="our_work#goals">Goals</a>
<a href="our_work#initiatives">Initiatives</a>
</div>
</div>
<div class="item" id="performances">
<a href="#performances" class="button">Showcase</a>
<div class="sub_menu">
<a href="#">2020</a>
<a href="#">2019</a>
<a href="#">2018</a>
<a href="#">2017</a>
</div>
</div>
<div class="item" id="concerts">
<a href="#concerts" class="button">Talent</a>
<div class="sub_menu">
<a href="#">Concerts 1</a>
<a href="#">Concerts 2</a>
<a href="#">Concerts 3</a>
</div>
</div>
<div class="item" id="shop">
<a href="#shop" class="button">Shop</a>
<div class="sub_menu">
<a href="#">Shop 1</a>
<a href="#">Shop 2</a>
<a href="#">Shop 3</a>
</div>
</div>
</div>
</nav>
试试这个。我添加了带有 href: js
的 SO TEST
菜单项,因为这是在控制台日志中看到的片段位置 link。
菜单打开基于a href
link和当前位置。
编辑:
根据评论中的要求,在所有主菜单类别上添加了点击事件。如果单击一个,它将首先隐藏所有子菜单(以便隐藏之前显示的任何子菜单),然后仅显示单击的子菜单项。
window.addEventListener("load", function() {
const page = location.href.split("/").pop();
console.log(location.href);
console.log(page);
[...document.querySelectorAll(".nav_bar > .menu > .item > .sub_menu a")].forEach(link => {
if (link.href.endsWith(page)) {
link.setAttribute("style", "background-color: red;");
link.parentElement.setAttribute("style", "max-height: 10em");
}
})
})
const menus = document.querySelectorAll(".nav_bar > .menu > .item ")
for (const menu of menus) {
menu.addEventListener('click', function(event) {
[...document.querySelectorAll(".nav_bar > .menu > .item > .sub_menu a")].forEach(link => {
link.parentElement.setAttribute("style", "max-height: 0em");
})
this.getElementsByClassName("sub_menu")[0].setAttribute("style", "max-height: 10em");
})
}
.nav_bar {
font-family: sans-serif;
font-size: 20px;
width: 250px;
height: 100vh;
position: fixed;
top: 0px;
left: 0px;
}
.nav_bar .nav_header {
text-align: center;
margin: 0;
padding: 0;
}
.nav_bar .nav_header .nav_logo {
width: 180px;
}
.nav_bar .menu {
margin: 20px;
overflow: hidden;
}
.nav_bar .menu .item {
display: block;
margin: 20px;
position: relative;
}
.nav_bar .menu .item .sub_menu {
overflow: hidden;
-webkit-transition: 0.3s;
transition: 0.3s;
max-height: 0;
}
.nav_bar .menu .item .sub_menu a::before {
content: '';
width: 2px;
background: #280F98;
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.nav_bar .menu .item .sub_menu a {
display: block;
font-size: 14px;
padding: 10px 5px 10px 10px;
position: relative;
}
.nav_bar .menu .item:target .sub_menu {
max-height: 10em;
}
<nav class="nav_bar">
<div class="menu">
<div class="item" id="our_work">
<a href="#our_work" class="button">Our Work</a>
<div class="sub_menu">
<a href="js">SO TEST</a>
<a href="our_work">Our mission</a>
<a href="our_work#goals">Goals</a>
<a href="our_work#initiatives">Initiatives</a>
</div>
</div>
<div class="item" id="performances">
<a href="#performances" class="button">Showcase</a>
<div class="sub_menu">
<a href="#">2020</a>
<a href="#">2019</a>
<a href="#">2018</a>
<a href="#">2017</a>
</div>
</div>
<div class="item" id="concerts">
<a href="#concerts" class="button">Talent</a>
<div class="sub_menu">
<a href="#">Concerts 1</a>
<a href="#">Concerts 2</a>
<a href="#">Concerts 3</a>
</div>
</div>
<div class="item" id="shop">
<a href="#shop" class="button">Shop</a>
<div class="sub_menu">
<a href="#">Shop 1</a>
<a href="#">Shop 2</a>
<a href="#">Shop 3</a>
</div>
</div>
</div>
</nav>
我有一个所有页面通用的手风琴菜单。当用户单击子菜单时,用户将转到该子菜单 link 但由于加载了一个全新的页面,菜单已折叠回去。
是否有使用 Vanilla Javascript 保存菜单状态的方法?我已经看到使用 Jquery 的解决方案未被使用。
下面有我的菜单片段供参考。
.nav_bar {
font-family: sans-serif;
font-size: 20px;
width: 250px;
height: 100vh;
position: fixed;
top: 0px;
left: 0px;
}
.nav_bar .nav_header {
text-align: center;
margin: 0;
padding: 0;
}
.nav_bar .nav_header .nav_logo {
width: 180px;
}
.nav_bar .menu {
margin: 20px;
overflow: hidden;
}
.nav_bar .menu .item {
display: block;
margin: 20px;
position: relative;
}
.nav_bar .menu .item .sub_menu {
overflow: hidden;
-webkit-transition: 0.3s;
transition: 0.3s;
max-height: 0;
}
.nav_bar .menu .item .sub_menu a::before {
content: '';
width: 2px;
background: #280F98;
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.nav_bar .menu .item .sub_menu a {
display: block;
font-size: 14px;
padding: 10px 5px 10px 10px;
position: relative;
}
.nav_bar .menu .item:target .sub_menu {
max-height: 10em;
}
<nav class="nav_bar">
<div class="menu">
<div class="item" id="our_work">
<a href="#our_work" class="button">Our Work</a>
<div class="sub_menu">
<a href="our_work">Our mission</a>
<a href="our_work#goals">Goals</a>
<a href="our_work#initiatives">Initiatives</a>
</div>
</div>
<div class="item" id="performances">
<a href="#performances" class="button">Showcase</a>
<div class="sub_menu">
<a href="#">2020</a>
<a href="#">2019</a>
<a href="#">2018</a>
<a href="#">2017</a>
</div>
</div>
<div class="item" id="concerts">
<a href="#concerts" class="button">Talent</a>
<div class="sub_menu">
<a href="#">Concerts 1</a>
<a href="#">Concerts 2</a>
<a href="#">Concerts 3</a>
</div>
</div>
<div class="item" id="shop">
<a href="#shop" class="button">Shop</a>
<div class="sub_menu">
<a href="#">Shop 1</a>
<a href="#">Shop 2</a>
<a href="#">Shop 3</a>
</div>
</div>
</div>
</nav>
试试这个。我添加了带有 href: js
的 SO TEST
菜单项,因为这是在控制台日志中看到的片段位置 link。
菜单打开基于a href
link和当前位置。
编辑:
根据评论中的要求,在所有主菜单类别上添加了点击事件。如果单击一个,它将首先隐藏所有子菜单(以便隐藏之前显示的任何子菜单),然后仅显示单击的子菜单项。
window.addEventListener("load", function() {
const page = location.href.split("/").pop();
console.log(location.href);
console.log(page);
[...document.querySelectorAll(".nav_bar > .menu > .item > .sub_menu a")].forEach(link => {
if (link.href.endsWith(page)) {
link.setAttribute("style", "background-color: red;");
link.parentElement.setAttribute("style", "max-height: 10em");
}
})
})
const menus = document.querySelectorAll(".nav_bar > .menu > .item ")
for (const menu of menus) {
menu.addEventListener('click', function(event) {
[...document.querySelectorAll(".nav_bar > .menu > .item > .sub_menu a")].forEach(link => {
link.parentElement.setAttribute("style", "max-height: 0em");
})
this.getElementsByClassName("sub_menu")[0].setAttribute("style", "max-height: 10em");
})
}
.nav_bar {
font-family: sans-serif;
font-size: 20px;
width: 250px;
height: 100vh;
position: fixed;
top: 0px;
left: 0px;
}
.nav_bar .nav_header {
text-align: center;
margin: 0;
padding: 0;
}
.nav_bar .nav_header .nav_logo {
width: 180px;
}
.nav_bar .menu {
margin: 20px;
overflow: hidden;
}
.nav_bar .menu .item {
display: block;
margin: 20px;
position: relative;
}
.nav_bar .menu .item .sub_menu {
overflow: hidden;
-webkit-transition: 0.3s;
transition: 0.3s;
max-height: 0;
}
.nav_bar .menu .item .sub_menu a::before {
content: '';
width: 2px;
background: #280F98;
position: absolute;
top: 0;
left: 0;
height: 100%;
}
.nav_bar .menu .item .sub_menu a {
display: block;
font-size: 14px;
padding: 10px 5px 10px 10px;
position: relative;
}
.nav_bar .menu .item:target .sub_menu {
max-height: 10em;
}
<nav class="nav_bar">
<div class="menu">
<div class="item" id="our_work">
<a href="#our_work" class="button">Our Work</a>
<div class="sub_menu">
<a href="js">SO TEST</a>
<a href="our_work">Our mission</a>
<a href="our_work#goals">Goals</a>
<a href="our_work#initiatives">Initiatives</a>
</div>
</div>
<div class="item" id="performances">
<a href="#performances" class="button">Showcase</a>
<div class="sub_menu">
<a href="#">2020</a>
<a href="#">2019</a>
<a href="#">2018</a>
<a href="#">2017</a>
</div>
</div>
<div class="item" id="concerts">
<a href="#concerts" class="button">Talent</a>
<div class="sub_menu">
<a href="#">Concerts 1</a>
<a href="#">Concerts 2</a>
<a href="#">Concerts 3</a>
</div>
</div>
<div class="item" id="shop">
<a href="#shop" class="button">Shop</a>
<div class="sub_menu">
<a href="#">Shop 1</a>
<a href="#">Shop 2</a>
<a href="#">Shop 3</a>
</div>
</div>
</div>
</nav>