<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Oo緣來(lái)是你oO


    posts - 120,comments - 125,trackbacks - 0

    CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版

    馬嘉楠   2008-12-08

     

    在上一篇《CSS+JavaScript 實(shí)現(xiàn)菜單功能》通過一個(gè)HTML頁(yè)面簡(jiǎn)單的實(shí)現(xiàn)了菜單功能。但是實(shí)際開發(fā)當(dāng)中,如果菜單欄有很多項(xiàng),頻繁的修改HTML,會(huì)很繁瑣,也容易出錯(cuò)。

    改進(jìn)版本優(yōu)化了這個(gè)問題,通過簡(jiǎn)單的Javascript代碼就可以增加菜單。同時(shí)使得HTML頁(yè)面非常簡(jiǎn)潔,只需要寫2行代碼即可!O(∩_∩)O

    1.使用前提,在HTML頁(yè)面中引入一個(gè)CSS文件,和一個(gè)JavaScript文件。如下:

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
    <HTML> 
        
    <HEAD> 
            
    <TITLE>Menu</TITLE> 
            
    <link type="text/css" rel="stylesheet" href="menu.css">   
        
    </HEAD> 
        
    <BODY> 
            
    <div><script src="menu.js"></script></div> 
        
    </BODY> 
    </HTML>


    引入CSS文件:<link type="text/css" rel="stylesheet" href="menu.css">  ,menu.css代碼見后

    引入JavaScript文件:<script src="menu.js"></script>

     

    2.定義菜單代碼如下:

    if (document.getElementById)
        
    var root = new Root();   
         
        
    var m1 = new Menu("File","alert(this.innerText);"); 
        root.add(m1); 
        
    var m11 = new MenuItem("New"); 
        m1.add(m11); 
        m1.add(
    new MenuItem("Open","alert('open file');")); 
        
    var m12 = new MenuItem("Save"); 
        m1.add(m12); 
        m1.add(
    new MenuItem("Save As")); 
        m1.add(
    new MenuItem("Close")); 
        m1.add(
    new MenuItem("")); 
         
        
    var m2 = new Menu("Edit"); 
        root.add(m2); 
         
        root.toString();     
    }

     

    說(shuō)明:

    1) var root = new Root();      

            root.toString();  

            固定格式

    2)聲明菜單:

            var m1 = new Menu("File","alert(this.innerText);");

            菜單顯示的名稱為“File”,onclick事件為alert(this.innerText);

            root.add(m1);

            第一級(jí)菜單(即頁(yè)面初始顯示的菜單)放到root之下,通過add()方法

            var m11 = new MenuItem("New"");

            m1.add(m11);

            聲明“File”的子菜單“New”

            m1.add(new MenuItem("Open","alert('open file');"));

            聲明“File”的子菜單“Open”

    通過上面的代碼即可完成菜單的添加功能。

     

     

    代碼文件:

    <1> menu.cs

    #menubar {  
        font-family
    :verdana;  
        font-size
    :12px;               
        margin
    :1px;  
    }
      
    #menubar li 
    {  
        float
    :left;  
        position
    :relative;                
        text-align
    :left;  
    }
             
    /* each menu item style */  
    #menubar li a 
    {  
        border-style
    :none;  
        color
    :black;  
        display
    :block;                            
        width
    :150px;  
        height
    :20px;  
        line-height
    :20px;  
        padding-left
    :10px;  
        text-decoration
    :none;     
    }
      
    /* the first level menu which displays default */  
    #menubar .menuMain
    {  
        border-color
    :#C0C0C0;  
        border-width
    :1px;  
        border-style
    :solid;  
    }
      
    /* the first leve style when mouse on it */  
    #menubar li a:hover
    {  
        background-color
    :#efefef;   
        text-decoration
    :underline;  
    }
      
    /* the second level menu block style */  
    #menubar li ul
    {  
        background-color
    :#efefef;  
        border-style
    :none;  
        display
    :none;  
        position
    :absolute;  
        top
    :20px;  
        left
    :-40px;  
        margin-top
    :2px;  
        width
    :150px;              
    }
      
    /* the sub menu item style when mouse on it */  
    #menubar li ul li a:hover 
    {  
        text-decoration
    :underline;   
        padding-left
    :20px;   
    }
      
    /* the third or more level menu block style */  
    #menubar li ul li ul 
    {  
        display
    :none;  
        position
    :absolute;  
        top
    :0px;  
        left
    :150px;   
        margin-top
    :0;  
        margin-left
    :0;  
        width
    :150px;  
    }
      


    <2>menu.js

    var MenuConfig = 
        defaultText : 
    "Menu Item"
        defaultAction : 
    "javascript:void(0);"   , 
        defaultMenuCssStyle : 
    "menuMain" 
    }


    var MenuHandler = 
        idCounter : 
    0
        idPrefix : 
    "menu-"
        getId : 
    function()return this.idPrefix + this.idCounter++ ;}
        insertHTMLBeforeEnd : 
    function(node, sHTML)
            
    if(node.insertAdjacentHTML != null)
                node.insertAdjacentHTML('BeforeEnd',sHTML); 
                
    return
            }
     
            
    var df; // DocumentFragment 
            var r = node.ownerDocument.createRange(); 
            r.selectNodeContents(node); 
            r.collapse(
    false); 
            df 
    = r.createContextualFragment(sHTML); 
            node.appendChild(df); 
        }
     
    }
     

    function displaySubMenu(li){  
        
    var subMenu = li.getElementsByTagName('ul')[0];  
        
    if(subMenu) 
            subMenu.style.display 
    = 'block';  
    }
      

    function hideSubMenu(li){  
        
    var subMenu = li.getElementsByTagName('ul')[0];    
        
    if(subMenu) 
            subMenu.style.display 
    = 'none';  
    }
       


    /****************************************** 
     * Funciont Name:   MenuAbstractNode 
     * Description: MenuAbstractNode class 
     * @param {String} pText  
     * @param {String} pAction  
     * @Return: 
     ******************************************
    */
      
    function MenuAbstractNode(pText, pAction)
        
    this.text = pText || MenuConfig.defaultText;     
        
    this.action = pAction || MenuConfig.defaultAction; 
        
    this.id = MenuHandler.getId(); 
         
        
    this.childNodes = []; 
    }
     

    MenuAbstractNode.prototype.add 
    = function(node)
        
    this.childNodes[this.childNodes.length] = node; 
    }
     

    /****************************************** 
     * Funciont Name:   toString 
     * Description: generate HTML code 
     * @param   
     * @param  
     * @Return: 
     ******************************************
    */
     
    MenuAbstractNode.prototype.toString 
    = function(){    
        
    var str = "<li id=\"" + this.id + "\" onmouseover=\"displaySubMenu(this)\" onmouseout=\"hideSubMenu(this)\"><a href=\"#\""

        
    if(this.type=="Menu")
            str 
    = str + " class=\"" + this.cssStyle + "\""
        }
     
        str 
    = str + " onclick=\""+this.action+"\">"+this.text+"</a>"
         
        
    var sb = []; 

        
    for (var i = 0; i < this.childNodes.length; i++
            sb[i] 
    = this.childNodes[i].toString(); 
        }
     
        
    if(sb.length>0)
            str 
    = str + "<ul>" + sb.join(""+ "</ul>" 
        }
     

        
    return str + "</li>" ; 
    }
     

    /****************************************** 
     * Funciont Name:   Menu 
     * Description: Menu class 
     * @param {String} pText  
     * @param {String} pAction  
     * @param {String} pCssStyle  
     * @Return: 
     ******************************************
    */
      
    function Menu(pText, pAction,pCssStyle)
        
    this.base = MenuAbstractNode; 
        
    this.base(pText,pAction); 
         
        
    this.type = "Menu"
        
    this.cssStyle = pCssStyle || MenuConfig.defaultMenuCssStyle; 
    }
     

    Menu.prototype 
    = new MenuAbstractNode; 

    /****************************************** 
     * Funciont Name:   MenuItem 
     * Description: MenuItem class 
     * @param {String} pText  
     * @param {String} pAction  
     * @Return: 
     ******************************************
    */
     
    function MenuItem(pText, pAction)
        
    this.base = MenuAbstractNode; 
        
    this.base(pText,pAction); 
        
    this.type = "MenuItem"
    }
     

    MenuItem.prototype 
    = new MenuAbstractNode; 


    /****************************************** 
     * Funciont Name:   Root 
     * Description: Root class 
     * @Return: 
     ******************************************
    */
     
    function Root()
        
    this.id = "menubar"
        
    this.childNodes=[];  
    }
     

    Root.prototype 
    = new MenuAbstractNode; 

    Root.prototype.toString 
    = function()
        document.write(
    "<div id='menu'><ul id=\""+root.id+"\"> </ul> </div>"); 
        
    for(var i=0; i<this.childNodes.length; i++)
            MenuHandler.insertHTMLBeforeEnd(document.getElementById(root.id), 
    this.childNodes[i].toString()); 
        }
     
    }
     

    if (document.getElementById)
        
    var root = new Root();   
         
        
    var m1 = new Menu("File","alert(this.innerText);"); 
        root.add(m1); 
        
    var m11 = new MenuItem("New","alert(this.innerText);"); 
        m1.add(m11); 
        m1.add(
    new MenuItem("Open","alert('open file');")); 
        
    var m12 = new MenuItem("Save"); 
        m1.add(m12); 
        m1.add(
    new MenuItem("Save As")); 
        m1.add(
    new MenuItem("Close")); 
        m1.add(
    new MenuItem("")); 
         
        
    var m2 = new Menu("Edit"); 
        root.add(m2); 
        
    var m22 = new MenuItem("Select All"); 
        m2.add(m22); 
        m2.add(
    new MenuItem("Cut")); 
        m2.add(
    new MenuItem("Copy")); 
        m2.add(
    new MenuItem("paste")); 
         
        
    var m3 = new Menu("View"); 
        
    var m33 = new MenuItem("View List"); 
        m33.add(
    new MenuItem("Function List")); 
        m3.add(m33); 
        m3.add(
    new MenuItem("Tool Bar")); 
        root.add(m3); 
        root.toString();     
    }
     

     

     



    馬嘉楠
    jianan.ma@gmail.com

    posted on 2008-12-12 20:10 馬嘉楠 閱讀(2434) 評(píng)論(4)  編輯  收藏 所屬分類: SoureCodeJava Script

    FeedBack:
    # re: CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版
    2008-12-12 21:05 | 小人物
    頂了。。。寫的很好。。  回復(fù)  更多評(píng)論
      
    # re: 【原創(chuàng)】CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版[未登錄]
    2008-12-13 11:23 | zxbyh
    為什么不用jquery和pototyle  回復(fù)  更多評(píng)論
      
    # re: 【原創(chuàng)】CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版
    2008-12-13 17:23 | 44you
    這個(gè)是美工的實(shí)現(xiàn),如果你用的框架中,不能用jquery,pototyle,諸如此情況,還是要自己寫,而已,樓主寫得很清晰,就當(dāng)做源碼來(lái)看吧~  回復(fù)  更多評(píng)論
      
    # re: 【原創(chuàng)】CSS+JavaScript 實(shí)現(xiàn)菜單功能--改進(jìn)版[未登錄]
    2008-12-15 11:00 | Windy
    好東西 ~  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 思思久久99热免费精品6| 亚洲制服中文字幕第一区| 国产又大又长又粗又硬的免费视频| ww在线观视频免费观看| 在线看片免费人成视久网| 无码少妇精品一区二区免费动态| 国产午夜无码精品免费看| 久久免费公开视频| 99热精品在线免费观看| 999任你躁在线精品免费不卡| 99re免费在线视频| 0588影视手机免费看片| 成年男女男精品免费视频网站| 女人被男人桶得好爽免费视频 | 特级做a爰片毛片免费看| 特级毛片A级毛片免费播放| 成人国产网站v片免费观看| www永久免费视频| 免费无码又爽又刺激高潮软件| 免费国产成人α片| 18禁成人网站免费观看| 国产免费丝袜调教视频| 毛片免费vip会员在线看| 国产做床爱无遮挡免费视频| 亚洲日韩VA无码中文字幕| 亚洲无码视频在线| 亚洲av中文无码乱人伦在线播放 | 国产亚洲综合一区柠檬导航| 亚洲成av人片天堂网| 亚洲成年人电影网站| 亚洲精品无码专区在线播放| 爱情岛论坛免费视频| 日韩视频在线观看免费| 国产精品成人免费一区二区 | 青青在线久青草免费观看| 免费理论片51人人看电影| 亚洲国产一级在线观看| 亚洲AV无码专区亚洲AV伊甸园| 亚洲中文无码线在线观看| 亚洲AV无码一区二区三区久久精品 | 成人免费视频试看120秒|