鼠标移出时子导航下拉菜单停用

Posted

技术标签:

【中文标题】鼠标移出时子导航下拉菜单停用【英文标题】:Sub-Navigation Dropdown deactivates on mouse-out 【发布时间】:2014-09-19 02:11:47 【问题描述】:

我有一个菜单和一个子菜单。子菜单需要在鼠标悬停时显示,但需要显示在彩色区域下方。当我将鼠标移出第 3 项时,子菜单消失。

我明白它为什么会消失,我想知道是否有办法让它发挥作用。 Margin 和 Padding 似乎在 ul li css 上不起作用。

http://jsfiddle.net/G4dss/

<div id="bg">
    <ul class="menu">
      <li class="first leaf">Item 1</li>
      <li class="leaf">Item 2</li>
      <li class="expanded">Item 3
        <ul class="menu">
          <li class="leaf">Sub-item 1</li>
          <li class="leaf">Sub-item 2</li>
          <li class="leaf">Sub-item 3</li>
        </ul>
      </li>
      <li class="leaf last">Last item</li>
    </ul>
</div>

CSS

#bg 
    background-color: yellow;
    width: 400px;
    height: 50px;


ul 
  float: left;
  margin: 0;
  padding: 0;

ul li 
  position: relative;
  float: left;
  list-style: none;
  list-style-image: none;
  padding: .5em 1em;
  margin: 0;
  cursor: pointer;

ul li ul 
  display: none;
  position: absolute;
  width: 120px;
  left: 0;
  top: 50px;


ul li:hover ul 
  display: block;

【问题讨论】:

在您认输之前,请注意您所描述的内容仅使用 CSS 即可实现。以防我的答案低于当前投票最高的答案,我要求您最后一次查看我的解决方案。如果仍然不能满足您的要求,我很乐意提供帮助。 【参考方案1】:

发生这种情况是因为您将下拉菜单放置得太低了,您可以通过使用padding-top 并降低top 来达到相同的效果,这里是working example

ul li ul 
  top: 20px;
  padding-top: 30px;

如果您不熟悉 chrome dev tools,当您遇到问题时,有时在元素上添加边框会有所帮助 like this

【讨论】:

好的,我添加了 som bg 颜色... PSD 设计出现了子菜单出现在绿色 BG 上方,添加 padding-top 会产生太多的负蓝色空间...但是任何其他方式导致子菜单停用:jsfiddle.net/G4dss/8 如果没有 javascript,您想要做的事情非常困难。但如果您可以摆脱纯色,请尝试使用边框代替jsfiddle.net/icodeforlove/G4dss/9 那个边框可以透明吗?如,完全透明? 哦,我同意,这很难做到……只需要验证一下,我就可以告诉客户了 :) @ClaytonDaniels 没问题,我建议使用伪元素,因为你可以让它透明。【参考方案2】:

这是因为第 3 项与包含子菜单项的 &lt;ul&gt; 之间存在间隙。您为子菜单指定的top 值太大,导致它显得太低并造成此差距。当光标进入此间隙时,菜单消失,因为不再应用 :hover 样式。

解决此问题的一种方法是对top 使用百分比值,这样就无需猜测需要为其指定多少像素:

ul li ul 
    top: 100%;

这里有一个JSFiddle 来演示。希望这可以帮助!如果您有任何问题,请告诉我。

编辑: 上面的 CSS 使子菜单 &lt;ul&gt; 直接出现在父菜单项底部的下方。但是,您不能指定大于 100% 的值,否则会出现同样的问题,并且子菜单会显得太低(返回差距)。

解决此需求的一种方法是实际增加父菜单项的高度。在您的情况下,只需使其与黄色背景一样高,子菜单就会出现在绿色背景中。因此,使用此 CSS 应该适用于您的情况:

#bg > .menu > li
    height: 70px; /* Same height as yellow #bg element */
    box-sizing:border-box;
    -moz-box-sizing:border-box;
    -webkit-box-sizing:border-box;

这只会导致主菜单项的高度增加(这样所有子菜单项也不会因高度增加而间隔过大)。 box-sizing 属性是为了确保&lt;li&gt; 元素上的现有填充也被计入高度,因此子菜单不会显得过低。这是一个new JSFiddle 来演示。希望这对您有所帮助!

【讨论】:

好的,如果设计师发送 PSD 并希望子导航从黄色背景后面弹出(到绿色背景上)怎么办?百分比在这里似乎不起作用,当我鼠标移出时子菜单不断消失...jsfiddle.net/G4dss/7 如果您指定的百分比超过 100%,则会出现同样的问题 - 因为子菜单 &lt;ul&gt; 将再次出现在菜单项结束的下方,从而产生间隙。我会针对您提出的新问题修改我的问题。【参考方案3】:

发生这种情况是因为您使用了top: 50px。改为:

ul li ul 
  display: none;
  position: absolute;
  width: 120px;
  left: 0;
  /*top: 50px; remove this*/
  padding-top:10px; /*Add this*/

fiddle

【讨论】:

以上是关于鼠标移出时子导航下拉菜单停用的主要内容,如果未能解决你的问题,请参考以下文章

利用JavaScript+DIV+CSS实现下拉菜单。当鼠标移动到菜单选项的时候显示对应的DIV:function show(menu)。当鼠标移出的时候隐藏所有的DIV:function hide(

仿新浪下拉菜单

悬停在下拉菜单上时保持主导航项悬停 CSS

用div+css做下拉菜单,当鼠标移向2级菜单时,为啥1级菜单的a:hover背景色就不管用了?

20款jquery下拉导航菜单特效代码分享

Wordpress 导航菜单悬停状态和下拉菜单工作,但菜单不可点击