demo在这http://jsfiddle.net/ypv2g2b8/
$(function(){
//滚动广告
var len = $(".num > li").length;
var index = 0;
var adTimer;
$(".num li").mouseover(function() {
index = $(".num li").index(this);
showImg(index);
}).eq(0).mouseover();
//滑入停止动画,滑出开始动画.
$('#scrollPics').hover(function() {
clearInterval(adTimer);
}, function() {
adTimer = setInterval(function() {
showImg(index)
index++;
if (index == len) { //最后一张图片之后,转到第一张
index = 0;
}
}, 3000);
}).trigger("mouseleave");
function showImg(index) {
var adHeight = $("#scrollPics>ul>li:first").height();
$(".slider").stop(true, false).animate({
"marginTop": -adHeight * index + "px" //改变 marginTop 属性的值达到轮播的效果
}, 1000);
$(".num li").removeClass("on")
.eq(index).addClass("on");
}
});
1,第一个疑问是这个轮播图是怎么运行起来的?他的定时器是写在hover方法中的。没有hover元素怎么会在加载时就运行呢?
2, $(".num li").mouseover事件后面加.eq(0).mouseover();是什么意思呢?
3,showImg方法中为什么要先stop一下在运行animate?
"marginTop": -adHeight * index 为什么要是负的adHeight乘以index呢?
请大家指点迷津。
用负值是因为他用marginTop的形式,图片是从上往下排列,负的就是往上滑动的意思;用那个hover来触发是为了,鼠标不放在图片上,图片每个3秒自动切换,鼠标放在了图片上,则停止切换图片
用css3的animation,几行css就够了...
补充楼上,stop是为了停掉上一次没完执行的动画,比如你很快的连续按很多次下一页,就会出现动画错乱的bug,这里的stop就是为了处理这个bug
1.trigger("mouseleave") 触发了 timer
2.触发0th li的mouseover的时间帮顶
3.控制显示哪张图片的, stop不知道,很少写js动画
1,第一个疑问是这个轮播图是怎么运行起来的?他的定时器是写在hover方法中的。没有hover元素怎么会在加载时就运行呢?hover第一个函数参数在 mouseenter时触发,第2个函数参数在mouseleave时触发。.trigger('mouse leave')就触发了mouseleave事件,showImage每隔3秒被执行,动起来了~~~
2, $(".num li").mouseover事件后面加.eq(0).mouseover();是什么意思呢?$(".num li").mouseover方法绑定回调函数到$(".num li")指定的包装集的元素中并且返回包装集合..eq(0).mouseover();就是触发$(".num li")第1个元素的mouseover事件
3,showImg方法中为什么要先stop一下在运行animate?
"marginTop": -adHeight * index 为什么要是负的adHeight乘以index呢?负值将指定位置的广告向上移动到marginTop指定的位置。因为showImage广告播放可能因为鼠标的操作行为而执行,所以需要停止之前自动定时执行的动画或".num li" mouseover而触发的动画执行序列。转而执行新的动画
==针对题主的问题及实现过程的疑问,把代码修正一下,希望对你有帮助=====
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="../script/jquery-2.1.3.min.js"></script>
<style>
#scrollPics{
height: 150px;
width: 500px;
margin-bottom: 10px;
overflow: hidden;
position:relative;
}
.slider li{
float:left;
}
.num{
position:absolute;
right:5px;
bottom:5px;
}
#scrollPics .num li{
float: left;
color: #FF7300;
text-align: center;
line-height: 16px;
width: 16px;
height: 16px;
cursor: pointer;
overflow: hidden;
margin: 3px 1px;
border: 1px solid #FF7300;
background-color: #fff;
}
#scrollPics .num li.on{
color: #fff;
line-height: 21px;
width: 21px;
height: 21px;
font-size: 16px;
margin: 0 1px;
border: 0;
background-color: #FF7300;
font-weight: bold;
}
img{
width:500px;
height:150px;
}
*{
padding:0;
margin:0;
}
ul,li{
list-type:none;
}
.clearfix{
zoom:1;
}
.clearfix:after{
content:"";
display:block;
clear:both;
}
</style>
<script>
$(function(){
//滚动广告
var len = $(".num > li").length;
var index = 0;
var adTimer;
var firstRunFlag=true;
$(".num li").mouseover(function() {
index = $(".num li").index(this);
showImg(index,true);
}).eq(0).mouseover();
//滑入停止动画,滑出开始动画.
$('#scrollPics').hover(function() {
clearInterval(adTimer);
}, function() {
adTimer = setInterval(function() {
showImg(index,false)
index++;
if (index == len) { //最后一张图片之后,转到第一张
index = 0;
}
}, 2000);
}).trigger("mouseleave");
function showImg(index,noAnimateFlag) {
//设置 noAnimateFlag 的目的为当在帧标签上切换各帧时,停止动画
//帧标签上 移除后,恢复动画效果
noAnimateFlag=noAnimateFlag|false;
var adWidth = $("#scrollPics>ul>li:first").width();
if(index===0&&firstRunFlag){
//复制最后1帧加到当前的第1帧前面,解决最后一帧和第1帧之间的过渡衔接问题
$("ul.slider li:last").clone().prependTo($("ul.slider"));
$(".slider").css("marginLeft",-adWidth*1+ "px" )
firstRunFlag=false;
}
if(!noAnimateFlag){
$(".slider").stop(true, false).animate({
"marginLeft": -adWidth * (index+1)+ "px" //改变 marginTop 属性的值达到轮播的效果
}, 1000,function(){
if(index===len-1){
console.log(index+' on complete');
$(".slider").stop(true, true).css("marginLeft","0px");
}
});
}else{
$(".slider").css("marginLeft",-adWidth * (index+1)+ "px");
}
$(".num li").removeClass("on")
.eq(index===len?0:index).addClass("on");
}
});
</script>
</head>
<body>
<div id="scrollPics">
<!--根据实际长度设置 ul 的宽度,这样li元素在float:left的基础,排成横排而不是默认的竖排-->
<ul class="slider clearfix" style="width:3000px;" >
<li><img src="http://developer.baidu.com/file/get/3081"/></li>
<li ><img src="http://developer.baidu.com/file/get/3082"/></li>
<li ><img src="http://developer.baidu.com/file/get/3082"/></li>
<li ><img src="http://developer.baidu.com/file/get/3081"/></li>
<li ><img src="http://developer.baidu.com/file/get/3082"/></li>
</ul>
<ul class="num" >
<li class="on">1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
</div>
</body>
</html>