html xp菜单,XP折叠菜单&仿QQ2006菜单_javascript技巧

// JavaScript Document

/*========================================

* 文件名: navbar.js

* 编 码: Utf-8

* 功 能:实现菜单折叠的javaScript

* 作 者:雷晓宝

* 版 本: 2.3

* 时 间:2006-03-07

===========================================*/

//========================定义menu类==================;

function Menu(head,child,dir,speed,init_state,ext_on,ext_off)

{

this.head = document.getElementById(head);//菜单头

this.body = document.getElementById(child);//菜单体

this.direction = dir;//菜单收起的方向

this.speed = speed;//速度

this.ext_on = ext_on;//扩展菜单展开调用

this.ext_off = ext_off;//扩展菜单收起调用

this.init_state = init_state;//设置菜单的初始状态 true/false

this.a = 10;//加速度

//私用变量;

this._interval = false;

this._last_state = false;

this._size = false;

this._temp = false;

this._js = false;

this._p = false;

this._parent = false;

this._parent_control = false;

var self = this;

var temp = new Array(null,null);//temp[0]用来给_off()用,temp[1]用来给_on()用

//=============================方法=============================

//点击事件处理

this.click = function(e)

{

if (self._parent_control)

{

self._parent._control(self);

return false;

}

else

{

Interval.clear(self._interval);

if (self._last_state == false)

{

self._on();

return false;

}

else

{

self._off();

return false;

}

}

}

//初始化

this.init = function()

{

this.head.onclick = this.click;

this.head.onkeypress = function(e)

{

e||(e=window.event);

if (!(e.keyCode ==32 || e.keyCode == 0))return;

//alert(':)');

self.click();

}

for(var i=0;i{

if (this.body.childNodes[i].nodeType==1)

{

this._p=this.body.childNodes[i];

break;

}

}

if (parseInt(this.body.style.height))//this.body.style.getPropertyCSSValue('height')this.body.currentStyle.height

{

this._size = parseInt(this.body.style.height);

}

else

{

this._size = this._p.offsetHeight;

}

switch (this.init_state)

{

case true:

if (this.body.style.display == 'none')

{

//this._last_state = false;

this._on();

}

else

{

this._last_state = true;

}

break;

default://case false:

if (this.body.style.display !='none')

{

this._last_state = true;

this._off();

}

break;

}

}

//展开菜单

this._on = function()

{

if (self._last_state == false)

{

self._last_state = true;

self.body.style.display="";

temp[1] = self.a?2*parseInt(Math.sqrt(self.a*self._size))+1:self._size/5;

if (isNaN(parseInt(self.body.style.height)))self.body.style.height="0px";

if (self.ext_on)

{

self.ext_on(self.head,self.body)

}

self._interval = Interval.set(self._action_on,speed);

}

//setTimeout('slowon("'+self.body.id+'")',5)

}

//收起菜单

this._off = function()

{

if (self._last_state == true)

{

self._last_state = false;

//if (temp[0] == null)

//{

temp[0]=self.a?2*parseInt(Math.sqrt(self.a*self._size))+1:self._size/5;;

//}

if(isNaN(parseInt(self.body.style.height)))self.body.style.height = self._size+'px';

if (self.ext_off)

{

self.ext_off(self.head,self.body)

}

self._interval = Interval.set(self._action_off,this.speed);

}

}

//以下处理滑动

this._action_on = function()

{

if (parseInt(self.body.style.height)+temp[1]>self._size)

{

self.body.style.height = self._size+'px';

Interval.clear(self._interval);

}

else

{

self.body.style.height = parseInt(self.body.style.height)+temp[1]+'px';

temp[1] +=self.a;

}

}

this._action_off = function()

{

if(parseInt(self.body.style.height)-temp[0]<0)

{

Interval.clear(self._interval);

self.body.style.display = "none";

}

else

{

self.body.style.height = parseInt(self.body.style.height)-temp[0]+'px';

temp[0]-=self.a;

}

}

}

//meanu类结束

//====================定义Navbar类,用来管理一组menu集合===============================

function navbar(dir,a,speed,ext_on,ext_off)

{

this.open_only_one = true;//这组menu在任何时刻是否只有一个在开启,true/false

this.dir = dir;//menu组的公共方向,既然是一组menu它们应该有相同的方向吧?

this.a =a;//menu公共加速度

this.speed =speed;//公共速度

this.ext_on = ext_on;//公共扩展打开函数调用

this.ext_off = ext_off;//公共的扩展收起函数调用

this.menu_item = new Array();//menu组

this._openning;//如果只允许打开一个菜单,这个就会记录当前打开的菜单

this.open_all = function()//

{

};

this.add = function (head,body)//添加menu的函数

{

var temp = new Menu(head,body,this.dir,this.speed,this.ext_on,this.ext_off);

this.menu_item.push(temp);

};

this.init = function ()//Navbar的初始化函数,必须在add完成后调用

{

if(this.open_only_one == true)

{//如果只允许一个打开,那么仅仅设置菜单组的第一个菜单为打开状态

if (this.menu_item.length>0)

{

with(this.menu_item[0])

{

init_state = true;

_parent = this;//设置menu的父亲为这个Navbar

_parent_control = true;//设置父亲来控制菜单

init();

}

this._openning = this.menu_item[0];

}

for(var i = 1; i{//设置出第一个外的其他菜单为关闭,同时设置好其他参数

with(this.menu_item[i])

{

init_state = false;

_parent = this;

init();

_parent_control = true;

}

}

}

else

{//如果open_only_one == false 那么仅仅初始化菜单

for(var i = 0;i{

this.menu_item.init();

}

}

};

//额外添加的父亲控制函数

this._control = function(child)

{

var self =child;

Interval.clear(self._interval);

if (self._last_state == false)

{

if (typeof(self._parent._openning) == 'object')

{

self._parent._openning._off();

self._parent._openning = self;

}

self._on();

return false;

}

else

{

//self._off();

return false;

}

}

}//Navbar类结束

//===============================interval 处理=============================

//注意:_stack 只有20个

//扩充时必须赋初值1-n

Interval=

{

length:20,

_action : new Array(length),

_stack : new Array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19),

_interval : Array(length),

_timeout: new Array(length),

//for(var i=0;iset:function(action_function,speed,time_out)

{

time_out = time_out?time_out:15000;//默认的interval超时为15000秒,如果不需要设置超时,那么将下面的setTimeout 那移行注释掉;

var p = Interval._stack.pop();

if(p)

{

Interval._action[p] = action_function;

Interval._interval[p]=setInterval('if(Interval._action['+p+'])Interval._action['+p+']();',speed);//这里的重复执行函数不能写成'Interval._action['+p+']'因为很可能Interval.clear以后,还有一次没有执行完毕,于是就产生了一次错误

Interval._timeout[p] = setTimeout('Interval.clear('+p+')',time_out);//这行设置interval超时,如果不需要可注释掉;

return p;

}

},

clear:function(p)

{

if (Interval._action[p])

{

clearInterval(Interval._interval[p]);

clearTimeout(Interval._timeout[p]);//这行清除interval超时,如果没有设置超时可注释掉;

Interval._action[p] = "";

Interval._stack.push(p);

}

}

}

//Interval 处理结束

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值