【问题标题】:How to add a hiding delay to Full CSS Dropdown Vertical Menu如何为完整的 CSS 下拉垂直菜单添加隐藏延迟
【发布时间】:2011-06-10 21:24:54
【问题描述】:

我的 CSS 垂直菜单有这个脚本:

//Nested Side Bar Menu (Mar 20th, 09)
//By Dynamic Drive: http://www.dynamicdrive.com/style/

var menuids=["sidebarmenu1"] //Enter id(s) of each Side Bar Menu's main UL, separated by commas

function initsidebarmenu(){
for (var i=0; i<menuids.length; i++){
  var ultags=document.getElementById(menuids[i]).getElementsByTagName("ul")
    for (var t=0; t<ultags.length; t++){
    ultags[t].parentNode.getElementsByTagName("a")[0].className+=" subfolderstyle"
  if (ultags[t].parentNode.parentNode.id==menuids[i]) //if this is a first level submenu
   ultags[t].style.left=ultags[t].parentNode.offsetWidth+"px" //dynamically position first level submenus to be width of main menu item
  else //else if this is a sub level submenu (ul)
    ultags[t].style.left=ultags[t-1].getElementsByTagName("a")[0].offsetWidth+"px" //position menu to the right of menu item that activated it
    ultags[t].parentNode.onmouseover=function(){
    this.getElementsByTagName("ul")[0].style.display="block"
    }
    ultags[t].parentNode.onmouseout=function(){
    this.getElementsByTagName("ul")[0].style.display="none"
    }
    }
  for (var t=ultags.length-1; t>-1; t--){ //loop through all sub menus again, and use "display:none" to hide menus (to prevent possible page scrollbars
  ultags[t].style.visibility="visible"
  ultags[t].style.display="none"
  }
  }
}

if (window.addEventListener)
window.addEventListener("load", initsidebarmenu, false)
else if (window.attachEvent)
window.attachEvent("onload", initsidebarmenu)

我在哪里可以使用 timeout() 来延迟菜单立即隐藏?

【问题讨论】:

    标签: javascript css delay settimeout drop-down-menu


    【解决方案1】:

    脚本:

    //Nested Side Bar Menu (Mar 20th, 09)
    //By Dynamic Drive: http://www.dynamicdrive.com/style/
    
    var menuids=["sidebarmenu1"] //Enter id(s) of each Side Bar Menu's main UL, separated by commas
    var defaultDelay = 0; //ms
    
    function initsidebarmenu(){
        for (var i=0; i<menuids.length; i++){
            var ultags=document.getElementById(menuids[i]).getElementsByTagName("ul");
            for (var t=0; t<ultags.length; t++){
                ultags[t].parentNode.getElementsByTagName("a")[0].className+=" subfolderstyle";
                if (ultags[t].parentNode.parentNode.id==menuids[i]){ //if this is a first level submenu
                    ultags[t].style.left=ultags[t].parentNode.offsetWidth+"px"; //dynamically position first level submenus to be width of main menu item
                } else{ //else if this is a sub level submenu (ul)
                    ultags[t].style.left=ultags[t-1].getElementsByTagName("a")[0].offsetWidth+"px"; //position menu to the right of menu item that activated it
                }
                ultags[t].parentNode.onmouseover=function(){
                    var elem = this.getElementsByTagName("ul")[0];
                    if (elem){
                        if (elem.timer){
                            clearTimeout(elem.timer);
                        }
                        elem.timer=0;
                        elem.style.display="block";
                    }
                }
                ultags[t].parentNode.onmouseout=function(){
                    var elem = this.getElementsByTagName("ul")[0];
                    if (elem){
                        var delay = defaultDelay;
                        if (elem.parentNode && elem.parentNode.parentNode && elem.parentNode.parentNode.className){
                            var match = /submenu-delay-([0-9]*)/i.exec(elem.parentNode.parentNode.className);
                            delay = (match && (match.length > 1)) ? match[1] : defaultDelay;
                        }
                        elem.timer=setTimeout(function(){
                            elem.style.display="none";
                        }, delay);
                    }
                };
            }
            for (var t=ultags.length-1; t>-1; t--){ //loop through all sub menus again, and use "display:none" to hide menus (to prevent possible page scrollbars
            ultags[t].style.visibility="visible"
            ultags[t].style.display="none"
            }
        }
    }
    
        if (window.addEventListener)
        window.addEventListener("load", initsidebarmenu, false)
        else if (window.attachEvent)
        window.attachEvent("onload", initsidebarmenu)
    

    HTML:

    <div class="sidebarmenu">
    <ul id="sidebarmenu1" class='submenu-delay-1000'>
    <li><a href="#">Item 1</a></li>
    <li><a href="#">Item 2</a></li>
    <li><a href="#">Folder 1</a>
      <ul>
      <li><a href="#">Sub Item 1.1</a></li>
      <li><a href="#">Sub Item 1.2</a></li>
      </ul>
    </li>
    <li><a href="#">Item 3</a></li>
    
    <li><a href="#">Folder 2</a>
      <ul>
      <li><a href="#">Sub Item 2.1</a></li>
      <li><a href="#">Folder 2.1</a>
        <ul>
        <li><a href="#">Folder 2.1.1</a>
            <ul class='submenu-delay-5000'>
            <li><a href="#">Sub Item 2.1.1.1</a></li>
            <li><a href="#">Sub Item 2.1.1.2</a></li>
            <li><a href="#">Folder 2.1.1.3</a>]
                <ul >
                <li><a href="#">Sub Item 2.1.1.3.1</a></li>
                <li><a href="#">Sub Item 2.1.1.3.2</a></li>
                </ul>
            </li>
            </ul>
        </li>
        <li><a href="#">Sub Item 2.1.2</a></li>
        <li><a href="#">Sub Item 2.1.3</a></li>
        <li><a href="#">Sub Item 2.1.4</a></li>
        </ul>
      </li>
    </ul>
    </li>
    <li><a href="#">Item 4</a></li>
    </ul>
    </div>
    

    【讨论】:

    • 感谢您的回答,但这段代码使菜单始终保持打开状态,在关闭之前不会延迟。如果我将鼠标移出菜单,它不会关闭。你还有其他建议吗?非常感谢您的支持。
    • 无法重现您描述的效果,将代码更改为“更安全”。我在 Windows 7 上使用 Firefox 3.6.17、Chrome 13.0.782.14 和 IE 9.0.8112.16421(Quirks 模式、IE7、IE8、IE9)进行了测试。您在哪个浏览器中测试?顺便说一句,改变了一些编码风格(对不起)。
    • 我使用 Firefox 4.01、Chrome 12.0.742.91、IE8、IE9 和 Safari 5.0.5。我尝试了您发送的新代码,它可以工作,唯一的问题是当您移动到第三级菜单时,它会重叠几秒钟,而第一个打开的菜单会隐藏。是否可以仅控制二级菜单的隐藏?而第三层只是立即隐藏?或者别的什么,我只是在想。但无论如何,非常感谢您对这个人的帮助。
    • 你是个天才!非常感谢 Prusse,脚本运行良好。并且能够单独控制每个级别的隐藏时间非常好。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 2012-01-15
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2012-04-20
    相关资源
    最近更新 更多