如何在点击时制作CSS下拉菜单

3
如何使下面的CSS下拉菜单只接受点击才能展开?例如,现在当鼠标悬停在“请选择”上时,第二层出现。我想改为单击“请选择”时,第二层出现。同时,点击事件应该适用于第二层菜单。这是一个Fiddle。我正在使用jQuery,但不知道如何实现。以下是HTML代码:
 <ul class="dropdown">
        <li><a href="#">Please select</a>
            <ul class="sub_menu">
                 <li>
                     <a href="#">Artificial Turf</a>
                     <ul>
                        <li><a href="#">Indoor</a></li>
                        <li><a href="#">Outdoor</a></li>
                    </ul>                    
                </li>
                 <li>
                    <a href="#">Batting Cages</a>
                    <ul>
                        <li><a href="#">Indoor</a></li>
                        <li><a href="#">Outdoor</a></li>
                    </ul>
                 </li>
            </ul>
        </li>
    </ul

CSS代码

/* 
    LEVEL ONE
*/
ul.dropdown                         { position: relative; }
ul.dropdown li                      { font-weight: bold; float: left; zoom: 1; background: #ccc; }
ul.dropdown a:hover                    { color: #000; }
ul.dropdown a:active                { color: #ffa500; }
ul.dropdown li a                    { display: block; padding: 4px 8px; border-right: 1px solid #333;
                                       color: #222; }
ul.dropdown li:last-child a         { border-right: none; } /* Doesn't work in IE */
ul.dropdown li.hover,
ul.dropdown li:hover                { background: #F3D673; color: black; position: relative; }
ul.dropdown li.hover a              { color: black; }


/* 
    LEVEL TWO
*/
ul.dropdown ul                         { width: 220px; visibility: hidden; position: absolute; top: 100%; left: 0; }
ul.dropdown ul li                     { font-weight: normal; background: #f6f6f6; color: #000; 
                                      border-bottom: 1px solid #ccc; float: none; }

                                    /* IE 6 & 7 Needs Inline Block */
ul.dropdown ul li a                    { border-right: none; width: 100%; display: inline-block; } 

/* 
    LEVEL THREE
*/
ul.dropdown ul ul                     { left: 100%; top: 0; }
ul.dropdown li:hover > ul             { visibility: visible; }​

我很好奇是否有一种不使用Javascript的CSS解决方案。也许可以使用伪类选择器:active:focus来实现。 - danijar
顺便提一下,你CSS代码中的第7和8行是相同的,因此是多余的。 - danijar
1个回答

1

我注意到你在CSS中使用visibility来显示或隐藏ul,因此你应该使用这段代码

   $(".dropdown li").click(function() { 
        $(this).parent().children("li").not(this).children("ul").css({ "visibility":"hidden" });
        $(this).children("ul").css({ "visibility":"visible" });
    })​

你还应该从你的CSS中删除这一行:

ul.dropdown li:hover > ul { visibility: visible; }​

要关闭选项卡,请使用以下代码:

$('html').click(function() {
   $(".dropdown ul").css({ "visibility":"hidden" });
 });

 $('.dropdown ').click(function(event){
     event.stopPropagation();
 });

最后一部分取自这个stackoverflow问题如何检测元素外的点击?

另外,为了修复悬停时位置变化的问题,请将您的CSS中的2行更改为以下内容

ul.dropdown li  { font-weight: bold; float: left; zoom: 1; background: #ccc; position: relative; }

当我点击菜单之外的任何地方时,我想关闭菜单。 - user503853
似乎当单击子菜单并将鼠标悬停在另一个菜单上时,子子菜单会重叠。 - user503853
我修复了重叠部分,悬停时出现的错误似乎取决于CSS,稍等我会试着解决它。 - John
嗨John,你能告诉我如何在点击第三层菜单项后关闭菜单吗?我在捕获点击事件时使用<code>$(".dropdown ul").css({ "visibility":"hidden" });</code>,但不起作用。 - user503853
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/19622/discussion-between-sop-and-john - user503853
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接