当前位置:编程学习 > JS >>

javascript实现块拖动导航菜单效果

HTML代码

 代码如下 复制代码
<div id="slider_menu" class="slider_menu">
 <div id="slider_menu1">
  <ul class="menu clearfix mb10">
   <li>渝中区</li>
   <li>江北区</li>
   <li>九龙坡区</li>
   <li>沙坪坝区</li>
   <li>渝北区</li>
   <li>大渡口区</li>
   <li>南岸区</li>
  </ul>
  <ul class="slider clearfix">
   <li class="move"></li>
  </ul>
 </div>
 
 <div id="slider_menu2">
  <ul class="menu clearfix mb10">
   <li>渝中区</li>
   <li>江北区</li>
   <li>九龙坡区</li>
   <li>沙坪坝区</li>
   <li>渝北区</li>
   <li>大渡口区</li>
   <li>南岸区</li>
  </ul>
  <ul class="slider clearfix">
   <li class="move"></li>
  </ul>
 </div>
</div><!--slider_menu-->

css

 代码如下 复制代码
<style type="text/css">
.slider_menu{border-radius:4px;border:1px solid #bbb;background:#f5f5f5;box-shadow:0 0 10px #ccc;width:540px;height:160px;padding:10px;margin:100px}
.slider_menu .menu{margin-left:20px}
.slider_menu .menu li{float:left;color:#555;padding:3px 8px;cursor:pointer;text-shadow:1px 1px 0 #fff;-webkit-transition:color .3s ease-out;-moz-transition:color .3s ease-out}
.slider_menu .menu .current{color:green;font-weight:800}
.slider_menu .slider{border:1px solid #ddd;background:#fff;border-radius:8px;height:8px;position:relative}
.slider_menu .slider .move{position:absolute;width:15px;height:15px;border-radius:15px;background:#eee;border:1px solid #aaa;top:-3px;cursor:pointer;box-shadow:0 0 3px #999;-webkit-transition:border .3s linear;-moz-transition:border .3s linear}
.slider_menu .slider .current,.slider_menu .on_move .move{border-color:#369;box-shadow:0 0 6px #B3E3FF}
#slider_menu1{padding:0 20px 30px;border-bottom:1px solid #ddd}
#slider_menu2{padding:20px 20px 0;border-top:1px solid #fff}
</style>

javascript

 代码如下 复制代码
var sliderMenu = function(id,opt){
 opt = opt ¦¦ {};
 this.box = $("#"+id);
 this.menu = this.box.find(".menu li");
 this.slider = this.box.find(".slider");
 this.move = this.slider.find(".move");
 this.moveWidth = this.move.outerWidth();
 this.S = {
  min:0,
  max:this.slider.width() - this.moveWidth
 }
 this.on = this.menu.eq(0);//当前选中项
 this.end = opt.end;//回调
 this.bind();
}
sliderMenu.prototype = {
 bind : function(){
  var T = this;
  this.menu.click(function(){
   T.turn($(this));
  })
  this.move.click(function(e){
   stopBubble(e);
  }).hover(function(){
   $(this).addClass("current");
  },function(){
   $(this).removeClass("current");
  });
  this.Move();
  //默认滑动到第一项
  window.setTimeout(function(){
   T.turn(T.on);
  },500)
 },
 Move : function(e){
  var T = this,
   D = $(document),
   moveNowPos = null,
   moveLastPos = null,
   mouseLastPos = null,
   mouseNowPos = null,
   c,
   E = {
    state : false,
    timer : null,
    down : function(e){
     E.state = true;
     e = e ¦¦ window.event;
     moveNowPos = parseInt(T.move.css("left"));
     mouseLastPos = e.clientX;
     T.slider.addClass("on_move");
     //绑定事件到document
     D.unbind("mousemove").unbind("mouseup").bind("mousemove",E.move).bind("mouseup",E.up);
     if(e.preventDefault){
      e.preventDefault();
     }else{
      e.returnValue = false;
     }
    },
    move : function(e){
     if(!E.state){return;}
     e = e ¦¦ window.event;
     mouseNowPos = e.clientX;
     c = mouseNowPos - mouseLastPos;
     moveLastPos = moveNowPos+c;
     if(moveLastPos<T.S.min&&c<0){
      moveLastPos = T.S.min;
     }
     if(moveLastPos>T.S.max&&c>0){
      c = T.S.max - moveNowPos;
      moveLastPos = moveNowPos+c;
     }
     T.move.css({
      "left":moveLastPos
     })
 
     if(E.timer) {
      window.clearTimeout(E.timer);
     }
     E.timer = window.setTimeout(function(){
      T.check(false);
     },5)
 
     if(e.preventDefault){
      e.preventDefault();
     }else{
      e.returnValue = false;
     }
    },
    up : function(){
     if(!E.state){return;}
     E.state = false;
     T.slider.removeClass("on_move");
     D.unbind("mousemove").unbind("mouseup");
     T.turn(T.on);
    }
   }
  this.move.bind("mousedown",E.down);
  //点击空白处
  this.slider.click(function(e){
   var mousePos = e.clientX,
    left = mousePos - T.slider.offset().left + $(window).scrollLeft() - T.moveWidth/2;
   if(left<T.S.min){left = T.S.min;}
   if(left>T.S.max){left = T.S.max;}
   T.move.animate({
    "left":left
   },80,function(){
    T.check();
   })
  })
 },
 check : function(t){
  var T = this,
   X = this.move.offset().left,
   x,w,m,
   first = this.menu.first(),
   last = this.menu.last();
  if(X<first.offset().left){
   this.turn(first,t);
   return;
  }
  if(X>last.offset().left+last.outerWidth()){
   this.turn(last,t);
   return;
  }
  //匹配菜单项
  for(var i=0;i<this.menu.length;i++){
   m = this.menu.eq(i);
   if(m.hasClass("current")){continue;}
   w = m.outerWidth();
   x = m.offset().left;
   if(X>=x&&X<=(x+w)){
    this.turn(m,t);
    break;
   }
  }
 },
 turn : function(j,t){
  var x = j.offset().left,
   w = j.outerWidth();
  j.addClass("current").siblings().removeClass("current");
  if(t!==false){
   this.move.animate({
    "left":x+w/2-this.slider.offset().left-this.moveWidth/2
   },200)
  }
  this.on = j;
  try{this.end();}catch(e){};
 }
}

效果如下图

 

 

补充:网页制作,js教程 
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,