带有 jQ​​uery 和 nth-child 的下拉菜单

Posted

技术标签:

【中文标题】带有 jQ​​uery 和 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 个孩子这样做吗? 我也想要列表样式的链接,我该怎么做?

【问题讨论】:

你为什么用&lt;div&gt;而不是&lt;ul&gt; &lt;li&gt; 【参考方案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

以上是关于带有 jQ​​uery 和 nth-child 的下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

带有 jQ​​uery 的 themoviedb JSON API

使用带有 jQ​​uery addClass 和 removeClass 方法的过渡持续时间

带有 jQ​​uery 动画的慢速/无响应动画

带有 jQ​​uery 和 Bootstrap 3 的可折叠响应式侧边栏菜单

带有 jQ​​uery 的 Python JSON RPC - ServiceRequestNotTranslatable

带有 jQ​​uery 验证插件的新 reCaptcha