如何确定实际上正在悬停的元素

时间:2012-12-21 01:52:31

标签: javascript jquery drop-down-menu menu menubar

我不太了解很多JS。虽然我已经做了自己的搜索,但我找不到答案。所以我在这里问,希望你能帮助我。

我正在尝试创建一个基于div标签的导航菜单(如http://www.adobe.com/),并使用jQuery为“悬停时出现/消失”创建一个函数。

简单Div结构:

<div id='menu'>
    <div> Level 1 a
            <div> Level 2 a </div> 
            <div> Level 2 b </div> 
    </div>
    <div> Level 1 b
            <div> Level 2 c </div> 
            <div> Level 2 d </div> 
    </div>
</div>

我了解它需要使用$('#menu').hover()函数。我的问题是,如果只使用一个id“菜单”,我可以用什么样的功能来确定哪个实际的菜单列表正在徘徊?

像:

$("#menu").hover(                        // Div Menu is being hovered
    function () {
        // $el = Determine which menu inside of Div Menu is actually being hovered
        // $el.show();
    },
    function () {
        $el..hide();
    }
);

或许我的结构完全错误,应该用另一种方法来做到这一点?请帮忙。

4 个答案:

答案 0 :(得分:3)

$("#menu").hover(                        // Div Menu is being hovered
    function (event) {
        $el = $(event.target);
        $el.show();
    },
    function (event) {
        $el = $(event.target);
        $el.hide();
    }
);

答案 1 :(得分:1)

实际上,没有hover事件。在两个不同的模型中有many different mouse events,它们在从内部元素触发时是不同的。幸运的是,jQuery的hover方法(实际上是mouseentermouseleave)对此进行了抽象,并且仅在父元素悬停时触发处理程序。

这意味着您必须将处理程序绑定到菜单树中的每个元素:

$("#menu div").hover(
    function (event) {
        console.log(event);
        $(this).children().show();
    },
    function (event) {
        $(this).children().hide();
    }
);

Demo at jsfiddle.net

答案 2 :(得分:1)

是的,您可以使用您编写的代码来确定何时悬停div。然后触发显示下拉菜单的功能。当您定义导航栏的CSS时,您应该设置在开头不必显示的部分来显示:hidden;在div中,所以它是隐藏的。然后通过jquery将代码注入到css中以更改属性显示。我举个例子。假设你创建了一个名为“hidden”的div,并在css和其他可能的样式中设置它:     #hidden {     显示:隐藏     }

然后,当您悬停鼠标时,您希望显示ID为“hidden”的部分。 您可以使用:

$("#hidden").hover.css('display', 'block')

所以隐藏的部分会出现。 无论如何,即使只使用css而不使用jquery,你也可以创建一个下拉菜单。 我在这里举个例子: 假设你在html文件中有这个标记

<ul id="nav">
<li>
    <a href="#">Home</a>
</li>

<li>
    <a href="#">About</a>
    <ul>
        <li><a href="#">The product</a></li>

        <li><a href="#">Meet the team</a></li>
    </ul>
</li>
<li>
    <a href="#">Services</a>

    <ul>
        <li><a href="#">Sevice one</a></li>
        <li><a href="#">Sevice two</a></li>

        <li><a href="#">Sevice three</a></li>
        <li><a href="#">Sevice four</a></li>
    </ul>

</li>
<li>
    <a href="#">Product</a>
    <ul>
        <li><a href="#">Small product (one)</a></li>

        <li><a href="#">Small product (two)</a></li>
        <li><a href="#">Small product (three)</a></li>
        <li><a href="#">Small product (four)</a></li>

        <li><a href="#">Big product (five)</a></li>
        <li><a href="#">Big product (six)</a></li>
        <li><a href="#">Big product (seven)</a></li>

        <li><a href="#">Big product (eight)</a></li>
        <li><a href="#">Enourmous product (nine)</a></li>
        <li><a href="#">Enourmous product (ten)</a></li>

        <li><a href="#">Enourmous product (eleven)</a></li>
    </ul>
</li>
<li>
    <a href="#">Contact</a>

    <ul>
        <li><a href="#">Out-of-hours</a></li>
        <li><a href="#">Directions</a></li>

    </ul>
</li>
</ul>

正如你在这里看到的那样,标记只是一系列嵌套的“ul”。没有详细的ID /类,没有div,只有丰富的语义代码。

#nav ul包含一系列li,任何需要下拉列表然后包含另一个ul。请注意,下拉列表ul上没有类 - 这是因为我们使用级联来设置这些样式,使我们的标记更加清晰。

现在的CSS:

#nav{
list-style:none;
font-weight:bold;
margin-bottom:10px;
/* Clear floats */
float:left;
width:100%;
/* Bring the nav above everything else--uncomment if needed.
position:relative;
z-index:5;
*/
}
#nav li{
float:left;
margin-right:10px;
position:relative;
}
#nav a{
display:block;
padding:5px;
color:#fff;
background:#333;
text-decoration:none;
}
#nav a:hover{
color:#fff;
background:#6b0c36;
text-decoration:underline;
}

/*--- DROPDOWN ---*/
#nav ul{
background:#fff; /* Adding a background makes the dropdown work properly in IE7+.     Make this as close to your page's background as possible (i.e. white page == white background). */
background:rgba(255,255,255,0); /* But! Let's make the background fully transparent      where we can, we don't actually want to see it if we can help it... */
list-style:none;
position:absolute;
left:-9999px; /* Hide off-screen when not needed (this is more accessible than     display:none;) */
}
#nav ul li{
padding-top:1px; /* Introducing a padding between the li and the a give the   illusion spaced items */
float:none;
}
#nav ul a{
white-space:nowrap; /* Stop text wrapping and creating multi-line dropdown items */
}
#nav li:hover ul{ /* Display the dropdown on hover */
left:0; /* Bring back on-screen when needed */
}
#nav li:hover a{ /* These create persistent hover states, meaning the top-most link stays 'hovered' even when your cursor has moved down the list. */
background:#6b0c36;
text-decoration:underline;
}
#nav li:hover ul a{ /* The persistent hover state does however create a global style for links even before they're hovered. Here we undo these effects. */
text-decoration:none;
}
#nav li:hover ul li a:hover{ /* Here we define the most explicit hover states--what happens when you hover each individual link. */
background:#333;
}

因此,通过使用嵌套的无序列表和一些CSS,您可以创建一个有效的下拉菜单。根据我的说法,这是最好的解决方案。因为你可以更容易地做出更好的事情。

有关详细信息以及下拉菜单的完整说明和演示,请转到:http://csswizardry.com/2011/02/creating-a-pure-css-dropdown-menu/

当然,您可以根据需要设置颜色和样式。

答案 3 :(得分:1)

如果您想在亚马逊上选择这样的弹出式垂直菜单,请查看此示例。这很简单,只是html和css,没有jquery。它看起来很像。

HTML:

<ul class="nav">
<li>
    <a href="#">
        <strong>MP3s &amp; Cloud Player</strong> 18 million songs, play anywhere
    </a>
</li>
<li>
    <a href="#">
        <strong>MP3s &amp; Cloud Player</strong> 18 million songs, play anywhere
    </a>
    <ul>
        <li>
            <a href="#">
                <strong>Your Cloud Drive</strong> Anythign digital, securely stored, available anywhere
            </a>
        </li>
        <li>
            <a href="#">
                <strong>Learn more about cloud</strong>                </a>
        </li>
    </ul>
    <span class="cover"></span>
</li>
<li>
    <a href="#">
        <strong>Kindle</strong>
    </a>
</li>
</ul>​

CSS:

ul.nav{
font-size: 10px;
font-family: Verdana, Helvetica;
width: 200px;
background: #edf7ff;      
}

ul.nav li{
padding: 5px 4px;   
border: 1px solid #85abc9;
margin-bottom: -1px;
position: relative;
background: url(http://www.qualitymetric.com/Portals/0/images/orange_arrow.png) no-    repeat 185px center;
}

ul.nav > li:hover{
background: #fff;
border: 1px solid #999;
z-index:1;
box-shadow: 0px 1px 0px #999;
-moz-box-shadow: 0px 1px 0px #999;
}

ul.nav > li:hover > span{
width: 5px;
height: 100%;
background: #fff;
position: absolute;
top: 0px;
bottom: 0px;
right: 15px;
z-index: 10;
}

ul.nav li a{
color: #666;
text-decoration: none;
}

ul.nav li a strong{
font-size: 11px;
color: #333;
font-weight: bold;
display: block;
}

/* dropdown */

ul.nav li ul{
width: 200px;
padding-left: 12px;
background: #fff;
border: 1px solid #999;
position: absolute;
border-radius: 4px;
-moz-border-radius: 4px;
box-shadow: 1px 1px 0px #999;
-moz-box-shadow: 1px 1px 0px #999;
top: -1px;
left: 180px;
z-index: 9;
display: none;
}

ul.nav li:hover > ul{
display: block;           
}

ul.nav li ul li{
border: none;
padding-left: 12px;
background: url(http://www.qualitymetric.com/Portals/0/images/orange_arrow.png) no-    repeat 0px 6px;
}

ul.nav li ul li a strong{
font-weight: normal;
color: #034995;
}

在这里查看代码和演示:http://jsfiddle.net/blackpla9ue/KHLgm/8/ 您可以根据需要编辑和添加内容。