下拉菜单隐藏菜单

Drop down menu hiding menus

本文关键字:隐藏菜单 下拉菜单      更新时间:2023-09-26

我正在为一个项目构建一个下拉菜单,但我没有让它完全正常工作。我希望它能显示子菜单,当我悬停在根级菜单,然后关闭一个短暂的延迟后,当菜单或子菜单不再悬停。大部分都是有效的;当根级项目悬停时,子菜单显示,当我停止悬停根级项目时,子菜单隐藏。问题是,当我将光标从根级项移动到子菜单项而不是第一个并将其悬停时,子菜单也会隐藏。这显然是不好的,所以希望得到帮助。

我用代码创建了一个JSFiddle,它可以更清楚地显示问题。

下面是我的代码:

menu.htm

<div id=m_wrapper>
    <ul id=menu>
        <li onMouseOver="show_sub_menu('0')" onMouseOut="start_timer()">Item 1
            <div id=s0 onMouseOver="show_sub_menu('0')" onMouseOut="start_timer()">
                <a href=#>Item 1.1</a>
                <a href=#>Item 1.2</a>
                <a href=#>Item 1.3</a>
            </div>
        </li>
    </ul>
</div>

menu.css

#m_wrapper {
    position:relative;
    display:table;
}
#menu {
    position:relative;
}
#menu li {
    width:100px;
    position:relative;
    float:left;
    list-style-type:none;
}
#menu div {
    position:absolute;
    visibility:hidden;
    display:inherit;
    width:100%;
    z-index:30
}
#menu div a {
    position:relative;
    display:block;
    z-index:35;
}

menu.js

var countdown = 300;
var timer = null;
var menu_item = null;
window.show_sub_menu = function(cath) {
    if (menu_item) {
        menu_item.style.visibility = 'hidden'; //Make sure to show one menu at a time
    }
    menu_item = window.document.getElementById("s" + cath);
    menu_item.style.visibility = 'visible'; //Show menu
    if (timer) {
        window.clearTimeout(timer); //Reset timer, so menu is kept open
        timer = null;
    }
};
window.start_timer = function() {
    timer = window.setTimeout(close_sub_menu, countdown);
};
window.close_sub_menu = function() {
    menu_item.style.visibility = 'hidden';
};

你不必把它弄得那么复杂。

当然你也可以用javascript做同样的事情,但是看看用jQuery是多么容易,可读和简单。

查看这个DEMO

只需使用下面的脚本

$('#menu li').hover(
    function(){
            $(this).stop().animate({height: '100px'},1000,function(){});
            $(this).find('div').show(600);
        }//gets called upon mousehover
    ,
    function(){
            $(this).stop().animate({height: '20px'},1000,function(){});
        } //gets called upon mouseout
  ); //hover ends

还有,我不知道你为什么写了这么多CSS。就用这些:

#menu
{
    list-style:none;
}
#menu li
{
    width:100px;
    border:1px Solid #CCC;
    text-align:Center;
    cursor:pointer;
    height:20px;
    overflow:hidden;
}
#menu li div
{
    border:1px Solid #CCC;
}
#s0 
{
    height:auto;
}
#s0 a
{
    display:block;
}

你可以通过它做很多事情,比如选择下拉项目。通过箭头键进行选择。

首先,你应该避免在<li>标签中使用<div>,因为这不是语义。

相当好是多层菜单构建只有html和css样式。

 <div id=m_wrapper>
     <ul id=menu>
            <li>Item 1
                <ul>
                    <li><a href=#>Item 1.1</a></li>
                    <li><a href=#>Item 1.2</a></li>
                    <li><a href=#>Item 1.3</a></li>
                </ul>
            </li>
            <li>Item 2</li>
     </ul>
 </div>

CSS样式

#m_wrapper, #menu, #menu li  {
    position:relative; 
}
#m_wrapper {
    display:table; 
}
#menu li {
    float:left;
    width:100px;
    list-style-type:none;
}
#menu li ul {
    display: none;
}
#menu li:hover ul {
    display: block;
    margin: 0 10px;
    padding: 0;
}

这可以很容易地通过HTML和CSS单独实现。使用CSS过渡,我们可以使菜单淡出,当我们悬停。

我还把这个放在了JsFiddle

<nav>
    <ul id="menu">
        <li>
            <a href="#">Home</a>
            <ul>
            <li>Item1</li>
            <li>Item2</li>
            <li>Item3</li>                                
            </ul>
        </li>
        <li><a href="#">About</a></li>
        <li><a href="#">Contact</a></li>
    </ul>
</nav>
CSS

#menu li
{
    position: relative;  
    display: inline;
    list-style: none;
    padding-left: 15px;  
}
#menu ul
{
    margin: 0;
    padding: 0;
    list-style: none;    
    opacity: 0;
    position: absolute;
    top: 20px;
    left: 5px;
    // Transitions for our fade effect.
    -webkit-transition: opacity 2s ease-in-out; 
    -moz-transition: opacity 2s ease-in-out;
    -ms-transition: opacity 2s ease-in-out;
    -o-transition: opacity 2s ease-in-out;
    transition: opacity 2s ease-in-out;   
}
#menu ul li
{
    display: block;    
}
#menu li:hover > ul
{
    opacity: 1;    
    // This stops the transition from happening on hover.
    -webkit-transition: none; 
    -moz-transition: none;
    -ms-transition: none;
    -o-transition: none;
    transition: none;
}

纯CSS下拉菜单

http://jsfiddle.net/steelywing/GANeX/8/

.nav {
    background-color: #def;
    height: 20px;
}
.nav * {
    transition: all 0.4s ease 0s;
    -moz-transition: all 0.4s ease 0s;
    -webkit-transition: all 0.4s ease 0s;
    -o-transition: all 0.4s ease 0s;
}
li {
    display: inline-block;
    height: 20px;
}
.dropdown li {
    display: block;
}
.dropdown ul {
    visibility: hidden;
    opacity: 0;
    margin-top: -2px;
}
.dropdown:hover ul {
    visibility: visible;
    opacity: 1;
}

记住…如果你决定实现渐隐版本,你应该使用跨浏览器的不透明度,像这样:

 -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";
 filter: alpha(opacity=100);
 -moz-opacity: 1;
 -khtml-opacity: 1;
 opacity: 1;