需求 : 图片切换的时候下一屏不允许出现空白的项,换句话说就是 :
1、当移动的最后一屏移动的个数小于要展示的个数的时候 ,只移动(展示个数-最后一屏的个数的)差值。 举个例子: 每一屏都要展示7个,但总个数才10个,滚动到下一屏时候用户看到的还是7个,这个时候需要移动的是三个
这个效果是基于jQuery写的,只是想纪念下自己的学习 话不多说了,贴代码
1 (function( $ ){ 2 var slider = function( elem , args ){ 3 this.config = $.extend({ 4 effect : 'x', //效果 水平 - x 5 speed : 600 , //动画速度 6 trigger : 'mouseenter', //触发事件 7 callback : null , // 回调函数 8 view : 7 9 }, args || {} ); 10 11 this.history = [];//记录移动的历史记录 12 this.index = 0; 13 this.el = elem; 14 this.length = this.el.find('li').length;//记录总长度 15 this.width = this.el.find('li').eq(0).outerWidth();//记录每一个单项的宽度 16 this.init(); 17 } 18 slider.prototype = { 19 constructor : slider, 20 init : function(){ 21 this.bindEvents(); 22 }, 23 bindEvents : function(){ 24 this.prev(); 25 this.next(); 26 }, 27 prev : function(){ 28 this.el.find('[data-type="left"]').click( $.proxy(function(){ 29 30 if( !this.history.length ) return;//如果记录为空,证明没有进行移动过,所以直接return 31 32 this.index--; 33 var step = this.history.pop();//取最后的移动步骤 34 var move = step * this.width;//算出移动宽度 35 this.el.find("ul").animate( { "left" : "+="+move+"px" } , this.config.speed ) 36 37 } , this)); 38 }, 39 next : function(){ 40 this.el.find('[data-type="right"]').click( $.proxy(function(){ 41 //如果是当前的最后一页,直接return 42 if(this.index == parseInt( this.length / this.config.view , 10 ) ){ 43 return; 44 } 45 this.index++; 46 //这个计算很重要 47 //计算 ( 下一页 * view ) 展示个数是否大于总长度 : 好比当前在第一页 (1+1) *7 > 12(总长度) 48 //则this.step 赋值为取余 ,也就是剩下要移动的个数 49 if( this.config.view * (this.index+1) > this.length ){ 50 this.step = this.length%this.config.view; 51 }else{ 52 //否则移动展示的个数 53 this.step = this.config.view; 54 } 55 //记录移动的历史记录 56 this.history.push(this.step); 57 var move = -1 * this.step * this.width; 58 this.el.find("ul").animate( { "left" : "+="+move+"px" } , this.config.speed ) 59 60 } , this)); 61 } 62 } 63 64 $.fn.slider = function( args ){ 65 return this.each(function(){ 66 var el = this; 67 var plugins = new slider( $( el ) , args ); 68 $(el).data("slider" , plugins ); 69 }); 70 } 71 })(jQuery)
开始对这个实现没有好的想法,本来想利用一个变量记录当前的移动个数的,但是后面突然想到用数组来做这样子的处理,顿时感觉清晰了。
这个的实现重点是一个记录移动步骤的数组。向左移动的时候往数组里面push移动的步骤,向右移动的时候,从数组里面取最后一项 [].pop()。
这样子很好的实现了需求,做的比较粗糙,麻烦各位大神提点意见