Javascript图片滚动


本文示例源代码或素材下载

  这两天做了一个图片滚动的效果,拿出来和大家共享。效果很简单,不过这是我第一次使用js库(prototype1.6)。虽然所引用的prototype文件大小远远超过了自己所写的代码,但是这毕竟是学习而已,用js库真的能让代码更简洁。

  查看示例: http://220.194.56.98:8000/LongWayDemos/slideshow/

  这是第一个类,主要来负责一个SlideShow的初始化和自动播放,具有多个SlideItem实例,存储在items数组中

varSlideShow=Class.create({
  //width:宽度
  //height:高度
  //btns:按钮数组
  //content:内容
  //options:选项
  initialize:function(width,height,btns,content,options){
    varself=this;
    this.width=width;
    this.height=height;
    this.btns=btns;
    this.length=btns.length;
    this.content=content;
    this.intervalId=newObject();
    this.autoPlayTimeout=newObject();
    
    //auto:自动转换
    //updown:上下还是左右
    //mouseType:"click"或者"mouseover"
    //autoInterval:自动播放时切换的间隔
    //bufferStep:缓动的步长数值越大缓动所用时间越多一般在5-15之间
    this.options={//prototype1.6.0.2ln1159
      auto:true,
      updown:false,
      mouseType:"click",
      autoInterval:3000,
      bufferStep:8,
      btnFocusHandler:null,
      btnBlurHandler:null
    }
    Object.extend(this.options,options||{});
    
    this.items=[];
    this.currentIndex=0;
    this.btns.each(function(btn,index){
      self.items.push(newSlideItem(self,btn,index));
    });
    
    this.items[0].switchTo();
  },
  
  autoPlay:function(){
    this.autoPlayTimeout=setTimeout(autoMove,this.options.autoInterval);
    varself=this;
    functionautoMove(){
      if(self.currentIndex+1>=self.length)
        self.items[0].switchTo();
      else
        self.items[self.currentIndex+1].switchTo();
    }
  }
});

这是第二个类,是SlideShow的一页,主要有switchTo方法,负责转换的具体实现

varSlideItem=Class.create({
  //slideShow:SlideShow实例
  //btn:按钮
  //index:按钮的索引
  initialize:function(slideShow,btn,index){
    this.slideShow=slideShow;
    this.btn=btn;
    this.index=index;
    
    this.position=-index*(this.slideShow.options.updown?this.slideShow.height:this.slideShow.width);
    varself=this;
    this.btn.observe(this.slideShow.options.mouseType,function(){self.switchTo.apply(self,arguments)});
  },
  
  switchTo:function(){
    clearInterval(this.slideShow.intervalId);
    if(this.slideShow.options.auto)
      clearTimeout(this.slideShow.autoPlayTimeout);
      
    if(this.slideShow.options.btnBlurHandler)
      this.slideShow.options.btnBlurHandler(this.slideShow.items[this.slideShow.currentIndex].btn);
    this.slideShow.currentIndex=this.index;
    
    if(this.slideShow.options.btnFocusHandler)
      this.slideShow.options.btnFocusHandler(this.btn);
    this.slideShow.intervalId=setInterval(setPosition,10);
    varself=this;
    functionsetPosition(){
      varcurrentPosition=parseInt(self.slideShow.content.getStyle(self.slideShow.options.updown?"top":"left"));
      vartargetPosition=self.position;
      varstep=(targetPosition-currentPosition)/self.slideShow.options.bufferStep;
      
      if(Math.abs(step)<1&&step!=0){
        step=(targetPosition-currentPosition)>0?1:-1;
      }
      currentPosition+=Math.round(step);
      
      if(self.slideShow.options.updown)
        self.slideShow.content.setStyle({"top":currentPosition+"px"});
      else
        self.slideShow.content.setStyle({"left":currentPosition+"px"});
      
      if(targetPosition==currentPosition){
        clearInterval(self.slideShow.intervalId);
        if(self.slideShow.options.auto)
          self.slideShow.autoPlay();
      }
    }
  }
});


  注:缓动效果的实现借鉴了cloudgamer所用的方法。即根据初始值和目标值计算出每一步的步长,初始值离目标值越大步长越大,初始值离目标值越小步长越小,从而实现缓动


« 
» 
快速导航

Copyright © 2016 phpStudy | 豫ICP备2021030365号-3