顶部下拉菜单问题

顶部下拉菜单问题

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>大项目作业</title>
<link href="大项目作业.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="main">
<div class="header">
<div class="headBtn">
<a id="loginLink" href="#">亲,请登录</a>
<a id="registerLink" href="#">免费注册</a>
<a id="checkImooc" href="#">手机逛慕课</a>
</div>
<div class="firstMenu">
<div>我的慕课 <img src="素材/icon/21.jpg"/></div>
<div class="secondMenu">
<a href="#">已买到的宝贝</a>
</div>
<div class="secondMenu">
<a href="#">我的足迹</a>
</div>
</div>

<div class="firstMenu">
<div>我的慕课 <img src="素材/icon/21.jpg"/></div>
<div class="secondMenu">
<a href="#">已买到的宝贝</a>
</div>
<div class="secondMenu">
<a href="#">我的足迹</a>
</div>
</div>

<div class="firstMenu">
<div>我的慕课 <img src="素材/icon/21.jpg"/></div>
<div class="secondMenu">
<a href="#">已买到的宝贝</a>
</div>
<div class="secondMenu">
<a href="#">我的足迹</a>
</div>
</div>
<div class="firstMenu">
<div>我的慕课 <img src="素材/icon/21.jpg"/></div>
<div class="secondMenu">
<a href="#">已买到的宝贝</a>
</div>
<div class="secondMenu">
<a href="#">我的足迹</a>
</div>
</div>
<div class="firstMenu">
<div>我的慕课 <img src="素材/icon/21.jpg"/></div>
<div class="secondMenu">
<a href="#">已买到的宝贝</a>
</div>
<div class="secondMenu">
<a href="#">我的足迹</a>
</div>
</div>
<hr/>
</div>
</div>



<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
<script src="大项目作业.js"></script>
</body>
</html>
*{margin:0px;padding:0px;}

.main{
	height:1200px;/*暂时*/
	width:1350px;
	background-color:#f3f5f7;
	/*border:1px solid black;*/
}

/*头部*/
.header{
	width:1000px;
	height:50px;
	border:1px solid black;
	margin:0 auto;
}
.headBtn a {margin-right:20px;}
a{text-decoration: none}
a:hover{
	color:red;
}
.firstMenu{
	height:100px;
	width:100px;
	/*border:solid 1px black;*/
	float:right;
}
.secondMenu{
	display:none;
}

.changeWhite{
	background-color: white;
}
.changeBlue{
	background-color: #B0E2FF;
}
/*头部*/
$('.firstMenu').mouseover(function(event){
	$(event.target).find('.secondMenu').show();
	$(event.target).addClass('changeWhite');
})
$('.firstMenu').mouseout(function(event){
	$(event.target).children('.secondMenu').hide()
	$(event.target).removeClass('changeWhite');
})
$('.secondMenu').mouseover(function(event){
	$(event.target).addClass('changeBlue');
})
$('.secondMenu').mouseout(function(event){
	$(event.target).removeClass('changeBlue');
})

关于下拉菜单我实在搞不明白为什么会出现现在这种错误的效果,无法给选中的子菜单添加颜色,子菜单发生闪烁,浮动出现问题。头好晕,请老师帮帮我

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕夭夭 2019-01-18 16:07:48

你好同学 , 解答如下:

1.event.target就像同学说的那样 ,我鼠标移入到那个元素 ,它代表的就是哪个元素 . 

http://img1.sycdn.imooc.com//climg/5c4184680001bd7e04670180.jpg

如上当你移出时 , 就会触发下拉菜单显示 , 如下:

因为鼠标没有办法截图, 如下红框中就表示移入菜单时的箭头 . 由于这个时候下拉菜单显示出来的了 , 你的鼠标在浮在了下拉菜单上面 . 

http://img1.sycdn.imooc.com//climg/5c4184b800011a8202870153.jpg

由于event.target是不会冒泡的  ,永远指向的事件源对象 , 当鼠标浮在下拉菜单时 ,event.target指的就是secondMenu ,  所以这个时候就触发firstMenu的mouseout事件 . 下拉菜单就隐藏了 ,隐藏之后鼠标就又浮在了firstMenu , 继而又触发firstMenu的mouseover事件让下拉菜单显示 . 所以反复执行移入移出事件 ,就出现闪动的效果了 .

(因为冒泡本阶段同学还不太容易理解 , 同学先简单的理解 , 当鼠标在子元素上面触发事件时 , 父元素事件也跟着触发) .

2.this一般我们都是它指向的是函数的调用者 , 这里同学理解的就有偏差了 , 虽然事件绑定在了firstMenu ,但是this并不是指所有的firstMenu ,而是当那个元素触发事件时 ,指的就是哪个元素 .和event.target差不多 , 

区别是 ,this是可以冒泡的 , 当你在移入firstMenu  ,此时下拉菜单显示 ,相当于鼠标移入到了下拉菜单 , 事件会冒泡往上查找它的父元素 ,发现父元素绑定了移入事件 ,所以下拉菜单还是不会继续显示 , 不会出现闪动的效果了

http://img1.sycdn.imooc.com//climg/5c4186cd0001b5b202900134.jpg

2.因为父元素盒子塔高了 ,所以你还有移入到我的慕课上面就会触发事件

http://img1.sycdn.imooc.com//climg/5c4188350001b1c706100262.jpg

所以这里老师让你去掉高度 ,因为下拉菜单是隐藏的 , 默认自适应一级菜单的高度就可以了 . 同学在看一下老师第一次回复 , 截图中是去掉firstMenu高度 ,并不是要去掉header的高度哦 .

希望能够解答你的疑惑 , 祝学习愉快 ,望采纳 

好帮手慕夭夭 2019-01-18 11:26:05

你好同学 , 出现闪动的原因是你使用的event.target .

event.target指触发事件的当前元素 .当你移入时 , 会触发firstMenu的事件 , 此时下拉菜单显示 , 你的鼠标就落在了下拉菜单上面 , event.target就会指向的下拉菜单 ,而不是firstMenu , 所以会触发firstMenu的移开事件 ,下拉菜单隐藏 . 隐藏之后你的鼠标有落在firstMenu ,所以又再次让下拉菜单显示 ,这里可能有点绕 .慢慢理解一下 . 

所以不要使用event.target , 因为它永远指向的是事件触发的源对象 . 而使用this ,因为this的是可以变化的 , 当你鼠标移入到下来菜单时 ,事件会冒泡到父元素事件上面 .(冒泡暂时了解一下 , 以后高级的课程中会有详细的讲解的)

先去掉高度 ,父元素高度自适应就可以了 :

http://img1.sycdn.imooc.com//climg/5c41453000016f6204390181.jpg

改成this :

http://img1.sycdn.imooc.com//climg/5c41473c0001627006350341.jpg

该后同学设置的效果就能出来了 ,祝学习愉快 ,望采纳 .

  • 提问者 慕丝6937110 #1
    因为我设置了很多个叫firstaMenu的div,每个firstMenu肚子里面都有secondMenu。看来我对this和event.target还没搞明白,我的理解是,这边如果使用以firstMenu为对象的事件中使用eventTarget告诉电脑的意思就是,电脑你现在看到了还多叫firstMenu的div,我点到哪个,你就要对其中我点到的那个目标做事情。this的话,我的理解是,this就是表示firstMenu本身,而firstMenu这个对象是一个集合,this指向这个集合的话,为什么电脑就能明白我点哪个他就执行哪个呢 而且firstMenu是secondmenu的父元素,按理说,我鼠标在这个父元素中任意移动,secondMenu都应该正常显示的,直到我鼠标离开这个父元素的区域,secondMenu才会隐藏,我这个理解是哪里出问题了吗,晕啊
    2019-01-18 12:00:16
  • 提问者 慕丝6937110 #2
    关于float,我还是没懂,这边之所以会这样是造成父元素塌陷了吗,这些叫firstMenu的盒子的父元素是叫header的div盒子对吧,如果是塌陷问题,为什么我反而要去掉高度,让其自适应?我在.header的class里用了clear,overflow也不起作用,老师能再讲的详细点吗
    2019-01-18 12:03:31
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
前端小白入门系列课程
  • 参与学习           人
  • 提交作业       11218    份
  • 解答问题       36713    个

从一个不会编程的小白到一个老司机是需要过程的,首先得入门,学习基础知识,然后才能进阶,最后再到精通,本专题是你走进前端世界的不二选择!

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师