javascript - 移动响应式导航栏
问题描述
我是一名初级网络开发人员,当然我遇到了问题哈哈。希望有人可以提供建议。我正在尝试构建一个响应式移动导航栏,但是当我单击菜单按钮并更改屏幕大小时,导航栏消失了。我认为这与javascript中的事件处理程序有关。有人可以帮助我并让我知道我错在哪里吗?
const navbar = document.getElementById('navbar')
document.getElementById('menubutton').addEventListener('click', myFunction);
function myFunction(event){
if (navbar.style.display==="block") {
navbar.style.display ="none";
} else {
navbar.style.display="block";
}
}
body{
margin: 0 auto;
width: 100%;
}
.headermenu{
display: flex;
justify-content:space-between;
align-items: center;
width: 100%;
}
.buttonstyling{
background-color: black;
color: white;
font-size: 2em;
padding: 20px;
border: none;
width: 100%;
text-align: left;
}
.navbar{
display: none;
background-color: black;
}
.navbar a{
text-decoration: none;
color: white;
display: block;
background-color: black;
padding: 15px;
}
img {
width: 100%;
}
#logoheader{
width: 60%;
}
@media (min-width: 768px){
.buttonstyling{
display: none;
}
.navbar{
display: flex;
background-color: white;
justify-content: space-around;
}
.navbar a{
background-color: white;
color: black;
}
}
<header>
<div class="headermenu">
<button type="button" id="menubutton" class="buttonstyling">
Menu
</button>
</div>
<nav class="navbar" id="navbar">
<a href="#">Home</a>
<a href="">About</a>
<a href="">Services</a>
<a href="">Work With Me</a>
<a href="">Blog</a>
<a href="">Contact</a>
</nav>
</header>
解决方案
当您使用 javascript 进行硬设置style.display = none
时,该元素现在将在每个屏幕尺寸中都具有该样式,并且将忽略其后出现的任何冲突的 CSS 规则。您要做的是创建一个可以添加和删除的类,它具有仅适用于某些屏幕尺寸的规则。
在这个例子中,我添加了 class expanded
,它不会应用于媒体查询中的任何元素。相反,navbar
将退回到display: flex
.
const navbar = document.getElementById('navbar')
document.getElementById('menubutton').addEventListener('click', myFunction);
function myFunction(event){
if (navbar.classList.contains('expanded')) {
navbar.classList.remove('expanded');
} else {
navbar.classList.add('expanded');
}
}
body{
margin: 0 auto;
width: 100%;
}
.headermenu{
display: flex;
justify-content:space-between;
align-items: center;
width: 100%;
}
.buttonstyling{
background-color: black;
color: white;
font-size: 2em;
padding: 20px;
border: none;
width: 100%;
text-align: left;
}
.navbar{
display: none;
background-color: black;
}
.expanded {
display: block;
}
.navbar a{
text-decoration: none;
color: white;
display: block;
background-color: unset;
padding: 15px;
}
img {
width: 100%;
}
#logoheader{
width: 60%;
}
@media (min-width: 768px){
.buttonstyling{
display: none;
}
.navbar{
display: flex;
transform: unset;
background-color: white;
justify-content: space-around;
}
.navbar a{
background-color: white;
color: black;
}
}
<header>
<div class="headermenu">
<button type="button" id="menubutton" class="buttonstyling">
Menu
</button>
</div>
<nav class="navbar" id="navbar">
<a href="#">Home</a>
<a href="">About</a>
<a href="">Services</a>
<a href="">Work With Me</a>
<a href="">Blog</a>
<a href="">Contact</a>
</nav>
</header>
推荐阅读
- html - 如何使用 rel=preload 预加载素材图标?
- grails - grails 3运行命令不起作用
- sql-server - 在 SQL Server 中将时间格式从 3.5 转换为 3:30
- java - 在 Lucene 中索引多级 JSON 对象
- python - 了解父级属性设置器的继承
- c++ - Eigen + MKL 对于矩阵乘法比 Matlab 慢
- wordpress - 标题未显示在前端 - 古腾堡
- javascript - 为对象中的所有成员调用 setTimeout() - 从不调用第一个成员,并调用第二个成员。为什么?
- google-chrome - 使用 Google 脚本自动化 Chrome?
- python - 在python中编写库时如何处理异常