本周的作业是写一个类似淘宝首页的jQuery轮播图,这里做出记录。
如有错误,欢迎批评指证。
一个轮播图静态的部分分为三个
<div class="container"> <!-- 展示区 -->
<div class="photoContainer">
<img src="img/3.jpg" alt="3" >
<img src="img/1.jpg" alt="1" >
<img src="img/2.jpg" alt="2" >
<img src="img/3.jpg" alt="3" >
<img src="img/1.jpg" alt="1" >
</div>
<ul class="dots"> <!-- 三个小按钮 -->
<li class="dot"></li>
<li class="dot"></li>
<li class="dot"></li>
</ul>
<div class="left-triangle"> <!-- 向左的箭头 -->
<img src="img/left_arrow.png" id="left">
</div>
<div class="right-triangle"> <!-- 向右的箭头 -->
<img src="img/left_arrow.png" id="right">
</div>
</div>
.container{
width: 600px;
height: 400px; /*宽和高可以自己设置*/
background: black;
margin:20px auto;
overflow: hidden;
position: relative;
}
利用overflow属性将超出展示区的部分隐藏
图片的容器依靠展示区的容器定位 设置position属性
.photoContainer{
position: absolute;
left: -600px;
display: inline-block;
white-space: nowrap;
}
.photoContainer img{
width: 600px;
height: 400px; /*和展示区的长宽设置为一样的*/
margin: 0;
padding: 0;
display: inline-block;
}
.left-triangle{
position: absolute;
top: 50%;
left: 0;
margin-top:-27.2px;
margin-left:-37px;
transition: margin-left 1s;
cursor: pointer;
}
.right-triangle{
position: absolute;
top: 50%;
right: 0;
margin-top:-27.2px;
margin-right:-37px;
transition: margin-right 1s;
cursor: pointer;
}
#right{
transform: rotate(180deg); /*顺时针旋转180°*/
}
.dots{
width: inherit;/*获取父元素的相应值*/
position: absolute;
bottom: 10px;
text-align: center;
}
.dot{
display: inline-block;
width: 20px;
height: 20px;
border-radius: 50%;
background: white;
margin-right: 20px;
cursor: pointer;
}
.redDot{
background: red;
}
其中的.redDot是高亮显示的样式
/*暂时css确定鼠标移动到 出现左右小图标*/
.container:hover .left-triangle{
margin-left:0;
}
.container:hover .right-triangle{
margin-right:0;
}
这个部分的难点在于:
对于第一个问题:
一个小技巧就是在要展示的图片的第一张前面放最后一张
最后一张图片的后面放上第一张图片
代码如下:
<div class="photoContainer">
<img src="img/3.jpg" alt="3" >
<img src="img/1.jpg" alt="1" >
<img src="img/2.jpg" alt="2" >
<img src="img/3.jpg" alt="3" >
<img src="img/1.jpg" alt="1" >
div>
第二个问题:
setInterval()
方法会重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟,返回一个intervalID
,可以作为参数传给clearInterval()
来取消该定时器。解决的了以上两个问题就可以写定时器部分
//默认第一个小圆点是亮的
$(".dots").children("li").eq(0).addClass("redDot");
//获取图片的宽度
var imgWidth = $(".photoContainer").children('img').eq(0).width();
//获取原点的数量
var length = $(".dots").children('li').length;
//设置定时器的变量
var time;
function run(){
clearInterval(time); //清除迭代器防止鬼畜
time = setInterval(function(){
//亮小圆点
$(".dots").children('li').each(function(){
//如果是当前图片
if($(this).hasClass("redDot")){
num = $(this).index()+ 1;
//图片移动
$(".photoContainer").animate({
//去掉收尾用于衔接的图片的宽度
left :-num*imgWidth - imgWidth + "px"
},800);
//到达最后一张,从头开始
if(num == length){
$(".photoContainer").animate({
left:-imgWidth+"px"
},0);
num = 0;
}
}
});
//改变相应小圆点的样式
$(".dots").children('li').eq(num).addClass("redDot");
//移除其他小点的样式
$(".dots").children('li').eq(num).siblings("li").removeClass('redDot');
},2000);
}
注意:
给容器添加相应的清除和创建定时器事件就可以实现:
//鼠标移动到窗口内
$(".container").mousemove(function(event) {
clearInterval(time);
});
//移出窗口内
$(".container").mouseout(function(event) {
run();
});
难点:第一张图片移动到最后一张图片
可以通过在第一张图片的dom结构之前加最后一张图片,直接用animate属性向左移动,时间为0.多添加的图片就作为铺垫效果。实现无缝链接
//当达到最左边的时候
if(flag < 0){
flag = length-1;
$(".photoContainer").animate({left: -flag * imgWidth - imgWidth+"px"}, 0);
}
整体代码
$(".left-triangle").click(function(event) {
var flag;
//判断当前在哪一个照片
$(".dots").children('li').each(function(){
//将图片容器向右移动
if($(this).hasClass('redDot')){
flag = $(this).index() - 1;
$(".photoContainer").animate({left: -flag * imgWidth - imgWidth+"px"}, 300);
//当达到最左边的时候
if(flag < 0){
flag = length-1;
$(".photoContainer").animate({left: -flag * imgWidth - imgWidth+"px"}, 0);
}
}
});
//图标按钮改变
$(".dots").children('li').eq(flag).addClass('redDot');
$(".dots").children('li').eq(flag).siblings('li').removeClass('redDot');
});
与左边箭头类似 只需在最后一张后面添加第一张图片,同时annimate时间设置为0.
//右边按钮添加事件
$(".right-triangle").click(function(event) {
var flag ;//判断当前在哪一个照片
$(".dots").children('li').each(function(){
//将图片容器向左移动
if($(this).hasClass('redDot')){
flag = $(this).index() + 1;
console.log(flag);
$(".photoContainer").animate({left: -flag * imgWidth - imgWidth +"px"}, 300);
//当达到最右边的时候 回到最左边
if(flag == length){
flag = 0;
$(".photoContainer").animate({left: -imgWidth + "px"}, 0);
}
}
});
//图标按钮改变
$(".dots").children('li').eq(flag).addClass('redDot');
$(".dots").children('li').eq(flag).siblings('li').removeClass('redDot');
});
利用事件委托 给父元素添加事件。判断当前图片并进行移动。
//给小点添加事件 事件委托
$(".dots").on("click","li",function(event) {
$(this).addClass('redDot');
$(this).siblings('li').removeClass('redDot');
//获取当前序号
var flag = $(this).index();
$(".photoContainer").animate({
left: -flag*imgWidth - imgWidth + "px"},
300);
});