mouseenter单独使用没有问题,但是当加入mouseleave后,第一次触发mouseenter正常,后面想再次触发mouseenter会失效,出现如下图情况。即使鼠标没有离开触发事件对象,mouseleave持续触发。
代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jindouyun</title>
<style>
*{
margin:0;
padding: 0;
}
li{
list-style: none;
}
a{
text-decoration: none;
color:#333;
}
.c-nav{
position: relative;
width:450px;
height:22px;
line-height: 22px;
margin:100px auto;
border:2px solid #eee;
text-align: center;
}
.c-nav ul{
position: relative;
margin-left:15px;
}
.c-nav ul li{
float:left;
margin:0 3px;
cursor: pointer;
}
.cloud{
position: absolute;
top:0;
left:0;
margin-left: 12px;
background-color: rgba(0,0,0,.5) ;
height:22px;
width:70px;
}
</style>
<script src="animation.js"></script>
</head>
<body>
<div class="c-nav" id="c_nav">
<span class="cloud"></span>
<ul>
<li><a href="#">首页新闻</a></li>
<li><a href="#">师资力量</a></li>
<li><a href="#">活动策划</a></li>
<li><a href="#">企业文化</a></li>
<li><a href="#">招聘信息</a></li>
<li><a href="#">公司简介</a></li>
</ul>
<script type="text/javascript">
var cloud = document.querySelector('.cloud');
var c_nav = document.querySelector('.c-nav');
var lis = c_nav.querySelectorAll('li');
var current = 0;
for(var i = 0; i < lis.length; i++){
lis[i].addEventListener('mouseover',function(){
animate(cloud,this.offsetLeft);
})
lis[i].addEventListener('mouseout',function(){
animate(cloud,0);
})
}
</script>
</div>
</body>
</html>
function animate(obj,target,callback){
//清除之前的定时器,保证当前只有一个定时器
clearInterval(obj.timer);
var timer = setInterval(function(){
//缓步移动
var step = (target - obj.offsetLeft) ;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if(obj.offsetLeft = target){
clearInterval(timer);
if(callback){
//调用函数
callback();
}
// callback && callback();
}
obj.style.left = obj.offsetLeft + step + 'px';
console.log("目标位置:" + target + ",每次移动步数:" + step);
}, 30);
}
请问是代码出问题了吗,需要怎么修改
用mouseover和mouseout试试。
问题1是:
mouseover 和 mouseout 事件是可以冒泡的,子元素上触发的事件会冒泡到父元素上。
应该是改用 mouseleave 和 mouseenter 事件,这两个事件不冒泡。
问题2是:
定时器的返回值要赋值给obj.timer
obj.timer = setInterval(function
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>jindouyun</title>
<style>
*{
margin:0;
padding: 0;
}
li{
list-style: none;
}
a{
text-decoration: none;
color:#333;
}
.c-nav{
position: relative;
width:450px;
height:22px;
line-height: 22px;
margin:100px auto;
border:2px solid #eee;
text-align: center;
}
.c-nav ul{
position: relative;
margin-left:15px;
}
.c-nav ul li{
float:left;
margin:0 3px;
cursor: pointer;
}
.cloud{
position: absolute;
top:0;
left:0;
margin-left: 12px;
background-color: rgba(0,0,0,.5) ;
height:22px;
width:70px;
}
</style>
<script>
function animate(obj,target,callback){
var ml = parseInt((obj.currentStyle||getComputedStyle(obj,null)).marginLeft, 10);
//清除之前的定时器,保证当前只有一个定时器
clearInterval(obj.timer);
obj.timer = setInterval(function(){
//缓步移动
var ol = obj.offsetLeft - ml;
var step = (target - ol) / 10;
step = step > 0 ? Math.ceil(step) : Math.floor(step);
if(ol == target){
clearInterval(obj.timer);
if(callback){
//调用函数
callback();
}
// callback && callback();
}
obj.style.left = ol + step + 'px';
console.log("目标位置:" + target + ",每次移动步数:" + step);
}, 30);
}
</script>
</head>
<body>
<div class="c-nav" id="c_nav">
<span class="cloud"></span>
<ul>
<li><a href="#">首页新闻</a></li>
<li><a href="#">师资力量</a></li>
<li><a href="#">活动策划</a></li>
<li><a href="#">企业文化</a></li>
<li><a href="#">招聘信息</a></li>
<li><a href="#">公司简介</a></li>
</ul>
<script type="text/javascript">
var cloud = document.querySelector('.cloud');
var c_nav = document.querySelector('.c-nav');
var lis = c_nav.querySelectorAll('li');
var current = 0;
for(var i = 0; i < lis.length; i++){
lis[i].addEventListener('mouseenter',function(){
animate(cloud,this.offsetLeft);
})
lis[i].addEventListener('mouseleave',function(){
animate(cloud,0);
})
}
</script>
</div>
</body>
</html>
请采纳,谢谢!
您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
animate应该是这个函数有问题,如果不加这个函数,只是在lis[i].addEventListener('mouseover',function(){}里console.log(‘9999’)。
lis[i].addEventListener('mouseout',function(){} 里console.log('离开')。触发是没问题的
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y