一款增强的3D carousel控件

3D carousel控件一览

3d carousel是常用于slide图文展示的效果,通过css transform修饰相邻的几张图文,用简单的代价呈现3d场景效果。

  经过比较,收费控件中我比较欣赏的是:royal-3d-carousel

  截图如下:


 

 

而开源的控件,我选中的是:Cloud 9 Carousel

  该控件采用MIT license。

截图如下:

 

 

聊聊过渡帧

为什么相中他两呢?最重要的一点,是它们都应用了requestAnimationFrame。

  虽然只是一个简单的甚至可以用 setInternal代替的API,但我认为它却是传统pc界面与移动终端界面的分水岭。为什么大家总感觉pc界面呆滞无趣,而移动终端的界面却让人爱不释手呢?

 我认为ios开创的移动界面其中一个重大的革新就是在界面的交互中采用了过渡帧动画,界面的切换过程从而变得平滑有趣,即使响应时间慢一点,人们也愿意等待这个切换的过程。

  过渡帧动画再与物理引擎结合的话,比如:手指滑动越快,界面的滑动响应就越长。这会让人们在现实世界中形成的经验在移动终端的交互中得到验证,符合他们的操作预期。当然就受人喜爱了。

对requestAnimationFrame有兴趣的朋友,可以移步这篇文章

 

对Cloud9 Carsousel的增强

要用这个carsousel控件来进行抽奖的话,需要解决的关键问题是:如何将控件只能加载几张图,扩展到加载几百上千张图?

我的策略是:

  1. 图标滚动到最近处,认为获得过中奖几率一次,打标记;

  2. 该图标继滚动到最远处时,检查图标的标记,如果已经打过标记,则将其移除滚动池,将下一个图标移入滚动池。

  3. 对每一次rendered最近图标重复上述逻辑。

 

 关键代码如下:

  对carsousel 增加方法,用于移除图标和加入新图标:

//c4w add
    this.replaceItem = function(item_index,attr) {
      var item= this.items[item_index];
      item.rendered=false;
      
      $(item.element).remove();
      var img =  new Image();
      $(img).attr(attr).css( "opacity", 0 );
      $container.append(img);
      var me=this;
      img.onload=function(){
    	  me.items[item_index] = new Item(img,me.itemOptions);
    	  //$(this).css( "opacity", 1 );
    	  $(this).parent().css( "opacity", 1 );
      }
    };

 

响应最近图标的rendered事件,并进行上述处理:

function rendered( carousel ) {
    	var item =  carousel.nearestItem();
    	var it_near = carousel.nearestIndex();
    	var len = carousel.items.length;
    	for(var i=0; i<2; i++){
        	var it_far = it_near+4+i;
        	if(it_far>=len)
        		it_far-=len;
        	var item_far = carousel.items[it_far];
        	//rendered item, repalce it with another img el
        	if(item_far.rendered){
        		carousel.pos++;
        		if(carousel.pos>=img_total)
        			carousel.pos=1;
        		
        		carousel.replaceItem(it_far,{
        			src:"images/png/"+carousel.pos+".png",
        			alt:"Title "+carousel.pos
        		});
        	}
    	}
    	
    	item.rendered=true;
        title.text( item.element.alt )

        // Fade in based on proximity of the item
        var c = Math.cos((carousel.floatIndex() % 1) * 2 * Math.PI)
        title.css('opacity', 0.5 + (0.5 * c))
      }

 

图片下载自:http://www.haotu.net/pack/3406/my-senven-icons 

请自行下载,控件使用请尊重原作者license声明。

最终效果

 

http://v.youku.com/v_show/id_XMTQwMzQ5MDcxMg==.html

 

转载于:https://my.oschina.net/u/1440018/blog/543229

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值