在和上一任务同一目录下面创建一个task0002_3.html
文件,在js
目录中创建task0002_3.js
,并在其中编码,实现一个轮播图的功能。
- 图片数量及URL均在HTML中写好
- 可以配置轮播的顺序(正序、逆序)、是否循环、间隔时长
- 图片切换的动画要流畅
- 在轮播图下方自动生成对应图片的小点,点击小点,轮播图自动动画切换到对应的图片
效果示例:http://echarts.baidu.com/ 上面的轮播图(不需要做左右两个箭头)
思路一:
看了网上的教程后,得知
制造轮播图,主要是让图片放在一排;然后让图片只在一个固定的区域内显示,超过该区域的用overflow:hidden进行隐藏;
对放置图片的包裹层css样式设置为position: relative;,图片为absolute;
然后通过JS对图片的left值进行调整,(设置负的left值等等),以显示轮播的效果;
思路二:
在这里我用JQ轮播图制造(渐隐切换的效果);
对图片进行相关的CSS样式进行设置;不过在这里的话图片是“叠”在一起的,html顺序靠后的图片,显示在最上面;
然后点击相关切换按钮的话,根据点击的设置,对当前图片和其他图片进行”隐藏“,从而让需要展示的图片进行”显示“;
因为上面说了html顺序靠后的图片,显示在最上面,但我们一般想的是第一张图应该显示在最上面;
行,用JQ把它搞定;选择图片列表的第一张图进行显示,其他的图片(兄弟元素)进行隐藏;
//$(".carouselContent li:eq(0)").show().siblings().hide()
其中.siblings()是获得匹配元素集合中每个元素的兄弟元素;这个属性我们后面也会用到;
1、(虽然要求中并没有要我们设置左右切换的按钮,但是嘛,一般都轮播图左右箭头按钮还是必不可少的)
因此先考虑左右按钮对图片进行切换;
想了下操作:点击前进按钮,下一张图片显示,其他图片进行隐藏;当如果当前图片是最后一张图片时候,点击前进按钮就应该是返回显示为第一张图片;
(1)首先设置变量用来记录当前图片所在的顺序(page);与图片实际的数量(bannerNum);
(2)点击判断,是最后一张图片就是返回第一张,page=bannerNum;不是就page++;
后退按钮同理;
不过要注意的是.eq()的开始数是从0开始的,也就是如果想选择中第一张图片的话,就是.eq(0);
当然,如果想与page数一致的话,一开始设置page=0就好了。
2、动态生成数字标签;
(1)首先css中设置数字标签的默认状态样式和选中状态的样式;
(2)根据bannerNum数,动态生成对应的数字标签,并且将"第一个“”设置为默认选中状态;
(3)难点在于你如何将当前点击的数字标签与相对应的图片进行绑定?
思路是获取当前点击的数字标签(this)与第一个数字里的相对位置;这里我用了index();i
index() 方法返回指定元素相对于其他指定元素的 index 位置。
index()
方法的返回值为Number类型,返回指定元素的索引位置(从0开始算起)。
注意:以下文本描述中的当前元素表示当前jQuery对象的第一个元素。
-
如果没有指定参数
object
,则返回当前元素
在其所有同辈元素中的索引位置。 -
如果
object
为String类型,则将其视作选择器,返回当前元素
在选择器所匹配的元素中的索引位置。如果该选择器不匹配任何元素或者当前元素
不在匹配到的元素内,则返回-1。 -
如果
object
为DOM元素或jQuery对象,则返回该元素(或该jQuery对象中的第一个元素)在当前jQuery对象所匹配的元素中的索引位置。
具体参考了:http://www.365mini.com/page/jquery-index.htm;
我想index()返回值也可以看作bannerNum的值吧,不知道这样想对不对;
之后就也类似左右切换按钮那样,选中的添加选中样式,其他兄弟元素添加未选中的样式;不得不说JQ的链式写法还挺方便的。
同时也在左右切换按钮那里,为数字标签添加切换效果,原理跟按钮那里一样的,这就不多说了。
3、配置轮播的顺序
这里的话只考虑了正序播放;
思路是用一个函数来模拟点击前进按钮,然后再用setInterval,对函数进行定时重复运行;从而显示自动轮播效果;
当然了,为了良好的用户体验,大部分轮播图都是在鼠标移入banner区域时候停止轮播,移出时时候重新进行轮播;
那么用jq的hover函数就搞定了;移入时候清除setInterval事件,移出时候重新运行setInterval事件;
4、总结
制造轮播图的过程还是挺有趣的,一开始感觉很难,但是把步骤分开之后,一点点的实现,真是十分有意思,只要把东西一点点的拆分,难的东西也就没那么难了。
改天再试下那种设置left来改变图片位置的轮播图方法。
<!DOCTYPE html> <html> <head lang="zh"> <meta charset="UTF-8"> <title>轮播</title> <style> a,img,ul,body{ margin: 0; padding: 0; } ul,li{ list-style: none; } .carouselWrap{ position: relative; margin: 0px auto; } .carouselContent{ 100%; height: 600px; overflow: hidden; } .carouselPrev,.carouselNext{ position: absolute; z-index: 2; top: 50%; margin-top: -50px; color: #fff; font-size: 80px; font-weight: bold; text-decoration: none; -webkit-transition: all 0.35s ease-in-out; } .carouselNext{ right: 0px; } .carouselContent li { position: absolute; left: 0; top: 0; text-align: center } .carouselContent li img { 100%;; height: 600px; } .carouselPrev:hover, .carouselNext:hover { background: rgba(204, 204, 204, 0.4); } .carouselList { position: absolute; bottom: 10px; text-align: center; z-index: 1; 100%; } .unsel{ color: &478f7; display: inline-block; text-align: center; line-height: 30px; 30px; height: 30px; border-radius: 50%; background: #fff; margin-right: 5px; cursor: pointer; } .sel{ display: inline-block; text-align: center; line-height: 30px; 30px; height: 30px; border-radius: 50%; margin-right: 5px; cursor: pointer; color: #ffffff; background-color: &478f7; } </style> <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script> </head> <body> </body> <div class="carouselWrap"> <a href="" class="carouselPrev"><</a> <a href="" class="carouselNext">></a> <ul class="carouselContent"> <li> <a href=""> <img src="banner/banner1.jpg"> </a> </li> <li> <a href=""> <img src="banner/banner2.jpg"> </a> </li> <li> <a href=""> <img src="banner/banner3.jpg"> </a> </li> <li> <a href=""> <img src="banner/banner4.jpg"> </a> </li> <li> <a href=""> <img src="banner/banner5.jpg"> </a> </li> </ul> <p class="carouselList"> </p> </div> <script> var page=1;//开始banner图页码; var bannerNum=$(".carouselContent li").length;//图片个数; for(var i=0;i<bannerNum;i++){ var carListspan=$("<span>").append(i+1).addClass("unsel");//按图片数量添加按钮 $(".carouselList").append(carListspan); } $(".carouselContent li:eq(0)").show().siblings().hide();//一开始只显示第一张图片; $(".carouselList span").eq(0).removeClass().addClass("sel");//.eq(i)是选择匹配元素的集合为指定的索引的哪一个元素 $(".carouselList span").click(function(){ var num=$(this).index();//点击时候该span相对与第一个span的 index 位置; $(".carouselContent li").eq(num).fadeIn(500).siblings().fadeOut(500); $(this).addClass("sel").siblings().removeClass().addClass("unsel");//.siblings()获得匹配元素集合中每个元素的兄弟元素 }) $(".carouselNext").click(function(e){ e.preventDefault(); if(page===bannerNum){ $(".carouselContent li").eq(0).fadeIn(500).siblings().fadeOut(500); $(".carouselList span").eq(0).addClass("sel").siblings().removeClass().addClass("unsel"); page=1; } else{ $(".carouselContent li").eq(page).fadeIn(500).siblings().fadeOut(500); $(".carouselList span").eq(page).addClass("sel").siblings().removeClass().addClass("unsel"); page++; } }) $(".carouselPrev").click(function(e){ e.preventDefault(); if(page===1){ $(".carouselContent li").eq(bannerNum-1).fadeIn(500).siblings().fadeOut(500);//因为页码数是与dom元素的序列数相差1; $(".carouselList span").eq(bannerNum-1).addClass("sel").siblings().removeClass().addClass("unsel"); page=bannerNum; } else{ $(".carouselContent li").eq(page-2).fadeIn(500).siblings().fadeOut(500);//page-2其实就是对应li序列中此时显示的图片的上一张图片,因为页码数是与dom元素的序列数相差1 $(".carouselList span").eq(page-2).addClass("sel").siblings().removeClass().addClass("unsel"); page--; } }); $(".carouselWrap").hover(function(){//hover(鼠标移入时候运行的函数,移出时候运行的函数) clearInterval(auto); },function(){ auto=setInterval(function(){ $(".carouselNext").trigger("click"); },3000) }); var auto=setInterval(function(){//打开页面后自动播放 $(".carouselNext").trigger("click"); },3000) </script> </html>