国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

XP折疊菜單&仿QQ2006菜單

2019-11-21 02:25:50
字體:
來源:轉載
供稿:網友
特性:

更好的外觀:在菜單標題上添加了圖標。
更好的動作:實現了菜單的滑入,滑出效果。
更易的使用:添加了許多注釋,方便使用。

當然還存在一些沒有發現的問題。盼望大家指教:)
實現折疊式動態改變style.height的值 這樣不是很專業:) 不過很像了!

100%的原裝winXP折疊菜單的外觀!如果不一樣您提出來我改。
(qq2006 在點擊的時候還有一些抖動。)

先看圖最新添加了 qq2006 的外觀

測試網頁的地址:navbar.htm
詳細網址:http://lxbzj.com/showartical.asp?N_id=156
下載:http://lxbzj.com/upload/200604/menu.zip
新版本還在制作中。。。(更新的js在19層)
這里是2006-04-13日修改過的js
-不再需要在每一個<a>里面添加 onclick 和 onkeypress 了 這樣 網頁和js 進一步的分離
-定義了一個menu類 負責將事件添加到每一個 菜單里面
-修改了onkeypress
-添加interval處理
-添加了一個收起的加速度(不過不是很明顯)
-添加了Navbar對象,實現在一組menu中只有一個能打開
-新js 不斷更新中。。。

+-navbar.js中的代碼:
復制代碼 代碼如下:

// 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._div = 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<this.body.childNodes.length;i++)
        {
            if (this.body.childNodes[i].nodeType==1)
            {
                this._div=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._div.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<this.menu_item.length;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.length;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;i<_action.length;i++)stack.push(i);,
    set: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 處理結束

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 咸阳市| 吉安县| 弥渡县| 南和县| 昌邑市| 屏边| 嵊州市| 垣曲县| 松江区| 湘潭县| 东阳市| 桃园市| 石狮市| 兴化市| 呈贡县| 安阳县| 邢台市| 淮安市| 巴南区| 东至县| 马关县| 海伦市| 瓦房店市| 普兰店市| 临西县| 莱阳市| 徐水县| 江川县| 东山县| 杂多县| 延吉市| 大关县| 五家渠市| 汉川市| 卓尼县| 开远市| 中西区| 绥棱县| 睢宁县| 关岭| 乌海市|