仿淘宝UED导航菜单

      昨天在淘宝UED网站上看到导航菜单很不错,于是自己动手写了一个。

      效果如下:

   

       顺便做了一种变体,实际上只是改变了CSS和一点HTML而已:


   

      代码如下:

var  SlideNavi  =  Class.create({
    initialize:
function (naviItems,currentClassName,slider){
        
var  self  =   this ;
        
this .naviItems  =  naviItems;
        
this .currentClassName  =  currentClassName;
        
this .slider  =  slider;
        
        
this .currentIndex  =   0 ;
        
var  currentTab  =   function (){
            
return  self.naviItems[self.currentIndex];
        }
        
this .timeInterval  =   new  Object();
        
var  getStep  =   function (target,current){
            
var  step  =  (target  -  current) / 5;
             if (Math.abs(step) < 1   &&  step  !=   0 ){
                step 
=  (target - current) > 0 ? 1 : - 1 ;
            }
            
return  Math.round(step);
        }
        
var  tabHover  =   function (item){
            
// 更改slider的位置和长短
            clearInterval(self.timeInterval);
            
var  initLeft  =  parseInt(self.slider.getStyle( " left " ));
            
var  initRight  =  initLeft  +  self.slider.getWidth();
            
            
var  targetLeft  =  parseInt(item.positionedOffset().left);
            
var  targetRight  =  targetLeft  +  item.getWidth();
            
            
if (initLeft  ==  targetLeft)
                
return ;
                
            
var  leftToRight  =   true ;
            
if (initLeft  >  targetLeft)
                leftToRight 
=   false ;
            
if (leftToRight){
                newTargetLeft 
=  targetLeft  +  Math.round((targetLeft  -  initLeft)  *   0.1 );
                newTargetRight 
=  targetRight  +  Math.round((targetRight  -  initRight)  *   0.05 );
            }
else {
                newTargetLeft 
=  targetLeft  +  Math.round((targetLeft  -  initLeft)  *   0.05 );
                newTargetRight 
=  targetRight  +  Math.round((targetRight  -  initRight)  *   0.1 );
            }
            
            
function  slide(){
                
var  stepLeft  =  getStep(newTargetLeft,initLeft);
                
var  stepRight  =  getStep(newTargetRight,initRight);
                
if (stepLeft  !=   0 ){
                    initLeft 
+=  stepLeft;
                }
                
if (stepRight  !=   0 ){
                    initRight 
+=  stepRight;
                }
                self.slider.setStyle({
                    left:initLeft 
+   " px " ,
                    width:initRight 
-  initLeft  +   " px "
                });
                
if (stepLeft  ==   0   &&  stepRight  ==   0 ){
                    
function  moveBack(){
                        
var  newStepLeft  =  getStep(targetLeft,newTargetLeft);
                        
var  newStepRight  =  getStep(targetRight,newTargetRight);
                        
if (newStepLeft  !=   0 ){
                            newTargetLeft 
+=  newStepLeft;
                        }
                        
if (newStepRight  !=   0 ){
                            newTargetRight 
+=  newStepRight;
                        }
                        self.slider.setStyle({
                            left:newTargetLeft 
+   " px " ,
                            width:newTargetRight 
-  newTargetLeft  +   " px "
                        });
                        
if (newStepLeft  ==   0   &&  newStepRight  ==   0 )
                            clearInterval(self.timeInterval);
                    }
                    clearInterval(self.timeInterval);
                    self.timeInterval 
=  setInterval(moveBack, 10 );
                    
                }
            }
            self.timeInterval 
=  setInterval(slide, 10 );
        }
        
var  changeTab  =   function (item){
            
if (item  !=  currentTab()){
                currentTab().removeClassName(self.currentClassName);
                item.addClassName(self.currentClassName);
                self.currentIndex 
=  item.index;
            }
            tabHover(item);
        }
        
var  tabBack  =   function (event){
            tabHover(currentTab());
        }
        changeTab(currentTab());
        
this .naviItems.each( function (item,index){
            item.index 
=  index;
            item.observe(
" mouseover " ,tabHover.bind(item,item));
            item.observe(
" mouseout " ,tabBack);
            item.firstDescendant().observe(
" click " ,changeTab.bind(item,item));
        });
    }
});

      基本原理还是很简单,看代码就能明白,但是为了达到缓冲效果还是有一点麻烦,首先要判断slider向左还是向右滑动,根据不同的方向来决定slider的left和width属性,然后还要往回移动,这个就需要再用一次setInterval就可以达到效果。出于学习,我还是使用了prototype1.6。

      点此下载示例

转载于:https://www.cnblogs.com/LongWay/archive/2008/10/28/1321627.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值