关于mouseover的问题

关于mouseover的问题

如果鼠标停留在轮播图上,按F5刷新网页,如果保持鼠标不动,那么图片会自动轮播,除非移动一次鼠标才会停止.可以参考这个问题http://class.imooc.com/course/qadetail/39626 

而页面第一次打开时,也会因为页面加载缓慢而出现定时器失效的情况

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

如图,轮播时控制台打印数字,清除定时器时打印clear.在此期间,我鼠标从未移开图片并且保持移动,可以看到,每次打印clear之后,图片轮播并没有停止,在图片切换到下一张之后,又打印了一次clear,然而图片仍然继续轮播.在控制台上呈现的结果就是,clear和数字不断的轮流打印.

当页面刷新后,然后移动鼠标,恢复正常.

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

		// 鼠标不在banner区图片自动轮播
		banner.mouseout(function(){
			timer = setInterval(function(){
				index++;
				//console.log(img.length);
				
				// 切换图片
				changeImg();
			},2000)
		});

		// 鼠标在banner上停止轮播
		banner.mouseover(function() {
			console.log('clear');
			if (timer) {
				// 清除定时器
				clearInterval(timer);
			}
		});
		
		// 启动自动轮播
		banner.mouseout();


正在回答

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

5回答

你可以在这上面清除一下定时器,再测试下

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

另外banner里面的图片div不需要定位,把定位去掉

  • Coolyang_ 提问者 #1
    非常感谢!
    2018-03-06 16:52:00
小丸子爱吃菜 2018-03-06 14:26:32

1、在这个轮播效果中,我们触发的是鼠标移动和鼠标离开事件,如果鼠标放在图片上不动,用F5刷新的话,是触发不了事件的,这就得需要去判断鼠标的位置来决定是否启动轮播。鼠标的位置相关知识会在后面进阶的路径中去讲解,有兴趣可以网上查阅一下鼠标位置的相关知识,自己完善一下。

2、测试你的代码,鼠标一直在图片上方滑动,并没有出现你说的那种情况啊

  • 提问者 Coolyang_ #1
    第二个问题,要在第一次打开页面,在图片加载出来之前就将鼠标移入banner区才会出现,刷新一下就不会出现了
    2018-03-06 14:32:38
  • 提问者 Coolyang_ #2
    已经解决,谢谢
    2018-03-06 16:52:26
提问者 Coolyang_ 2018-03-06 13:42:04
!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>jQuery实现轮播图</title>
    <link rel="stylesheet" href="css/jQuery实现轮播图.css">
</head>
<body>
    <div class="box">
        <p>jQuery实现轮播图</p>
        <div class="banner">
            <!-- 图片轮播 -->
            <div class="img one block"><a href="#"></a></div>
            <div class="img two"><a href="#"></a></div>
            <div class="img three"><a href="#"></a></div>
            <div class="img four"><a href="#"></a></div>
            <div class="img five"><a href="#"></a></div>
    
            <!-- 小圆点 -->
            <div class="dots">
                <span class="active"></span>
                <span></span>
                <span></span>
                <span></span>
                <span></span>
            </div>
            <!-- 三角 -->
            <a href="javascript:;" class="button prve"></a>
            <a href="javascript:;" class="button next"></a>
    </div>
    
    <script src="http://cdn.bootcss.com/jquery/1.12.4/jquery.js"></script>
    <script src="js/jQuery实现轮播图.js"></script>
</div>
</body>
</html>
body {
	padding: 0;
	margin: 0;
	font-family: "Microsoft YaHei";
}

p {
	text-align: center;
	font-size: 20px;
}

.banner {
	width: 1200px;
	height: 500px;
	position: relative;
	padding: 10px;
	background-color: #bbb;
	margin: 0 auto;
}

.img {
	position: absolute;
	top: 10px;
	left: 10px;
	width: 1200px;
	height: 500px;
	background-repeat: no-repeat;
	background-size: 1200px 500px;
	overflow: hidden;
	display: none;
}

.one {
	background-image: url("../img/1.jpg");
}
.two {
	background-image: url("../img/2.jpg");
}

.three {
	background-image: url("../img/3.jpg");
}

.four {
	background-image: url("../img/4.jpg");
}

.five {
	background-image: url("../img/5.jpg");
}

.block {
	display: block;
}

.dots {
	position: absolute;
	right: 20px;
	bottom: 30px;
}

.dots span {
	display: inline-block;
	width: 12px;
	height: 12px;
	border:2px solid #fff;
	border-radius: 50%;
	background-color: #666;
	margin-right: 3px;
	cursor: pointer;
}

.dots .active {
	border:2px solid #666;
	background-color: #fff;
}

.button {
	display: block;
	position: absolute;
	top: 50%;
	left: 30px;
	margin-top: -40px;
	width: 30px;
	height: 80px;
	background-repeat: no-repeat;
	background-position: center center;
}

.button:hover {
	background-color: rgba(0,0,0,0.5);
}
.prve {
	background-image: url("../img/pre2.png");
}
.next {
	left: auto;
	right: 30px;
	background-image: url("../img/pre.png");
}
$(function() {
	var index = 0,
		timer = null,
		img = $('.img'),
		banner = $('.banner'),
		dots = $('span'),
		button = $('.button');
	// 封装图片轮播函数 
	function bannerSlide() {

		// 鼠标不在banner区图片自动轮播
		banner.mouseout(function(){
			timer = setInterval(function(){
				index++;		
				// 切换图片
				changeImg();
			},2000)
		});


		// 鼠标在banner上停止轮播
		banner.mouseover(function() {
			
			if (timer) {
				// 清除定时器
				clearInterval(timer);
				console.log('clear');
			}
		});
		
		// 启动自动轮播
		banner.mouseout();

		// 点击小圆点切换图片
		dots.click(function(event){
			// 令索引值等于点击的小圆点的索引
			index = dots.index($(this));
			changeImg();
		})

		// 点击三角切换图片
		button.eq(0).click(function(event){
			// 索引-1
			index--;
			changeImg();
		});
		button.eq(1).click(function(event){
			// 索引+1
			index++;
			changeImg();
		});

	}

	// 封装图片切换函数
	function changeImg() {
		// 判断index大小,如果超过图片数目则归零,如果小于图片数目则变最大值
		if (index >= img.length) {
			index = 0;
		}
		if (index < 0) {
			index = img.length-1;
		}
		console.log(index);

		// 清除所有的激活样式
		img.removeClass('block');
		dots.removeClass('active');

		//切换图片
		img.eq(index).addClass('block');
		dots.eq(index).addClass('active');
	}
	
	bannerSlide();
})


小丸子爱吃菜 2018-03-06 10:06:45

建议你上传自己完整的代码,我们需要测试一下你的代码,才能够更好的定位到问题所在。

祝学习愉快!

  • 提问者 Coolyang_ #1
    老师,代码已经上传
    2018-03-06 13:42:41
提问者 Coolyang_ 2018-03-05 22:25:09

对了,清除定时器失效问题是在第一次打开页面由于页面加载缓慢,在页面加载完毕之前就把鼠标放入banner区时才会出现.如果鼠标在banner区外,图片开始轮播之后在移入则正常.

  • 提问者 Coolyang_ #1
    此时如果鼠标移到banner外面,则轮播将会重叠,原本2s切换一张图变成2s切换两张图
    2018-03-05 22:43:42
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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