【问题标题】:HTML/CSS/JQUERY - Dropdown disappear when not hovering on menuHTML/CSS/JQUERY - 不悬停在菜单上时下拉菜单消失
【发布时间】:2015-07-09 00:04:49
【问题描述】:

我正在尝试创建一个下拉菜单,目前进展顺利。 我刚遇到1个问题。当我没有悬停在菜单标题上时,下拉菜单会消失,菜单上的悬停效果也会消失。 我的代码可能看起来很乱,而且有点复杂。我很抱歉。

JSFIDDLE:https://jsfiddle.net/eeLfkqjy/6/ HTML:

<div id="navBar">
        <div id="logo">

        </div>
        <div id="menu">
            <div id="menuTitle_Container">
                <a class="menuTitle" href="index.html">HOME</a>
                <a class="menuTitle" href="sneakers.html">MENU 1</a>
                <a class="menuTitle" href="clothing.html">MENU 2</a>
                <a class="menuTitle" href="acessories.html">MENU 3</a>
            </div>
        </div>
    </div>
        <div id="dropdownMenu">
            <div id="dropdownMenu_SubmenuContainer">
                <div class="submenu_Container">
                    <div class="submenu_menuContainer">
                        <p class="clotheCategory">TITLE</p>
                            <a class="submenuTitle">MENU 1</a>
                            <a class="submenuTitle">MENU 2</a>
                            <a class="submenuTitle">MENU 3</a>
                            <a class="submenuTitle">MENU 4</a>
                            <a class="submenuTitle">MENU 5</a>
                    </div>
                    <div class="submenu_menuContainer">
                        <p class="clotheCategory">TITLE</p>
                            <a class="submenuTitle">MENU 1</a>
                            <a class="submenuTitle">MENU 2</a>
                            <a class="submenuTitle">MENU 3</a>
                            <a class="submenuTitle">MENU 4</a>
                    </div>
                </div>                
                <div class="submenu_Container">
                    <div class="submenu_menuContainer">
                        <p class="clotheCategory">TITLE</p>
                            <a class="submenuTitle">MENU 1</a>
                            <a class="submenuTitle">MENU 2</a>
                            <a class="submenuTitle">MENU 3</a>
                    </div>
                    <div class="submenu_menuContainer">
                        <p class="clotheCategory">TITLE</p>
                            <a class="submenuTitle">MENU 1</a>
                            <a class="submenuTitle">MENU 2</a>
                            <a class="submenuTitle">MENU 3</a>
                            <a class="submenuTitle">MENU 4</a>
                            <a class="submenuTitle">MENU 5</a>
                    </div>
                </div>
            </div>
        </div>

CSS:

body {
 margin: 0; 
 background-color: green;
}
/* MENU */
#navBar {
    background-color: #464646;
    height: 65px;
    width: 100%; 
    display: -webkit-box;
}
#logo {
    width: 15%;
    margin-left: 2.5%;
    margin-right: 2.5%;
    height: 65px;
}
#menu {
    height: 65px;
    width: auto;
}
#menuTitle_Container{
    width: auto;
    display: -webkit-inline-box;
}
.menuTitle{
    font-family: 'Raleway', sans-serif;
    font-weight: 400;
    font-size: 17px;
    padding-right: 10px;
    padding-left: 10px;
    color: #fff;
    vertical-align: text-top;
    line-height: 65px;
    text-decoration: none;
    display: -webkit-block;
    display: block;
    transition: color 0.4s ease;
    transition: background-color 0.4s ease;
}
.menuTitle:nth-of-type(+n+2):hover {
    background-color: #fff;
    transition: background-color 0.4s ease, color 0.4s ease;
    color: #353535;
}

/* DROPDOWN MENU  ON HOVER */

#dropdownMenu {
    width: 750px;
    height: 250px;
    background-color: #fff;
    margin-left: 20%;
    display: none;
    opacity: 0;
}
#mensmenu {
    height: 100;   
}
.submenu_Container {
    width: 100%;
    margin: 0 auto;
    display: none;
}
.submenu_menuContainer {
    width: 50%;
    height: 190px;
    display: inline-block;
    margin-top: 30px;
    margin-left: 5%;
}
.submenu_menuContainer:nth-child(1) {
    border-right: 1px solid #B3B3B3;
}


.clotheCategory {
    font-family: 'open sans', sans-serif;
    font-size: 15px;
    color: #353535;
    font-weight: 600;
    margin-top: 10px;
    text-align: center;
}
.submenuTitle {
    font-family: 'open sans', sans-serif;
    font-size: 14px;
    font-weight: 400;
    color: #353535;
    margin-top: 10px;
    display: table;
}

查询:

$(document).ready(function() {
    $(".menuTitle:nth-child(2)").hover(function () {
        $("#dropdownMenu").show();
        $("#dropdownMenu").stop().animate({opacity:'1'}, 400);
        $(".submenu_Container:nth-child(1)").css("display","flex");
    }, function() {
        $("#dropdownMenu").hide();
        $("#dropdownMenu").stop().animate({opacity:'0'}, 400);
        $(".submenu_Container:nth-child(1)").css("display","none");
});    
    $(".menuTitle:nth-child(3)").hover(function () {
        $("#dropdownMenu").show();
        $("#dropdownMenu").stop().animate({opacity:'1'}, 400);
        $(".submenu_Container:nth-child(2)").css("display","flex");
    }, function() {
        $("#dropdownMenu").hide();
        $("#dropdownMenu").stop().animate({opacity:'0'}, 400);
        $(".submenu_Container:nth-child(2)").css("display","none");
});    
});

【问题讨论】:

  • 多个元素具有相同的 ID。这是不可接受的。
  • ID 必须是唯一的。您的标记中有多个具有相同 id 的元素
  • 是的,我应该把它改成课堂的吗?
  • @MagnusPilegaard 是的,你应该这样做。但是您必须更新所有引用此元素的 CSS 和 javascript。 (即#submenu_menuContainer 选择器将变为.submenu_menuContainer

标签: jquery css html


【解决方案1】:

要轻松解决您的问题,您必须将hover 事件附加到您的菜单项您的下拉列表中。看到这个Fiddle

把这个:$(".menuTitle:nth-child(2)").hover(...改成这个$(".menuTitle:nth-child(2), #submenu_Container:nth-child(1)").hover(...

但是您页面上的所有 ID 都存在真正的问题。每个页面的 ID 必须是唯一的,类可以在一个页面上出现多次。

这使您的 jquery 选择器非常奇怪。 #submenu_Container:nth-child(2)

但对于简单的悬停,您应该尝试使用纯 CSS 解决方案。但您可能需要更改一些标记。

【讨论】:

  • 我改变了所有的ID。谢谢!我将尝试测试您的代码。 :)
  • 运行良好。你知道如何让 MenuTitle 保持悬停效果,同时悬停在下拉菜单上吗?
  • @MagnusPilegaard 您应该将此 CSS 选择器:.menuTitle:nth-of-type(+n+2):hover 更改为此 .menuTitle:hover, .menuTitle.active,这将修复您的悬停选择器并创建一个名为 active 的 CSS 帮助器类,您可以在 javascript 中切换它。看到这个Fiddle
  • 太棒了!谢谢!最后一个问题,当你从 menutitle 移动到下拉菜单时,会有一个非常快的效果,标题菜单文本上的颜色会从深色切换到白色,然后又回到黑色。关于如何删除它的任何想法?
  • @MagnusPilegaard 请参阅此Fiddle 以获取 javascript 悬停事件中的修复。发生闪烁是因为您的子菜单未嵌套在菜单项中......它在外面。所以这会产生很多问题,这就是为什么我们建议您将菜单结构更改为使用嵌套 &lt;ul&gt;'s 的内容。
【解决方案2】:

我邀请你看看如何用 CSS 来做这个

https://css-tricks.com/dropdown-menus-with-more-forgiving-mouse-movement-paths/

使用 javascript 进行悬停可能会导致悬停无法在手机或平板电脑上正确触发。

这是我在 2 分钟内制作的小菜单。 http://jsfiddle.net/warface/ky413pnk/

HTML

<ul id="mainmenu">
    <li>Main Menu</li>
    <li>Menu 1
        <ul class="submenu">
            <li>Submenu 1</li>
            <li>Submenu 2</li>
        </ul>
    </li>
    <li>Menu 2</li>
</ul>

CSS

#mainmenu{ list-style:none;  background:#000; color:#fff}
#mainmenu li{display:inline-block; position:relative; padding:4px 10px; border-right:1px solid #fff}

.submenu{display:none; background:#000; color:#fff; position:absolute; top:26px; left:0}
#mainmenu li:hover ul{display:block; margin:0; padding:0}
#mainmenu li ul li{white-space:nowrap; padding:4px 10px}

【讨论】:

  • 我现在拥有的 HTML 结构可以做吗?
  • 不确定,最好使用nester
      来实现。由于父
        将悬停,因此当您将鼠标放在子代上时,您仍将位于其父代中。所以这就是浏览器知道你仍然悬停在主菜单上的方式。不知道我是否清楚
  • 好的。谢谢!我会调查一下。 :)
  • 我添加了一个简单的菜单,其中包含悬停时使用纯 CSS 的子菜单。这是 2 分钟内完成的粗略,但我希望你能得到曲线。
  • 谢谢你的榜样!
猜你喜欢
  • 2015-03-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多