带有 jQuery 和 nth-child 的下拉菜单
Posted
技术标签:
【中文标题】带有 jQuery 和 nth-child 的下拉菜单【英文标题】:Dropdown menu with jQuery and nth-child 【发布时间】:2015-11-11 11:07:08 【问题描述】:我刚刚用 jQuery 和一点点做了一个下拉菜单 特殊的html结构。 这就是我的结构的样子。 这是创建的 jsFiddle:https://jsfiddle.net/rxLg0bo4/10/ 但我希望它像一个适当的下拉菜单一样工作。这意味着当您将鼠标悬停在菜单上时,它应该显示 submenu_link。 f.e.如果您将鼠标悬停在 menu_link q 上,submenu_link 1-5 应该下拉。 这是 jQuery:
$(document).ready(function ()
$('.menu_link').ready(function ()
$("[id$=pnlSubmenu]").hide();
);
$('.menu_link').hover(function ()
$("[id$=pnlSubmenu]").slideDown(200);
);
$('[id$=pnlSubmenu]').mouseenter( function ()
$(this).show();
);
$('[id$=pnlSubmenu]').mouseleave(function ()
$(this).hide();
);
$('.menu_link').mouseleave(function ()
$("[id$=pnlSubmenu]").hide();
);
);
这是我的 ASP.NET 代码:
<nav id="menu">
<asp:Panel ID="pnlMenu" runat="server"></asp:Panel>
<asp:Panel ID="pnlSubmenu" runat="server">
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</asp:Panel>
</nav>
无论如何,我可以对第 n 个孩子这样做吗? 我也想要列表样式的链接,我该怎么做?
【问题讨论】:
你为什么用<div>
而不是<ul> <li>
?
【参考方案1】:
这是我在您的标记中找到的解决方案。
使用 CSS 美化它。
Jquery:
你做了什么?
当.menu_link
悬停时,我会找到它的索引。
索引查找它是第一个孩子还是第二个等等。
当我们有了这个神奇的索引号 var nthNumber
我们可以用它找到它对应的.submenu_panel
(我猜这里是因为我看不到你所有的代码)并隐藏或显示这个面板
例如。当我们将鼠标悬停在 first .menu_link
,
我们将显示 first .submenu_panel
我们对第二个和第三个等做同样的事情。
$(".menu_link, .submenu_panel").hover(function()
//Hover inn function
var nthNumber = $(this).index() + 1;
$("[id$=Submenu]").show();
$("[id$=Submenu] .submenu_panel:nth-of-type(" + nthNumber + ")").show();
, function()
//Hover out function
$("[id$=Submenu]").hide();
var nthNumber = $(this).index() + 1;
$("[id$=Submenu] .submenu_panel:nth-of-type(" + nthNumber + ")").hide();
);
#menu [id$=Menu]
border: 2px solid #2980b9;
border-radius: 5px;
background-color: #3498db;
#menu [id$=Menu] .menu_link
padding: 10px 10px;
display: inline-block;
font-size: 1.2em;
#menu [id$=Menu] .menu_link:hover
background-color: #45a9ec;
//border: 2px solid #2980b9;
border-radius: 2px;
cursor: pointer; //Visual only (REMOVE)!
#menu [id$=Submenu]
display: none;
#menu [id$=Submenu] .submenu_panel
display: none;
background-color: #45a9ec;
border: 2px solid #2980b9;
border-top: none;
border-bottom-right-radius: 2px;
border-bottom-left-radius: 2px;
#menu [id$=Submenu] .submenu_panel .submenu_link
position: relative;
display: block;
text-indent: 15px;
font-size: 1.1em;
padding: 4px 0px;
border-bottom: 1px solid #2980b9;
#menu [id$=Submenu] .submenu_panel .submenu_link:hover
background-color: #56bafd;
cursor: pointer; //ONLY FOR VISUAL(REMOVE)!
#menu [id$=Submenu] .submenu_panel .submenu_link:first-child
border-top: 1px solid #2980b9;
margin-top: -5px;
padding-top: 5px;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav id="menu">
<div id="pn1Menu">
<a class="menu_link">Lorem</a>
<a class="menu_link">Ipsum</a>
<a class="menu_link">Dollar</a>
<a class="menu_link">Si</a>
<a class="menu_link">Amet</a>
</div>
<div id="pn1Submenu">
<div class="submenu_panel">
<a class="submenu_link">100</a>
<a class="submenu_link">200</a>
<a class="submenu_link">300</a>
<a class="submenu_link">400</a>
<a class="submenu_link">500</a>
<a class="submenu_link">600</a>
</div>
<div class="submenu_panel">
<a class="submenu_link">010</a>
<a class="submenu_link">020</a>
<a class="submenu_link">030</a>
<a class="submenu_link">040</a>
<a class="submenu_link">050</a>
<a class="submenu_link">060</a>
</div>
<div class="submenu_panel">
<a class="submenu_link">1001</a>
<a class="submenu_link">2002</a>
<a class="submenu_link">3003</a>
<a class="submenu_link">4004</a>
<a class="submenu_link">5005</a>
<a class="submenu_link">6006</a>
</div>
</div>
</nav>
【讨论】:
它几乎可以工作,但正如你在 jsFiddle(jsfiddle.net/rxLg0bo4/13) 中看到的那样,如果我第一次悬停它会显示来自 menu1 和 menu2 的子菜单,如果我继续使用 menu2 它只显示 menu2 的菜单,如果我返回 menu1,它只会显示应有的 submenu1。 @aha364636,您可以将此行添加到@Persjin 的代码:$("[id$=Submenu] .submenu_panel").hide();
以最初隐藏所有子菜单。在此行之前插入它$("[id$=Submenu]").show();
。看到这个fiddle
@aha364636 我花了很多时间让它看起来不错,并且能够使用您的代码。我不能按照你的要求完美地完成它。有些你将不得不修改你自己,如果你要使用我的代码,你必须理解它。正如弗兰克指出的那样,您似乎只需要进行一些小改动即可使其正常工作。
@FrankFajardo 对不起,我对 jQuery 的了解不多,所以我无法找出我忘记了什么,你的小提琴保存了这个问题。【参考方案2】:
我做了相当多的调整https://jsfiddle.net/rxLg0bo4/19/ 你必须用一个真实的页面试一试才能确定。
$(document).ready(function ()
$('.menu_link').ready(function ()
$("[id$=pnlSubmenu]").hide();
);
$('.menu_link1').hover(function ()
$("[id$=pnlSubmenu]").slideDown(200);
$("[class$=submenu_panel]").css("left", "0px");
);
$('.menu_link2').hover(function ()
$("[id$=pnlSubmenu]").slideDown(200);
$("[class$=submenu_panel]").css("left", "12%");
);
$('.menu_link3').hover(function ()
$("[id$=pnlSubmenu]").slideDown(200);
$("[class$=submenu_panel]").css("left", "25%");
);
$('.menu_link4').hover(function ()
$("[id$=pnlSubmenu]").slideDown(200);
$("[class$=submenu_panel]").css("left", "37%");
);
$('.menu_link5').hover(function ()
$("[id$=pnlSubmenu]").slideDown(200);
$("[class$=submenu_panel]").css("left", "50%");
);
$('[id$=pnlSubmenu]').mouseenter(function ()
$(this).show();
);
$('[id$=pnlSubmenu]').mouseleave(function ()
$(this).hide();
);
$('.menu_link1').mouseleave(function ()
$("[id$=pnlSubmenu]").hide();
);
$('.menu_link2').mouseleave(function ()
$("[id$=pnlSubmenu]").hide();
);
$('.menu_link3').mouseleave(function ()
$("[id$=pnlSubmenu]").hide();
);
$('.menu_link4').mouseleave(function ()
$("[id$=pnlSubmenu]").hide();
);
$('.menu_link5').mouseleave(function ()
$("[id$=pnlSubmenu]").hide();
);
);
#pnlMenu .menu_link:hover #pnlSubmenu .submenu_link
height:50px;
display:block;
#wrapper_menu
margin-bottom: 50px;
position: relative;
z-index: 1;
#menuicon
margin: 0 auto;
width: 27px;
display: none;
.menubar
background: #001155;
height: 4px;
width: 27px;
margin-bottom: 5px;
border-radius: 2px;
position: relative;
-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
-ms-transition: all 0.3s ease-out;
-o-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
#menuicon:hover #menubar-top
transform: translate(0px, 9px) rotate(45deg);
#menuicon:hover #menubar-mid
opacity: 0;
#menuicon:hover #menubar-bottom
transform: translate(0px, -9px) rotate(-45deg);
#menu
height: 44px;
width: 980px;
margin: 0 auto;
border-radius: 5px;
background: rgb(229, 229, 229);
/* Old browsers */
background: -moz-linear-gradient(top, rgba(229, 229, 229, 0.95) 0%, rgba(193, 192, 194, 0.95) 100%);
/* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(229, 229, 229, 0.95)), color-stop(100%, rgba(193, 192, 194, 0.95)));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(229, 229, 229, 0.95) 0%, rgba(193, 192, 194, 0.95) 100%);
/* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(229, 229, 229, 0.95) 0%, rgba(193, 192, 194, 0.95) 100%);
/* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(229, 229, 229, 0.95) 0%, rgba(193, 192, 194, 0.95) 100%);
/* IE10+ */
background: linear-gradient(to bottom, rgba(229, 229, 229, 0.95) 0%, rgba(193, 192, 194, 0.95) 100%);
/* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#e5e5e5', endColorstr='#c1c0c2', GradientType=0);
/* IE6-9 */
-webkit-box-shadow: 0px 2px 2px 0px rgba(50, 50, 50, 0.5);
-moz-box-shadow: 0px 2px 2px 0px rgba(50, 50, 50, 0.5);
box-shadow: 0px 2px 2px 0px rgba(50, 50, 50, 0.5);
#pnlMenu
width: 100%;
height: auto;
.menu_link1, .menu_link2, .menu_link3, .menu_link4, .menu_link5, .menu_link6
position:relative;
font-size: 15px;
line-height: 44px;
padding: 0 40px;
text-align:left;
.menu_link1:active, .menu_link2:active, .menu_link3:active, .menu_link4:active, .menu_link5:active, .menu_link6:active, .menu_link1:focus, .menu_link2:focus, .menu_link3:focus, .menu_link4:focus, .menu_link5:focus, .menu_link6:focus,
color: #2d98e5;
border-radius: 5px;
background: rgb(229, 229, 229);
/* Old browsers */
background: -moz-linear-gradient(top, rgba(193, 192, 194, 0.95) 0%, rgba(229, 229, 229, 0.95) 100%);
/* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(193, 192, 194, 0.95)), color-stop(100%, rgba(229, 229, 229, 0.95)));
/* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(193, 192, 194, 0.95) 0%, rgba(229, 229, 229, 0.95) 100%);
/* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(193, 192, 194, 0.95) 0%, rgba(229, 229, 229, 0.95) 100%);
/* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(193, 192, 194, 0.95)) 0%, rgba(229, 229, 229, 0.95) 100%);
/* IE10+ */
background: linear-gradient(to bottom, rgba(193, 192, 194, 0.95) 0%, rgba(229, 229, 229, 0.95) 100%);
/* W3C */
filter: progid:DXImageTransform.Microsoft.gradient(endColorstr='#c1c0c2', startColorstr='#e5e5e5', GradientType=0);
/* IE6-9 */
-webkit-box-shadow: inset 0px 0px 7px 0px rgba(50, 50, 50, 0.3);
-moz-box-shadow: inset 0px 0px 7px 0px rgba(50, 50, 50, 0.3);
box-shadow: inset 0px 0px 7px 0px rgba(50, 50, 50, 0.3);
.last_menu_link
float: right;
.submenu_link
.submenu_panel
width: 15%;
height: auto;
background: gray;
position:relative;
overflow: hidden;
transition: all 0.2s ease-in-out;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<div id="wrapper_menu">
<div id="menuicon">
<div class="menubar" id="menubar-top"></div>
<div class="menubar" id="menubar-mid"></div>
<div class="menubar" id="menubar-bottom"></div>
</div>
<nav id="menu">
<div id="pnlMenu"> <a class="menu_link1" href="Index.aspx?category=1">menu1</a><a class="menu_link2" href="Index.aspx?category=2">menu2</a><a class="menu_link3" href="Index.aspx?category=4">menu3</a><a class="menu_link4" href="Index.aspx?category=5">menu4</a><a class="menu_link5" href="Index.aspx?category=6">menu5</a><a class="menu_link6 last_menu_link" href="Index.aspx?category=8">menu6</a>
</div>
<div id="pnlSubmenu" style="display:none">
<div class="submenu_panel" style="height:100px"> <a class="submenu_link" href="Pages/Chart.aspx?id=7">submenu1</a><a class="submenu_link" href="Pages/Chart.aspx?id=8">submenu2</a>
</div>
<div class="submenu_panel" style="height:100px"> <a class="submenu_link" href="Pages/Chart.aspx?id=4">Link1</a>
<a class="submenu_link" href="Pages/Chart.aspx?id=11">Link2</a>
</div>
</div>
</nav>
</div>
【讨论】:
你是否也对 CSS 做了一些事情,或者你是如何做到的,只在你悬停的地方显示它?我想将 Persijn 的答案与您的答案联系起来。 但是哪个 CSS 或 jQuery 确实使它只显示在您悬停的确切链接下? 它在 jquery 下的那一行向下滑动我设置了一个左 哦,现在我明白了,但这很难添加到 Persijn 的代码中。 @RachelGallen 很好的解决方案 :) 一个问题,你不能点击任何链接,因为当你试图将它们悬停在它们上面时它们会消失。【参考方案3】:我想这就是你想要的? 使用 CSS 而不是 jquery。这应该可以帮助您入门。
https://jsfiddle.net/cshanno/bgryLLwo/
HTML
<ul class="menu">
<li>Link
<ul class="submenu">
<li>Example 1</li>
<li>Example 2</li>
</ul>
</li>
<li> Link 2</li>
</ul>
CSS
.menu
border:1px solid black;
.menu, .menu li
padding:0;
margin:0 10px;
display:inline-block;
list-style:none;
.menu ul
display:none;
.menu li:hover ul
display:block;
position:absolute;
padding:0;
.menu li:hover ul li
margin:0 0;
display:block;
border: 1px solid black;
.menu li ul li:hover
background-color:skyblue;
【讨论】:
我实际上需要使用 jQuery,因为生成了 html。所以我需要找到一种方法来使用 jQuery。 如果您是动态生成菜单,那么为什么您严格需要 jquery 解决方案? 我并不严格需要它,但我无法使用 CSS 选择器选择一些生成的 id。 您仍然可以将 css 与动态创建的 html 元素一起使用。如果您计划需要创建多个,只需使用类而不是 id 生成它们。 jsfiddle.net/cshanno/bgryLLwo/2以上是关于带有 jQuery 和 nth-child 的下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章
带有 jQuery 的 themoviedb JSON API
使用带有 jQuery addClass 和 removeClass 方法的过渡持续时间
带有 jQuery 和 Bootstrap 3 的可折叠响应式侧边栏菜单
带有 jQuery 的 Python JSON RPC - ServiceRequestNotTranslatable