【图片轮播特效插件】--- 效果实现

忙了一段时间,终于能好好静下来写这篇博文了,那废话就不多说,直接开始吧。

按照上一篇对于jQuery插件的学习掌握,首先就是搭好一个合适的框架,定好插件中需要用到的属性,给其他使用者留出使用接口:

 1 (function($){
 2     //各种默认的属性参数
 3     var defaults = {
 4         width: 400,
 5         height: 200,
 6         direction:'left',
 7         imgs:[{
 8             src:'p0.jpg',
 9             link:'http://www.cnblogs.com/bikeway'
10         },{
11             src:'p1.jpg',
12             link:'http://www.cnblogs.com/bikeway'
13         },{
14             src:'p2.jpg',
15             link:'http://www.cnblogs.com/bikeway'
16         }]
17     }
18     
19     //提供插件唯一可调用的接口slideImg
20     $.fn.slideImg = function(options){
21         options = $.extend({},defaults,options);
22         return this.each(function(){
23             init($(this),options);
24         })
25     };
26 })(jQuery);

这里我默认了插件显示时的宽、高、滚动方向以及三张图片(图片默认链接到我的博客首页)

这里需要说的是return this.each(function(){......}),

但也可以这样写:

$.fn.slideImg = function(options){

  this.each(funciton){

  //code........

  }

}

这里我比较喜欢以及推荐第一种写法,因为jQuery有一个很棒的特点就是可以进行方法级联,我们应该始终在方法中返回一个元素。并且每一方法块都能很好的区分开,代码看起也很舒服。

然后便是初始化写好的插件

 1 function init(obj,options){
 2         var imgs = "<div class='imgBox'>",
 3             tips = "<div class='tipBox'>",
 4             len = options.imgs.length;
 5         for(var i = 0; i < len; i++){
 6             if(options.imgs[i].link){
 7                 imgs += "<a href='"+options.imgs[i].link+"'>";
 8                 imgs += "<img src='"+options.imgs[i].src+"'/>"; 
 9                 imgs += "</a>";
10             }else{
11                 imgs += "<img src='"+options.imgs[i].src+"'/>"; 
12             }
13             tips += "<a href='javascript:void(0)'></a>"
14         }
15         imgs += "</div>";
16         tips += "</div>";
17         
18         $(obj).append(imgs).append(tips);
19      $('.tipBox a').eq(0).addClass('current');
20          $(obj).css({
21              'width':options.width,
22              'height':options.height
23         });
24 
25          $('.imgBox a').css({
26              'width':options.width,
27              'height':options.height
28          });
29 
30          $('.imgBox img').css({
31              'width':options.width,
32              'height':options.height
33          });
34 
35         $('.tipBox').css({
36             'left':(options.width - 11 * len - 10) / 2
37         })
38 
39         if(options.direction == 'top' || options.direction == 'bottom'){
40             $('.imgBox a').css({
41                 'display':'block'
42             })
43             $('.imgBox').css({
44                 'width':'100%',
45                  'height':options.height * len
46             })
47         }else{
48             $('.imgBox').css({
49                 'width':options.width * len,
50                 'height':'100%'
51             })
52         }
53 
54 
55         var dir = options.direction;
56         switch(dir){
57             case 'top':{
58                 setInterval(function(){autoSlideTop(options)},3000);
59                 break;
60             }
61             case 'right':{
62                 setInterval(function(){autoSlideRight(options)},3000);
63                 break;
64             }
65             case 'bottom':{
66                 setInterval(function(){autoSlideBottom(options)},3000);
67                 break;
68             }
69             case 'left':{
70                 setInterval(function(){autoSlideLeft(options)},3000);
71                 break;    
72             }
73         }
74     }

这段代码中我省略了许多为滚动标记设置样式的代码,只设置了不影响插件效果所必须的样式(而且我喜欢用jQuery的方式设置样式,而不是写在标签里,我觉得这样修改会较为方便)。在demo中我会单独写个slideImg.css文件,作为这个插件的默认样式。

最后便是关键的效果实现部分,这里我贴出的代码只包含了向左滚动的部分

 1         var index = 0;
 2         function autoSlideLeft(options){ 
 3         if($('.imgBox').position().left == -options.width * (options.imgs.length - 1)){
 4             index = 0;
 5             $('.imgBox').animate({left: '0'},1000);
 6             $('.tipBox a').each(function(i){
 7                 if (index == i) {
 8                     $(this).addClass('current'); 
9
}else{ 10 $(this).removeClass('current');
11 } 12 }) 13 }else{ 14 index++; 15 $('.imgBox').animate({left: "-="+options.width,},1000); 16 $('.tipBox a').each(function(i){ 17 if (index == i) { 18 $(this).addClass('current');
19 }else{ 20 $(this).removeClass('current');
21 } 22 }) 23 } 24 }

到此滚动插件已经初步完成,实现了上篇随笔定下的三个功能,下一篇我希望能优化下代码,再加上touch事件。

效果图:滚动时截图:

最后附上本次实现的【图片轮播特效插件】

demo

posted @ 2014-09-22 17:50  zfareast  阅读(198)  评论(0编辑  收藏  举报