jQuery插件版无缝轮播,重写了之前的代码,显得更高大上一点

轮播图之前也写了好几个,但是对于怎么实现无缝轮播还是有着不小的困惑,趁着周末了解了一下实现原理之后,重写了之前发布的案例(再看那个案例写的代码,真心心塞啊,不过只要努力学习,天天进步就好)。好了,下面就来说下如何实现无缝轮播。

百度了很多,各种各样的说法,但说的都不太明白,最后还是看了视频解决的。

我实现的这种思路是这样的:
1、假设你是用无序列表实现的哈,里面的每个li 包含着你的一个图片,首先呢,你得克隆一份第一张图片,并将其追加到你的ul 里面。
2、通过改变ul 的left 值,你实现了一张一张的向左轮播,但是到了倒数第二张的时候(倒数第一张已经是你克隆添加上去的了),已经是最后一张了对吧。
3、这个时候不要慌,你继续向左切换是不是显示的是最后一张呢(但是最后一张的内容是和第一张相同的),就在你要继续切换到下一张之前,你把ul 的left 值又设为 0 ,仔细想一想,本来显示的是倒数第一张,但是它长的和第一张一模一样(克隆的当然一样咯),此时你去改变ul 的left  值将ul 移到了最开始的位置(这里的改变必须通过css直接设置left值改变,这是关键,不能有过渡效果,不然怎么欺骗眼睛呢),但是那个位置上显示的和最后一克隆的一模一样,你的肉眼是分不清的吧。
4、然后你再点击,是不是切换到第二张了啊,妥妥的实现了无缝轮播对吧。

好了,再来看一下代码:

  1 ;
  2 (function($) {
  3     var slidePictures = function() {
  4         var self          = this;
  5         this.slidePic     = $("#slide_pic"); //内容区域大图片的外层ul
  6         this.slideItem    = $("#slide_item"); //底部小图片的外层ul
  7         this.slidePic_li  = $("#slide_pic li"); //内容区域大图片
  8         this.slideItem_li = $("#slide_item li"); //底部小图片
  9         this.prevBtn      = $("#preBtn"); //前进按钮
 10         this.nextBtn      = $("#nextBtn"); //后退按钮
 11         this.length       = this.slidePic_li.length; //ul中图片的个数,因为大图和小图是一一对应的,所以个数相同
 12         this.speed        = 500; //speed为图片滑动速度,数值越大速度越慢
 13         this.index        = 0; //第一次显示的是第一张图片,所以索引为0;表明当前正在显示的图片索引
 14         this.timer;//定义一个定时器参数
 15         // 初始化各项参数和属性
 16         self.init();
 17         // 首先克隆一份第一张图片,并将其添加到外层ul中
 18         var clone = this.slidePic_li.first().clone();
 19         this.slidePic.append(clone);
 20         // 这里需要重新获取一下li,因为之前的this.slidePic_li保存的是克隆前的数据
 21         this.length = $("#slide_pic li").length;
 22
 23         this.prevBtn.click(function() {
 24             self.moveByClick(1);
 25         });
 26         this.nextBtn.click(function() {
 27             self.moveByClick(-1);
 28         });
 29     }
 30     slidePictures.prototype = {
 31         // 初始化函数,当页面刚加载完给页面一些默认的样式,或者执行相关函数
 32         init: function() {
 33             // 首先给外层ul一个left属性为0;
 34             this.slidePic.css("left", 0);
 35             // 获取每一个图片的宽度
 36             this.width = this.slidePic_li.width();
 37             // 将第一个小图片透明度默认设为1
 38             this.slideItem_li.first().css("opacity", "1");
 39             // 给每一个小图片添加一个id属性,用于标识
 40             this.giveItemAttrId();
 41             this.autoChange();
 42             this.cancleTimer();
 43             this.mouseoverShowBigPic();
 44         },
 45         // 突出显示底部小图片,用于标识当前大图位置,id为0即显示第一个
 46         showItem: function(id) {
 47             // 判断id值
 48             var item = id;
 49             if (item == this.length - 1) {
 50                 item = 0;
 51             }
 52             // 将所有的小图片透明度设为.3
 53             this.slideItem_li.css("opacity", ".3");
 54             // 将当前id的小图片透明度设为1
 55             this.slideItem_li.eq(item).css("opacity", "1");
 56         },
 57         // 得到当前透明度为needOpc的图片序号
 58         getCurrentShowPic: function(needOpc) {
 59             var item = 0;
 60             this.slideItem_li.each(function(index, el) {
 61                 var opc = $(this).css("opacity");
 62                 if (opc == needOpc) {
 63                     item = index;
 64                 }
 65             });
 66             return item;
 67         },
 68         mouseoverShowBigPic:function(){
 69             var self = this;
 70             this.slideItem_li.on(‘mouseover‘,function(){
 71                 var id = $(this).attr("id");
 72                 self.showNow(id);//显示大图片
 73                 self.showItem(id);//显示对应小图片
 74             })
 75         },
 76         // 鼠标划过小图片时显示对应的大图
 77         showNow: function(id) {
 78
 79             // 找到当前显示的图片的序号,item为当前序号
 80             var item = this.getCurrentShowPic();
 81             // 计算需要移动的距离
 82             var needMove = id * this.width;
 83             // 如果当前显示的图片在鼠标划过的图片的左方,则向左滑动,否则向右滑动
 84             if (id > item) {
 85                 this.slidePic.stop().animate({ left: "-" + needMove + "px" }, this.speed);
 86             } else {
 87                 this.slidePic.stop().animate({ left: "-" + needMove + "px" }, this.speed);
 88             }
 89             // 更新this.index;
 90             this.index = id;
 91         },
 92         // 每次鼠标点击左右按钮时滑动一张图片
 93         moveByClick: function(flag) {
 94             //如果没有传入参数则默认为1;
 95             var flag = flag||-1;
 96             // flag用于标记点击的是左键还是右键,flag > 0为左键,反之为右键
 97             // length为图片的个数
 98             var length = this.length;
 99             var width = this.width;
100             var speed = this.speed;
101             // 当点击的是左键时
102             if (flag > 0) {
103                 this.index--;
104                 if (this.index == -1) {
105                     this.slidePic.css("left", "-" + (length - 1) * width + "px");
106                     // 突出显示对应的底部小图片
107                     this.index = length - 2;
108                 }
109                 this.slidePic.stop().animate({ left: "-" + this.index * width + "px" }, speed);
110                 this.showItem(this.index);
111
112             } else { //点击右键时
113                 this.index++;
114                 /*当index为最后一张图片时,先将外层ul的left值设为0
115                 此时最后一张图片为后来克隆添加上的,将left值改为0后实际上显示的是第一张图片了
116                 但是由于最后一张和第一张相同,人眼看不出差别,所以以为还没有改变
117                 然后再将index设为1,让其切换到下一张图片,从而实现无缝轮播
118                 点击左键时原理相同
119                 */
120                 if (this.index == length) {
121                     this.slidePic.css("left", "0px");
122                     this.index = 1;
123                 }
124                 this.slidePic.stop().animate({ left: "-" + this.index * width + "px" }, speed);
125                 this.showItem(this.index);
126
127             }
128         },
129         // 将所有的小图片透明度设为需要的值
130         hideAllitem: function(opc) {
131             this.slideItem_li.each(function(index, el) {
132                 $(this).css("opacity", opc);
133             });
134         },
135
136         // 自动切换
137         autoChange: function() {
138             var self = this;
139             this.timer = setInterval(function(){
140                 self.moveByClick();
141             },1500);
142         },
143         //当鼠标划过相关区域时,停止自动播放
144         cancleTimer:function(){
145             var self = this;
146             $(".jq_wrap").on("mouseover",function(){
147                 clearInterval(self.timer);
148             });
149             $(".jq_wrap").on("mouseout",function(){
150                 self.autoChange();
151             })
152         },
153         // 给底部小图片一个id属性,用于标识
154         giveItemAttrId: function() {
155             var self = this;
156             this.slideItem_li.each(function(index, el) {
157                 $(this).attr("id", index);
158             });
159         }
160     };
161     window["slidePictures"] = slidePictures;
162 })(jQuery);

时间: 2024-10-05 16:58:29

jQuery插件版无缝轮播,重写了之前的代码,显得更高大上一点的相关文章

介绍两个JQuery插件 — 滚动和轮播

1.滚动组件. 有时候需要在网页中的各个部分跳转,类似于回到首页的功能,给点动画当然是极好的.JQuery插件AnimateScroll就是解决这个问题的. 使用方法类似这样: $('#use').animatescroll({scrollSpeed:1500, easing:'easeOutCubic'}); //跳转到#use处 更多方法请访问项目主页. 2.轮播组件 这款轮播组件同样基于JQuery,可以用来做个牛逼哄哄的3D相册神马的. demo地址:http://tympanus.ne

jquery实现图片无缝轮播显示(个人随笔)

纯属个人随笔,不当之处,欢迎指正. 代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>图片无缝轮播显示</title> <script type="text/javascript" src="JavaScript/jquery-1.11.2.min.js"></script&g

JQuery插件之图片轮播插件–slideBox

来源:http://www.ido321.com/852.html 今天偶然发现了一个比較好用的图片轮播插件-slideBox 先看看效果:http://slidebox.sinaapp.com/ 代码例如以下 1: <!doctype html> 2: <html> 3: <head> 4: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"

jquery插件讲解:轮播(SlidesJs)+验证(Validation)

转自:http://www.cnblogs.com/chenrf/p/5654093.html#undefined SlidesJs(轮播支持触屏)--官网(http://slidesjs.com) 1.简介 SlidesJs是基于Jquery(1.7.1+)的响应幻灯片插件.支持键盘,触摸,css3转换. 2.代码 <!doctype html> <head> <style> /* Prevents slides from flashing */ #slides {

jQuery 插件 jSlider 图片轮播

有导航箭头,可以自动播放,可以循环播放. 官方网站 https://github.com/copthuy/jSlider <!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8"> <title>jSlider 图片轮播插件</title> <meta name="description" content

jQuery制作无缝轮播效果

[一]HTML结构 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jquery制作无缝轮播器</title> <script type="text/javascript" src="jquery-1.12.4.js"></script> &

记一个jquery 无缝轮播的制作方法

接触前端也很久了,今天才发现,要做好一个轮播,其实有很多东西需要考虑进去,否则做出来的轮播效果并不好,下面我就来做一个轮播,是依赖jquery来写的 1.要做轮播,首先需要的是HTML的内容,css的机构样式,以下为html代码: 1 <!DOCTYPE html> 2 <html> 3 4 <head> 5 <meta charset="utf-8" /> 6 <link rel="stylesheet" hr

jquery无缝轮播事Dome

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>无缝轮播</title> <script type="text/javascript" src="js/jQuery1.11.1.js"></script> <style type=&qu

使用Ajax+jQuery来实现前端收到的数据在console上显示+简单的主页设计与bootstrap插件实现图片轮播

1.实现前端输入的数据在console上显示 上一篇是解决了在前端的输入信息在cygwin上显示,这次要给前台们能看见的数据,因为数据库里插入的数据少,所以写的语句翻来覆去就那几个词,emmm···当然实现了个不靠谱的,在前台还能看见用户密码 ·····功能是这个意思hhhh 在register也就是注册界面部分的代码: <script> $('#submit').on("click ", function () { var a = $('#login input[name