jQuery实现轮播图无缝连接
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.banner {
border: #0066FF 5px solid;
width: 600px;
height: 400px;
/*auto:浏览器计算外边距*/
margin: 100px auto;
overflow: hidden;
/*cursor:设置或检索在对象上移动的鼠标指针采用的光标形状。*/
cursor: pointer;
position: relative;
}
.banner .slide {
width: 4000px;
height: 400px;
/*要激活对象的绝对(absolute)定位,必须指定 left , right , top , bottom 属性中的至少一个*/
position: absolute;
left: -600px;
}
.banner .slide .pic {
width: 600px;
height: 400px;
background: #00ffFF;
line-height: 400px;
text-align: center;
float: left;
font-size: 72px;
color: #ffffff;
}
.banner .slide .a {
background-color: black;
}
.banner .slide .b {
background-color: green;
}
.banner .slide .c {
background-color: purple;
}
.banner .dots {
width: 100px;
height: 30px;
position: absolute;
bottom: 0px;
/*固定到中间*/
left: 50%;
margin-left: -50px;
/*z-index的值大的会覆盖在小的上面*/
z-index: 2;
}
.banner .dots .dot {
/*圆点样式*/
width: 20px;
height: 20px;
float: left;
border-radius: 50%;
background-color: rgba(7, 17, 27, 0.4);
margin: 5px 6px;
box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.8) inset;
cursor: pointer;
}
.banner .dots .active {
/*小圆点高亮的样式*/
box-shadow: 0 0 0 2px rgba(7, 17, 27, 0.4) inset;
background-color: #fff;
}
.banner .arrow {
/*左箭头*/
width: 0;
height: 0;
border-right: 30px solid rgba(255, 255, 255, .5);
border-top: 30px solid transparent;
border-bottom: 30px solid transparent;
position: absolute;
left: 0;
top: 50%;
margin-top: -30px;
z-index: 2;
}
.banner .arrow:hover {
/*鼠标移动到箭头时候的样式*/
border-right-color: white;
}
.banner .next {
/*右箭头*/
left: auto;
right: 0;
top: 50%;
margin-top: -30px;
transform: rotate(180deg);
z-index: 2;
}
</style>
</head>
<body>
<div class="banner">
<div class="slide">
<!-- 当切换到A(副本)的时候,立马用JS将图片替换成图片A,
然后,再从第二张开始轮播,这个瞬间就是0ms,肉眼无法察觉。-->
<div class="pic c">C</div><!-- C(副本)-->
<!-- 真正要轮播的就这三个ABC图片 -->
<div class="pic a">A</div>
<div class="pic b">B</div>
<div class="pic c">C</div>
<!-- 这边也是同样的道理,无缝轮播要添加的副本 -->
<div class="pic a">A</div><!-- A(副本)-->
</div>
<div class="dots">
<div class="dot active"></div>
<div class="dot"></div>
<div class="dot"></div>
</div>
<div class="arrow next"></div>
<div class="arrow prev"></div>
</div>
<!-- 这里引用jQuery的源码 -->
<script type="text/javascript" src="../jquery-1.4.2.min.js"></script>
<script type="text/javascript">
//获取对应的jQuery元素
var $pic = $(".pic");
var $banner = $(".banner");
var $slide = $(".slide");
var $dot = $(".dot");
var $next = $(".next");
var $prev = $(".prev");
//定时器
var timer = null;
//控制图片索引
var index = 1;
//获取图片宽度
var picWidth = $pic.width();
//获取图片的张数
var size = $pic.length;
//鼠标移上去的时候轮播暂停
$banner.mouseover(function () {
//关闭定时器
clearInterval(timer);
});
//鼠标移走的时候,轮播继续
$banner.mouseleave(function () {
//自动播放
timer = setInterval(function () {
//图片切换
index++;
changeImg();
changeDots();
}, 1000)
});
//触发鼠标移走事件,初始化轮播状态
$slide.mouseleave();
//改变图片函数
function changeImg() {
//计算移动的距离: - 图片宽度*索引
var slideWidth = -1 * picWidth * index;
$slide.animate({
"left": slideWidth + "px"
}, "1500");
//索引从A开始,而不是副本开始
//此时移动到最后一张图片是,设置animate函数的值0,瞬间切换成第一张
if (index > size - 2) {
$slide.animate({
"left": -picWidth + "px"
}, 0
);
//索引切换为A的索引
index = 1;
}
//index<1的情况将会发生在点击上一张时
if (index < 1) {
$slide.animate({
"left": -picWidth * (size - 2) * +"px"
}, 0
);
//索引切换为C的索引
index = size - 2;
}
}
// 小圆点切换函数
function changeDots() {
//圆点索引始终为图片索引-1
//将当前圆点设置active样式,其他圆点取消active样式
$dot.eq(index-1).addClass("active").siblings().removeClass("active");
}
//点击小圆点事件
$dot.click(function (event) {
//返回触发事件的元素,获取的是dom对象
var target = event.target;
//转为jQuery对象,索引加一
index = $(target).index()+1;
changeImg();
changeDots();
});
//点击切换下一张
$next.click(function () {
index++;
changeImg();
changeDots();
});
//点击切换上一张
$prev.click(function () {
index--;
changeImg();
changeDots();
})
</script>
</body>
</html>
```
自我总结:
- 本身对CSS样式不太熟悉,这段代码参考自其他博主,一步步测试CSS样式属性,加深了对CSS定位的理解。
position:absolute
:生成绝对定位的元素,相对于static定位以外的第一个父元素进行定位,如上面的banner。position:relative
:相对定位,相对于其原本的位置进行定位,如上面的几个div块。z-index: 2
:设置优先级,z-index值大的将会覆盖在上面。
- 其次是关于定时器的实现,通过
setInterval(函数,毫秒值)
和clearInterval(定时器id)
控制循环执行函数。 - 还有就是jQuery实现动画效果的函数:
$(selector).animate({params},speed,callback);
- 需要注意的是,所有的元素的position属性值默认都是静态的,无法移动,如果希望移动,需要设置position的值。
- {params}:必须的参数,代表形成动画的css属性。
- speed:可选参数,代表效果时长,可以指定:
"slow"
,"fast"
或毫秒值。 - callback:可选参数,代表动画完成之后执行的函数名称。
$slide.animate({
"left": -picWidth + "px"
}, 0);
//动画执行效果持续0ms,瞬间完成,向左移动一张图片。
- 还有一个比较重要的DOM事件属性,叫做target,它可以返回触发事件的元素,原博主代码如下:
//点击小圆点事件
$dot.click(function (event) {
//返回触发事件的元素,获取的是dom对象
var target = event.target;
//转为jQuery对象,索引加一
index = $(target).index()+1;
changeImg();
changeDots();
});
- 我做了些改动,用this关键字代表当前触发事件的元素,仍然是DOM对象,需要向jQuery转化。
//点击小圆点事件
$dot.click(function () {
//this为DOM对象,需要$(this)转化为jQuery
index = $(this).index()+1;
changeImg();
changeDots();
});
另:如有错误,还望各位前辈评论区指出!万分感谢!