jquery插件之无缝轮播

 1 //time 2017-10-23
 2 //by wen
 3 ;(function($, window, document, undefined){
 4 
 5     $.fn.slideshow = function(options){
 6         !options && (options = {});
 7         var settings = $.extend({
 8             autoplay: 500,//是否自动播放,数字则为自动播放的间隔时间
 9             delay: 300,//设置滚动事件,动画延长时间
10             loop: true//是否循环播放
11         }, options);
12         return this.each(function(){
13 //            methods.init.call($(this), settings);
14             var $this       = $(this),
15                 n           = 1,//当前图片索引
16                 img_width   = $this.width(),//图片宽度
17                 $thisbanner = $this.find('.banner'),
18                 timer        = null;//用于自动播放定时器
19             //如果设置为循环轮播
20             if(settings.loop){
21                 //为了从最后一张到第一张和从第一张到最后一张的无缝过渡eg(有图片1、2、3),则:3、1、2、3、1
22                 $thisbanner.append($this.find('.banner li').first().clone());
23                 $thisbanner.prepend($this.find(".banner li").eq($this.find(".banner li").length-2).clone());
24             }
25             
26             var new_len = $this.find(".banner li").length;//所有图片加起来总长度
27             
28             //点击点
29             $this.find('.dot li').click(function(){
30                 n = settings.loop ? ($(this).index() + 1) : $(this).index();
31                 $thisbanner.animate({
32                     marginLeft: -n*img_width + 'px'
33                 }, settings.delay);
34                 $(this).addClass('active').siblings().removeClass('active');
35                 
36             });
37             
38             //上一屏
39             $this.find('.pre').click(function(){
40                 if(!settings.loop && (n == 0)){
41                     return;
42                 }
43                 commonfn('l');
44             });
45             //下一屏
46             $this.find('.next').click(function(){
47                 if(!settings.loop && (n == new_len-1)){
48                     return;
49                 }
50                 commonfn('r');
51             });
52             
53             //滑动公共方法
54             function commonfn(direction){
55                 if($thisbanner.is(':animated')){ //当ul正在执行动画的过程中,阻止执行其它动作。关键之处,不然图片切换显示不完全,到最后图片空白不显示。
56                     return;
57                    }
58                 direction == 'r' ? n++ : n--;
59                 $thisbanner.animate({
60                     marginLeft: -n*img_width + 'px'
61                 }, settings.delay, function(){
62                     if(settings.loop){
63                         n = (n == 0) ? (new_len-2) : (n == (new_len-1) ? 1 : n);
64                         $(this).css('marginLeft', -n*img_width + 'px');
65                     }
66                     var index = settings.loop ? n-1 : n;
67                     $this.find('.dot li').eq(index).addClass('active').siblings().removeClass('active');
68                 })
69             }
70             
71             //自动播放(autoplay的值需要为正数,并且loop值为true)
72             if(/^d+(?=.{0,1}d+$|$)/.test(settings.autoplay) && settings.loop){
73                 timer = setInterval(function(){
74                     commonfn('r');
75                 }, settings.autoplay);
76             }
77             
78             //鼠标移上banner上就停掉轮播,移出鼠标则开始自动轮播
79             $this.hover(function(){
80                 clearInterval(timer);
81             },function(){
82                 timer = setInterval(function(){
83                     commonfn('r');
84                 }, settings.autoplay);
85             });
86         });
87     }
88 })(jQuery, window, document)

html模板为:

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <meta name="renderer" content="webkit|ie-comp|ie-stand">
 5         <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 6         <title></title>
 7         <style>
 8             * {
 9                 margin: 0;
10                 padding: 0;
11             }
12             ul li {
13                 list-style: none;
14             }
15             .slide {
16                 position: relative;
17                 width: 500px;
18                 height: 650px;
19                 overflow: hidden;
20             }
21             .slide .banner {
22                 width: 2500px;
23                 margin-left: -500px;
24             }
25             .slide .banner li {
26                 float: left;
27             }
28             .slide .dot {
29                 width: 90px;
30                 position: absolute;
31                 left: 50%;
32                 bottom: 20px;
33                 margin-left: -40px;
34                 z-index: 1;
35             }
36             .slide .dot li {
37                 width: 20px;
38                 height: 20px;
39                 float: left;
40                 margin-right: 10px;
41                 background: #fff;
42                 border-radius: 10px;
43                 cursor: pointer;
44             }
45             .dot li.active {
46                 background: darkslategray;
47             }
48             .slide .pre,
49             .slide .next {
50                 position: absolute;
51                 display: block;
52                 width: 30px;
53                 height: 30px;
54                 background: darkred;
55                 top: 50%;
56                 margin-top: -15px;
57                 z-index: 1;
58             }
59             .slide .pre {
60                 left: 20px;
61             }
62             .slide .next {
63                 right: 20px;
64             }
65         </style>
66     </head>
67     <body>
68         <div class="slide">
69             <ul class="banner">
70                 <li>
71                     <img src="images/carousel1.jpg" alt="" />
72                 </li>
73                 <li>
74                     <img src="images/carousel2.jpg" alt="" />
75                 </li>
76                 <li>
77                     <img src="images/carousel3.jpg" alt="" />
78                 </li>
79             </ul>
80             <a class="pre" href="javascript:void(0);"></a>
81             <a class="next" href="javascript:void(0);"></a>
82             <ul class="dot">
83                 <li class="active"></li>
84                 <li></li>
85                 <li></li>
86                 
87             </ul>
88         </div>
89         
90         <script src="js/jquery-1.8.3.min.js"></script>
91         <script src="js/my_slideshow.js"></script>
92         <script>
93             $(".slide").slideshow();
94         </script>
95     </body>
96 </html>
原文地址:https://www.cnblogs.com/holly-w/p/7718271.html