本文共 10325 字,大约阅读时间需要 34 分钟。
滑动展示效果主要用在图片或信息的滑动展示,也可以设置一下做成简单的口风琴(Accordion)效果。
这个其实就是以前写的图片滑动展示效果 的改进版,那是我第一篇比较受关注的文章,是时候整理一下了。 有如下特色: 1,有四种方向模式选择; 2,结合tween实现多种滑动效果; 3,能自动根据滑动元素计算展示尺寸; 4,也可自定义展示或收缩尺寸; 5,可扩展自动切换功能; 6,可扩展滑动提示功能。 兼容:ie6/7/8, firefox 3.6.8, opera 10.51, safari 4.0.5, chrome 5.0【基本原理】
通过设置滑动元素的位置坐标(left/right/top/bottom),实现鼠标进入的目标元素滑动展示,其他元素滑动收缩的效果。
难点是如何控制多个滑动元素同时进行不同的滑动,这里关键就在于把整体滑动分解成各个滑动元素进行各自的滑动。 方法是给各个滑动元素设置目标值,然后各自向自己的目标值滑动,当全部都到达目标值就完成了。 【容器设置】在_initContainer方法中进行容器设置,由于后面滑动参数的计算要用到容器,所以要先设置容器。
先设置容器样式,要实现滑动需要设置容器相对或绝对定位,并且设置overflow为"hidden"来固定容器大小,而滑动元素也要设置绝对定位。鼠标移出容器时会触发_LEAVE移出函数:
当autoClose属性为true时才会延时触发close方法。
【滑动对象】 程序初始化时会根据滑动元素创建滑动对象集合。 先获取滑动元素:如果没有自定义nodes滑动元素,就从容器获取childNodes作为滑动元素。
还要用nodeType筛选一下,因为ie外的浏览器都会把空格作为childNodes的一部分。接着用获取的滑动元素生成程序需要的_nodes滑动对象集合:
滑动对象用"node"属性记录滑动元素。
然后在_initNodes方法中初始化滑动对象。 每个滑动对象都有3个用来计算滑动目标值的属性:defaultTarget默认目标值,max展示尺寸,min收缩尺寸。 如果有自定义max尺寸或min尺寸,会根据自定义的尺寸来计算。 程序会优先按max来计算:其中clientSize是容器的可见区域尺寸,defaultSize是平均分配尺寸。
如果max是小数或1就按百分比计算,再把尺寸限制在defaultSize到clientSize的范围内。 再计算减去max后其他收缩元素的平均尺寸,就可以得到min了。 如果没有自定义max再按自定义min来计算:把元素尺寸作为展示尺寸来计算,同样要做范围限制,然后计算收缩尺寸。
得到尺寸计算函数后,再用_each方法历遍并设置滑动对象:其中current是当前坐标值,在移动计算时作为开始值的。
而defaultTarget是默认目标值,即默认状态时移动的目标值,根据defaultSize和索引得到。 还要设置当鼠标进入滑动元素时触发show展示函数:要在滑动元素的"mouseenter"事件中触发,并传递当前滑动对象的索引,再加上延时设置就可以了。
【滑动展示】当鼠标进入其中一个滑动元素,就会触发show方法开始展示。
首先执行_setMove方法设置滑动参数,并以索引作为参数。 在_setMove里面主要是设置计算移动值时需要的目标值、开始值和变化值。 先修正索引,错误的索引值会设置为0:如果滑动对象就是展示对象或者在展示对象前面,目标值就是min * i,因为第i+1个滑动对象的目标值就是i个min的大小。
否则,目标值就是min * ( i - 1 ) + max,其实就是把展示对象的位置换成max。 然后设置每个滑动对象的参数属性:其中target记录目标值,begin通过current得到开始值,目标值和开始值的差就是change改变值。
设置完成后,就执行_easeMove方法开始滑移,在里面重置_time属性为0,再就执行_move程序就正式开始移动了。 首先判断_time是否到达duration持续时间,没有到达的话,就继续移动。 程序设置了一个_tweenMove移动函数,用来设置缓动:利用tween算法,结合当前时间,开始值,改变值和持续时间,就能得到当前要移动的坐标值。
ps:关于tween缓动可以参考tween算法及缓动效果 。 当_time到达duration说明滑动已经完成,再执行一次_targetMove目标值移动函数:直接移动到目标值,可以防止可能出现的计算误差导致移位不准确。
【关闭和重置】 close方法可以关闭展示,即滑动到默认状态,默认在移出容器时就会执行。 默认状态是指全部滑动元素位于defaultTarget默认目标值的状态。 先用_setMove设置移动参数,当_setMove没有索引参数时,就会设置目标值为默认目标值:完成参数设置后,再执行_easeMove进行滑动,跟滑动展示类似。
reset方法可以重置展示,重置的意思是不进行滑动而直接移动到目标值。 如果没有索引参数,就会直接执行_defaultMove默认值移动函数:直接把滑动元素移动到默认状态。
如果有索引参数,就先用_setMove根据索引设置目标值,再执行_targetMove直接移动到目标值。 程序初始化后会执行一次reset,并且以自定义defaultIndex作为参数。 利用defaultIndex可以一开始就展示对应索引的滑动对象。 【方向模式】程序可以自定义mode方向模式,有四种方向模式:bottom、top、right、left(默认)。
其中right和left是在水平方向滑动,而bottom和top是在垂直方向滑动。 而right和left的区别是定点方向不同,left以左边为定点在右边滑动,right就相反。 具体参考实例就应该明白了,bottom和top的区别也类似。 程序是通过对不同的方向就修改对应方向的坐标样式来实现的。 例如left模式就用"left"样式来做移动效果,top模式就用"top"样式。 初始化程序中设置的_pos属性就是用来记录当前模式要使用的坐标样式的:而_horizontal属性就记录了是否水平方向滑动,即是否right或left。
在计算尺寸时,通过它来指定使用用水平还是垂直方向的尺寸。还有一个_reverse属性,判断是否bottom或right模式。
这个属性是为了解决一个问题,例如right模式要实现类似下面的效果:显然设置zIndex的方法比较好,程序也用了这个方法。
程序就是用_reverse属性来判断是否需要做这些修正。 首先在_initContainer中,根据_reverse重新设置zIndex:当_reverse为true时,由于定点位置是在索引的反方向,设置元素时也应该倒过来设的,所以要用maxIndex减一下。
在_setMove中,根据索引设置滑动目标值时,也要判断:不但滑动对象集合的索引要修正,展示对象的索引也要修正。
【自动展示扩展】 这次扩展用的是组合模式,原理参考的ImageZoom扩展篇的扩展模式部分 。 不同的是加了一个属性扩展,用来添加扩展方法:注意不能添加到SlideView.prototype,这样会影响到SlideView的结构。
“自动展示”要实现的是滑动对象自动轮流展示,并且取消默认状态而实行强制展示,可以用在图片的轮换展示。
只要在SlideView后面加入自动展示扩展程序,并且auto参数设为true就会启用。 原理也很简单,就是每次滑动/移动完成后,用定时器执行下一次滑动就行了。 首先在"init"初始化程序中,增加一个_NEXT程序,用来展示下一个滑动对象:作用是延时执行_NEXT程序,并且有一个_autoPause属性用来锁定执行。
然后设置几个需要执行的地方。
首先在"finish"完成滑动事件中,执行_autoNext方法,这样就实现了基本的自动展示了。 在鼠标进入滑动元素后,应该停止自动切换,所以在"enter"进入滑动元素事件中,会清除定时器并把_autoPause设为true来锁定。 对应地在"leave"鼠标离开容器事件中,要把_autoPause设回false解除锁定,再执行_autoNext方法重新启动自动程序。 并且在"leave"中设置autoClose为false,防止自动恢复默认状态。 最后还要重写reset:重写后的reset会强制设置索引来展示,并执行_autoNext进行下一次滑动。
【提示信息扩展】“提示信息”效果是指每个滑动对象对应有一个提示信息(内容)的层(元素)。
这个提示信息会在滑动对象展示时展示,收缩和关闭时关闭。 只要加入提示信息扩展程序,并且tip参数设为true就会启用。 提示扩展支持四种位置提示:bottom、top、right、left。 在"init"中,根据自定义tipMode获取_tipPos坐标样式:如果自定义了tipTag,就会根据标签来获取元素,否则就按默认值"*"获取全部元素。
如果自定义了tipClass,就会再根据className来筛选元素,注意可能包含多个样式,不能直接等于。 得到函数后,再创建提示对象:先获取提示元素,并设置相关样式,再给滑动对象添加一个tip属性,保存对应的提示对象。
其中"node"属性保存提示元素,"show"是展示时的坐标值,"close"是关闭时的坐标值。 如果没有自定义tipShow,默认展示时坐标值是0,即提示元素刚好贴在滑动元素边上的位置; 如果没有自定义tipClose,默认关闭时坐标是提示元素的尺寸,即提示元素刚好隐藏在滑动元素外面的位置。在"setMove"中设置提示移动目标值:
这个比滑动对象的设置简单得多,当设置了index参数,并且index等于该滑动对象的索引时才需要展示,其他情况都是隐藏。
要注意,跟滑动对象一样,在_reverse为true的时候需要修正索引。 在"tweenMove"、"targetMove"、"defaultMove"也要设置对应的移动函数。 为了方便样式设置,扩展了一个_setTipPos方法:根据_tipPos坐标样式来设置坐标值。
使用技巧【展示尺寸】
要自定义展示尺寸可以通过max和min来设置,可以按像素或百分比来计算。
如果不设置的话,就会按照元素本身的尺寸来展示。 所以滑动元素展示的尺寸并不需要一致的,程序可以自动计算。【Accordion效果】
Accordion是可折叠的面板控件,效果类似手风琴,SlideView通过设置也能做到类似的效果。
首先把autoClose设为false取消自动关闭,再设置defaultIndex,使SlideView处于展开状态不会关闭。 一般Accordion都有一个固定尺寸的标题,这个可以用min来设置。 这样就实现了简单的Accordion效果,具体参考第三个实例。 使用说明 实例化时,必须有容器对象或id作为参数:还提供了以下方法:
show:根据索引滑动展示; close:滑动到默认状态; reset:重置为默认状态或展开索引对应滑动对象; dispose:销毁程序。要使用自动展示,只要在SlideView后面加入自动展示扩展程序,并且auto参数设为true即可。
新增如下可选参数: autoDelay: 2000//展示时间要使用提示信息,只要加入提示信息扩展程序,并且tip参数设为true即可。
新增如下可选参数: 属性: 默认值//说明 tipPos: "bottom",//提示位置 tipTag: "*",//提示元素标签 tipClass: "",//提示元素样式 tipShow: null,//展示时目标坐标 tipClose: null//关闭时目标坐标转载地址:http://ffeyl.baihongyu.com/