js 实现slider封装

1)记得动画类代码要在启动新的动画时删除旧的动画

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>淘宝首页图片轮播效果</title>
    <style>
      <!--
      * {margin: 0;padding:0;}
      body {background: #222;}
      ol {list-style: none;}
      img {border: 0 none;}
      #slider,#sliderVertical {
       border: 1px solid #F60;
       width: 490px;
       height: 170px;
       overflow: hidden;
       position: relative;
       margin: 2em auto;
      }
      #slider .player {
       /*width: 2450px;
       height: 850px;*/
       position: absolute;
       top: 0px;
       left: 0px;
       width:2450px;
      }
      #sliderVertical .player{
        position: absolute;
        top: 0px;
        left: 0;
      }
      #slider .player li,#sliderVertical .player li {
       float:left;
       width: 490px;
       height: 170px;
      }
      #slider .btns,#sliderVertical .btns {
       position: absolute;
       right: 10px;
       bottom: 5px;
       height: 30px;
      }
      #slider .btns li,#sliderVertical .btns li {
       font: 13px Tahoma, Arial, 宋体, sans-serif;
       float: left;
       margin: 0 3px;
       border: 1px solid #F60;
       background-color: #FFF;
       color: #CC937A;
       opacity: .8;
       cursor: pointer;
       width: 20px;
       height: 20px;
       line-height: 19px;
       text-align: center;
       -moz-border-radius: 10px;
       -webkit-border-radius: 10px;
       border-radius: 10px;
      }
      #slider .btns li.active ,#sliderVertical .btns li.active{
       background: #F60;
       color: #FFF;
       font-weight: bold;
       opacity: 1;
      }
      -->
      </style>
  <body>
    <div id="slider">
     <ol class="player">
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292153222974220.jpg" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292153150002983.jpg" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292153066259174.jpg" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292152557505797.gif" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292152484534559.jpg" alt=""></a></li>
     </ol>
     <ol class="btns">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
     </ol>
    </div>
    <div id="sliderVertical">
     <ol class="player">
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292152484534559.jpg" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292152557505797.gif" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292153066259174.jpg" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292153150002983.jpg" alt=""></a></li>
      <li><a href=""><img src="//images0.cnblogs.com/i/386011/201403/292153222974220.jpg" alt=""></a></li>
     </ol>
     <ol class="btns">
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
     </ol>
    </div>
  </body>
  <script>
      function animate(o,start,alter,dur,fx) {
      /*
       * 功能说明:
       * 设置动画
       * o:要设置动画的对象
       * start:开始的对象
       * alter:总的对象
       * dur:动画持续多长时间
       * fx:动画类型
       */
       var curTime=0;
       var t=setInterval(function () {
        if (curTime>=dur) clearInterval(t);
        for (var i in start) {
          o.style[i]=fx(start[i],alter[i],curTime,dur)+"px";
        }
        curTime+=40;
       },40);
       return function () {clearInterval(t);};
      };
      var Tween = {
      /*
       * 功能说明:
       * 加速运动
       * curTime:当前时间,即动画已经进行了多长时间,开始时间为0
       * start:开始值
       * alter:总的变化量
       * dur:动画持续多长时间
       */
       Linear:function (start,alter,curTime,dur) {return start+curTime/dur*alter;},//最简单的线性变化,即匀速运动
       Quad:{//二次方缓动
        easeIn:function (start,alter,curTime,dur) {
         return start+Math.pow(curTime/dur,2)*alter;
        },
        easeOut:function (start,alter,curTime,dur) {
         var progress =curTime/dur;
         return start-(Math.pow(progress,2)-2*progress)*alter;
        },
        easeInOut:function (start,alter,curTime,dur) {
         var progress =curTime/dur*2;
         return (progress<1?Math.pow(progress,2):-((--progress)*(progress-2) - 1))*alter/2+start;
        }
       },
      };

      function $(id){
            return document.getElementById(id);
      }

      function getByClass(className,context){
            context=context||document;
            if(context.getElementsByClassName){
                  return context.getElementsByClassName(className);
            }else{
                  var nodes=[];
                  var tags=context.getElementsByTagName('*');
                  for(var i=0,l=tags.length;i<l;i++){
                        if(hasClass(tags[i],className))nodes.push(tags[i]);
                  }
            }
            return nodes;
      }

      function hasClass(node,className){
            var names=node.className.split(/\s+/);
            for(var i=0,l=names.length;i<l;i++){
                  if(names[i]==className)return true;
            }
            return false;
      }

      function Slider(options){
        /*参数说明:
        *player:要运行的图片容器,必须
        *distance:图片位移,必须(垂直的话则为图片高度,水平的话则为图片宽度)
        *dur:动画时间,默认1500ms
        *btns:按钮数组,必须
        *hoverClass:悬浮按钮样式,默认‘active’
        *isVertical:true/false,默认垂直
        *fx:动画效果,默认Tween.Quad.easeOut
        */
        this.player=options.player;
        this.btns=options.btns;
        this.num=this.btns.length;
        this.distance=options.distance;
        this.dur=options.dur||1500;
        this.hoverClass=options.hoverClass||'active';
        this.fx=options.fx||Tween.Quad.easeOut;
        this.isVertical=options.isVertical;
        this.current=0;
        this.intervalId=0;
        
        for(var i=0,l=this.btns.length;i<l;i++){
          var t=this.btns[i];
          t.index=i;
          var _this=this;
          t.onmouseover=function(){
            _this.stop();
            _this.invoke(this.index);
          }
          t.onmouseout=function(){
            _this.startPlay();
          }
        }
      };

      Slider.prototype.next=function(){
            this.invoke(this.current+1);
      };

      Slider.prototype.stop=function(){
          clearInterval(this.intervalId);
      }

      Slider.prototype.invoke=function(index){
        this.btns[this.current].className='';
        this.current=index;
        if(this.current>=this.num)this.current=0;
        var startVal = parseInt(this.isVertical?this.player.style.top:this.player.style.left) || 0;
        var alterVal = (parseInt(-startVal - this.distance * this.current));
        this.animateIterval && this.animateIterval();//修正快速切换时闪动
        this.animateIterval=this.isVertical?animate(this.player,{top:startVal},{top:alterVal},1000,this.fx):animate(this.player,{left:startVal},{left:alterVal},1000,this.fx)
        this.btns[this.current%this.num].className=this.hoverClass;
      }

      Slider.prototype.startPlay=function(){
            var _this=this;
            this.btns[this.current].className=this.hoverClass;
            this.intervalId=setInterval(function(){_this.next()},this.dur);
      }

      var options={};
      var slider=$('slider');
      options.player=getByClass('player',slider)[0];
      options.btns=getByClass('btns',slider)[0].getElementsByTagName('li');
      options.isVertical=false;
      options.distance=490;
      options.dur=2500;
      options.fx=Tween.Quad.easeInOut;
      
      var mySlider=new Slider(options);
      mySlider.startPlay();

      var options={
        player:getByClass('player',$('sliderVertical'))[0],
        btns:getByClass('btns',$('sliderVertical'))[0].getElementsByTagName('li'),
        isVertical:true,
        dur:2500,
        distance:170
      }
      var myVerticalSlider=new Slider(options);
      myVerticalSlider.startPlay();
  </script>
</html>

 

posted @ 2014-03-29 21:51  hugh.wei  阅读(734)  评论(0编辑  收藏  举报