【问题标题】:html navigation bar doesn't detect whether it's open or nothtml导航栏不检测是否打开
【发布时间】:2018-12-12 14:38:27
【问题描述】:

我网站的导航栏显然存在逻辑错误。我知道这一点是因为浏览器(我使用的是 chrome)没有检测到任何其他错误(例如语法错误)并且它可以部分工作。

我的导航栏的问题是它无法检测它是否打开。因此,即使菜单已经关闭,菜单按钮也可能显示关闭按钮(反之亦然)。

我的导航栏的工作方式是在每次单击时更改其形状(每次单击时菜单图标都会更改,而不是在菜单打开时更改)。

您可以在调整窗口/屏幕大小并打开菜单而不关闭它时看到这个问题。

我正在尝试通过根据屏幕尺寸更改其设计来使导航栏“响应”(大屏幕在侧面有导航,小屏幕在顶部有导航);这是我的问题开始出现的时候。

我无法解决这个问题,因为我是 javascript 和 jQuery 的初学者,那么,是否有另一种更有效且效果更好的方法?

谢谢

编辑:除非你复制我的代码,保存并通过外部浏览器打开它,否则你看不到效果(如果你运行 sn-p,@media 将不起作用)

代码如下:

function menuTransform(x) {
	var y = document.getElementById("navbar");
	var z = $(window).width();
	x.classList.toggle("change");
	if (z > 500) {
		$('nav li:not(.menu)').show();
		$('nav hr').show();
		if (y.style.width === "300px") {
			y.style.transition = "ease 0.5s";
			$('nav li a span').addClass('link');
			$('nav li a span').removeClass('opened');
			y.style.width = "80px";
		}
		
		else {
			y.style.transition = "ease 0.5s";
			$('nav li a span').removeClass('link');
			$('nav li a span').addClass('opened');
			y.style.width = "300px";
		}
	}
	
	if (z <= 500) {
		$('nav li:not(.menu)').hide();
		$('nav hr').hide();
		if (y.style.height === "100%") {
			y.style.height = "80px";
			y.style.width = "100%";
			y.style.transition = "ease 0.5s";
			$('nav li a span').addClass('link');
			$('nav li:not(.menu)').hide();
			$('nav hr').hide();
		}
		
		else {
			y.style.height = "100%";
			y.style.width = "100%";
			y.style.transition = "ease 0.5s";
			$('nav li a span').removeClass('link');
			$('nav li:not(.menu)').show();
			$('nav hr').show();
		}
	}
}
#navbar {
  min-height: 100%;
  height: 100%;
}

nav {
	z-index: 10;
	position: fixed;
	top: 0px;
	background: linear-gradient(to right, rgb(0,0,0), rgb(13,13,13));
	width: 80px;
	list-style-type: none;
	color: white;
	box-shadow: 5px 0px 8px rgba(0,0,0,0.3);
	overflow: auto;
}

nav li {
	display: flex;
	justify-content: center;
	align-items: center;
}

nav li a {
	display: flex;
	width: 100%;
	height: 80px;
	color: white;
	text-decoration: none;
	justify-content: center;
	align-items: center;
	transition: 0.3s;
}

.link {
	display: none;
}

.opened {
	padding: 10px;
	padding-top: 11px;
	white-space: nowrap;
}

nav li a:hover:not(.active) {
	background: rgb(42,42,42);
	box-shadow: 0 1px 8px rgba(0,0,0,0.3);
	transform: translateY(-1px);
}

.menu {
	padding-top: 16px;
	padding-bottom: 16px;
}

.hamMenu {
	padding-top: -6px;
	cursor: pointer;
}

.bar1, .bar2, .bar3 {
	background: white;
	width: 36px;
	height: 5px;
	margin: 6px 0;
	transition: 0.5s;
}

.change .bar1 {
	-webkit-transform: rotate(-45deg) translate(-8px, 7px);
    transform: rotate(-45deg) translate(-8px, 7px);
}

.change .bar2 {
	background: rgba(0,0,0,0);
}

.change .bar3 {
	-webkit-transform: rotate(45deg) translate(-8px, -8px);
    transform: rotate(45deg) translate(-8px, -8px);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<nav id="navbar">
	<li class="menu">
		<div class="hamMenu" onclick="menuTransform(this)">
			<div class="bar1"></div>
			<div class="bar2"></div>
			<div class="bar3"></div>
		</div>
	</li>
    
	<li><a class="active" href="home.html"><i class="material-icons">home</i><span class="link">Home</span></a></li>
	<li><a href="Videos.html"><i class="material-icons">play_circle_filled</i><span class="link">Videos</span></a></li>
	<li><a href="#seminars"><i class="material-icons">tv</i><span class="link">Seminars</span></a></li>
	<li><a href="#seminars"><i class="material-icons">school</i><span class="link">Personal Tuition</span></a></li>
</nav>

【问题讨论】:

  • 您的 HTML 不正确。 li 应该住在 olul 里面。这可能不是导致问题的原因。我需要检查一下。但是,问题是:您没有在代码中的任何地方收听窗口调整大小,而且我实际上没有看到您正在调用 menuTransform 函数。有几种方法。如果你愿意,它可以用 JS 来完成,但这对于 CSS 来说也足够简单(可能有 2-3 行 JS)。您首选的方法是什么?
  • 首选 CSS 方法,因为它受到更多浏览器的支持,但如果 javascript 更高效,我会使用 JS。感谢您的建议,我将开始使用
      /
      而不仅仅是

标签: jquery html css responsive-design navigationbar


【解决方案1】:

您的火腿菜单没有宽度或高度。你有这样的设置:

.hamMenu {
    padding-top: -6px;
    cursor: pointer;
}

因此,您尝试在页面上单击它,但您没有单击它,因为它没有大小,即使它内部有具有大小的元素。

一个很好的测试方法是给元素一个轮廓,它会显示它的大小:

.hamMenu {
    padding-top: -6px;
    cursor: pointer;
    outline: 1px solid;
}

我没有测试过,但最终应该是这样的:

.hamMenu {
    padding-top: -6px;
    cursor: pointer;
    width: 36px;
    height: 30px;
}

【讨论】:

  • 对不起,我的代码一定很混乱,我会编辑它,让它更容易理解。 hamMenu 只是菜单图标,没有问题(css 问题)。但是感谢您的帮助
  • 导航栏可以工作,但我想问是否有办法让它更高效,是否有办法通过改变它的大小来让它无缝工作(在顶部而不是底部) 如果窗口大小发生变化(使用媒体查询或 javascript)。对不起,如果你不明白,我不擅长解释事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 1970-01-01
相关资源
最近更新 更多