最近一直在搞一些有关元素动态展示的功能,这么做是为了增加用户的体验,使得客户端更加的具有和用户之间的交互作用;

下面是我这篇文章的大纲:

1,介绍两种插件,实现元素轮番展示和拖动元素滑动的效果;

2,插件参数的介绍;

3,扩展功能的提出和实现;

4,一些悬而未解的问题,写在最后希望高手指点迷津,经验交流,小生不胜感激!

进入正题:

(1)为大家介绍两款插件,使用起来比较简单,要是需要更高级的效果,还可以自己实现;一个是jquery插件:jcarousellite,一个是iscroll插件;官方地址分别是:

下面就写点自己使用过程中的一些感悟,一般网页上实现元素的滑动或者滚动都是使用ul元素进行封装,为什么要这么做?我在一个美女空间里发现了她写的一篇日志,解释的挺不错,在这里我就偷一下懒,引用她的观点了:

重组div的结构。

重组的主要目的是,在原div的里面添加一个div(player),在player里面添加另一个div(box)。这里两个div我觉得是非常有有必要的,后面要设置player的css,并且实际上滚动字幕的容器是player,位置变化,真正滚动的部分是box。当然,palyer的任务可以交给外面的div来完成,box的工作和任务可以交给里面的ul来完成,这样对设计师来说,原来的div还是div,只是用来布局的,没有任何影响。而里面的ul,有的设计师喜欢定义整个页面所有的ul的css,我怕会对我的字幕里的ul产生什么现在还不能预料的影响,所以在ul的外面嵌套一个div。 

iscroll中的滑动原理也是一样的,模式也是div+div+ul+li 简单点说:最外面的一层div可以看成是一个显示器,显示器下的第一个子元素就可以当做一个滚动元素的box,可以看成是一个滚动条,显示的元素多少,是有显示器的宽度来决定的,滚动的长短是由box的宽度来决定的;

jcarousellite 实现滚动,官方文档中介绍的很详细,这里我就不做过多的说明;

(2)

jcarousellite参数



Js代码


1. $.fn.jCarouselLite = function(o) {      
2.      o = $.extend({      
3. null,   //上一张按钮 
4. null,   //下一张按钮 
5. null,      //跳转到第几张 
6. false,   //是否支持鼠标滚轮,需要jquery.mousewheel.js 
7. null,   //是否自动滚动 
8.      
9. //滚动时长 
10. null,   //滚动优化,需要jquery.easing.1.1.js 
11.      
12. false,   //滚动方向,true垂直,false水平 
13. true,   //是否重复播放,首位相接 
14. //显示图片数量 
15. //从第几个开始滚动显示 
16. //每次滚动数量 
17.      
18. null,   //滚动前调用函数 
19. null        //滚动后调用函数 
20.      }, o || {});

iscroll 参数

这个就NB 了,里面的参数挺多的,下面就说一下比较特殊的几个,其他的基本参数就可以自己在iscroll中的API中查找,地址:http://cubiq.org/iscroll,若你感觉读官方文档比较吃力的话,这里有一篇翻译过来的,个人感觉不错:http://hi.baidu.com/ali_myself/blog/item/7cbe2aa296b1459046106419.html

iscroll4官方文档给出了5个例子,都挺经典的,有兴趣的可以仔细的研读一下;特别是pullUp/Down Refresh 这个在手机应用中经常能看到;

this.x /this.y:判断元素scroll left/right滑动距离可以使用this.x,这个参数是返回的结果是滑动元素li:first,距离最左边的一个距离,就相当于原点,scroll left ,this.x<0;scroll rigth ,this.x >0;同样,scroll也提供了 this.y ,这个可以参考pullUp/Down refresh例子中的js写法;

snap:捕获元素,通常设置为true,这样元素的滑动,是一屏一屏的滑动,你也可以设置成只捕获一个li元素,但是写法有要求:你可以写成“ li " or "li .a"但是”#scroller li" is wrong;

(3)

这里有个需求:iscroll只能实现元素的单方向的滑动,不能实现像jcarousellite那样的轮番循环的滑动,如果能把iscroll的滑动结合jcarousellite的循环展示,这该多好啊;

于是,就开始了我的工作:

1)判断元素向左向右滑动,

2)滑动一个元素,就把隐藏到div中的那个元素移到li元素的最后,可以直接的使用jquery操作元素,改变li布局,也可以改变li样式position,但是,实验证明:只改动position:left的坐标,下次获取元素的时候,使用eq()或者nth-child()方法获取的都不是指定的元素,这里我想到了使用refresh();好像也没有起作用,最后只能保险起见,先挪动position样式,然后更改li元素的位置,这样,不至于出现错误;

code:



onScrollEnd:function(){
			if(thisX > 0){
				this.minScrollX=450;
				var last = $("#thelist li").last();
				$("#thelist li").first().before(last);
				for(var i=0;i<=4;i++){
						var positions = $("#thelist li").eq(i).position().left;console.log("..."+$("#thelist li").eq(0));
						$("#thelist li").eq(i).css("left","+=90");
						if(positions >=360){
							$("#thelist li").eq(i).css("left","0px");
						}
						this.minScrollX -= 90;//alert(this.minScrollX);myscroll.refresh();
					}
			}else if(thisX < 0){//alert(this.options.bounce);
				var first = $("#thelist li").first();
				//var scrollWidth = 450;
				$("#thelist li").last().after(first);			
					this.maxScrollX = 450;
					for(var i=0;i<=4;i++){
						//$(".scroller").css("width",scrollWidth+"px");
						var positions = $("#thelist li").eq(i).position().left;
						$("#thelist li").eq(i).css("left","-=90");
						if(positions <= 0){
							$("#thelist li").eq(i).css("left","360px");
						}
						this.maxScrollX += 90;//scrollWidth += 90;$(".scroller").css("width",scrollWidth+"px");
					}
			}
		},



  

3)实现了,但是有个bug:每次的滑动都要先反弹,然后才能更换位置,这个原因是:我把置换位置的操作放到 了 方法onscrollEnd中执行了,应该放到onscrollMove中执行;而这又引发了另外的一种问题出现:滑动的时候,会闪屏,这个原因是因为每次的鼠标onmousemover事件都相应的触发了我写的置换元素位置的方法;这样,也就遇到了问题;怎样才能在onscrollMove中完美的实现滚动;