javascript - 使用 Event.target 和类关闭屏幕外导航

标签 javascript jquery html css

我需要一些帮助来理解 event.target 属性。

我创建了一个 nav,它在单击 button 时滑入和滑出。当 nav 在屏幕上时,它会添加 nav-open 类。我试图添加这样的功能,如果用户点击 nav 之外的任何地方,它就会关闭,所以我试图定位:

  1. 类名
  2. 用户点击

使用以下代码但它似乎不起作用:

    $(window).click(function(e) {
        if( nav.hasClass('nav-open') && e.target != nav ) {
            nav.removeClass('nav-open');
        }

    });

有人可以帮忙吗?下面是完整的片段。

$(document).ready(function() {
	
	var button = $('button');
	var nav = $('nav');
	
	button.click(function() {
		nav.toggleClass('nav-open');
	});
	
// 	$(window).click(function(e) {
// 		if( nav.hasClass('nav-open') && e.target != nav ) {
// 			nav.removeClass('nav-open');
// 		}
		
// 	});
	
	
	
	
});
* {
	padding: 0;
	margin: 0;
}

.container {
	border: 1px solid;
	height: 1000px;
	width: 100%;
	background-color: #ccc;
	position: relative;
	z-index: 1;
}

button{
	position: relative;
	left: 500px;
	top: 30px;
}

nav {
	height: 100vh;
	width: 300px;
	left: 0;
	top: 0;
	position: absolute;
	background-color: #444;
	z-index: 2;
	transform: translate3d(-300px,0,0);
	transition: all .4s ease;
}
.nav-open {
	transform: translate3d(0px,0,0);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav></nav>
<div class="container">
	<button>click me</button>
</div>

最佳答案

您需要 event.stopPropagation() 来防止事件冒泡。

$(document).ready(function() {
	
	var button = $('button');
	var nav = $('nav');
	
	button.click(function() {
		nav.toggleClass('nav-open');
	});
	
  $("body").on("click", ".container", function(e){
    e.preventDefault();
    if($("nav").hasClass("nav-open")){
      $("nav").removeClass("nav-open");
    }
  }).on("click", "nav, button", function(){
    e.stopPropagation();
  })
	
	
	
	
});
* {
	padding: 0;
	margin: 0;
}

.container {
	border: 1px solid;
	height: 1000px;
	width: 100%;
	background-color: #ccc;
	position: relative;
	z-index: 1;
}

button{
	position: relative;
	left: 500px;
	top: 30px;
}

nav {
	height: 100vh;
	width: 300px;
	left: 0;
	top: 0;
	position: absolute;
	background-color: #444;
	z-index: 2;
	transform: translate3d(-300px,0,0);
	transition: all .4s ease;
}
.nav-open {
	transform: translate3d(0px,0,0);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav></nav>
<div class="container">
	<button>click me</button>
</div>

关于javascript - 使用 Event.target 和类关闭屏幕外导航,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47889327/

相关文章:

javascript - 仅使用 HTML-CSS 制作在缩放调整后保持在原位的叠加 <div>

javascript - three.js 和无限前向网格移动

javascript - Bootstrap,如何在使用视口(viewport)高度时向下滚动后使导航栏变粘?

javascript - 避免 ajax 调用中的竞争条件

javascript - 添加类 jQuery else if

html - 网格卡布局在我的元素中无法正常工作

javascript - html5/javascript乘以输入类型并显示在表格中

javascript - 如何使用 db 用户和密码启动 mongo docker 镜像

javascript - 如何从表中的下拉列表中逐行读取值

javascript - 我如何处理 Bootstrap div 折叠和展开的奇怪行为