【问题标题】:how can I remove the subnavigation overlap?如何删除子导航重叠?
【发布时间】:2012-01-18 19:16:07
【问题描述】:

我正在尝试创建子导航。现在我有两个子导航。当我将鼠标悬停在主菜单上的第一项上时,会出现相应的子菜单。但是当我将鼠标悬停在第二个项目上时,第二个子导航出现在第一个上。我怎样才能编写代码以免发生这种情况?

网址:http://arabic001.com

$(document).ready(function() {

        $('#arbNavText01').mouseover(function()  {
            $('#subNav01').show('slow');
        });

        $('#subNav01').mouseleave(function() {
            $('#subNav01').hide('slow');
        }); 


         $('#arbNavText02').mouseover(function()  {
            $('#subNav02').show('slow');
        });

        $('#subNav02').mouseleave(function() {
            $('#subNav02').hide('slow');
        }); 



        })

我刚刚尝试了 Scott 的以下建议,但无法在悬停时显示和隐藏子菜单。关于如何解决这个问题的任何想法?这是我的新代码:

html

<div id="menu01" class="menu_item">
            <div id="engNavText01">Alphabet</div>
            <div id="arbNavText01">الأحرف</div>
            <div id="subNav01" style="display:none;">
                <a href="colors" class="subNav">
                    <span style="font-size:26px; cursor:pointer;">قراءة</span</a>
                    <br>reading<br><br>
        </div>
        </div>

        <div id="menu02" class="menu_item">
            <div id="engNavText02">Numbers</div>
            <div id="arbNavText02">الأحرف</div>
            <div id="subNav02" style="display: none; ">
                <a href="colors" class="subNav">
                    <span style="font-size:26px; cursor:pointer;">قراءة</span</a>
                    <br>reading<br><br>
        </div>
        </div>

和 JS

$(document).ready(function() {

$('.menu_item').children().hover(
function(){
    $subNav = $(this).parents('menu_item').children("div[id^='subNav'");
    if ($subNav.css('display', 'none')){
        $subNav.show('slow');
    }
},
function(){
    $(this).parents('menu_item').children("div[id^='subNav'").hide('slow');
});

})

【问题讨论】:

    标签: javascript jquery navigation hover submenu


    【解决方案1】:

    您已经创建了一个 mouseleave 事件,但您只是将它附加到子菜单。因此,为了使菜单消失,用户必须将鼠标悬停在子菜单上然后移出。您可以通过在打开新子菜单之前隐藏其他子菜单来实现您想要的。因此,保持 mouseleave 事件不变,您可以将 2 个 mouseover 事件修改为:

        $('#arbNavText01').mouseover(function()  {
            $('#subNav02').hide('slow');
            $('#subNav01').show('slow');
        });
        $('#arbNavText02').mouseover(function()  {
            $('#subNav01').hide('slow');
            $('#subNav02').show('slow');
        });
    

    编辑评论: 当我最初去查看您的页面时,我正在考虑这一点。我认为如果您在 html 中使用稍微不同的结构,则可以这样做。现在你的菜单 div 在结构上并没有明确的相互关联,所以可以添加一个 div,它可以包含与每个菜单项关联的 3 个元素。

    我要吐出一个想法,它甚至可能都行不通,更不用说是最好的方法了。

    <div id="menu01" class="menu_item">
        <div id="engNavText01">Alphabet</div>
        <div id="arbNavText01">الأحرف</div>
        <div id="subNav01" style="display: none; ">
            <a href="colors" class="subNav"><span style="font-size:26px; cursor:pointer;">قراءة</span</a>
            <br>reading<br><br>
        </div>
    </div>
    <div id="menu02" class="menu_item">...
    

    编辑过的 JS,我认为现在可以工作了

    $('.menu_item').hover(
        function(){
            $subNav = $(this).children("div[id^='subNav']");
            if ($subNav.css('display', 'none')){
                $subNav.show('slow');
            }
        },
        function(){
            $(this).children("div[id^='subNav']").hide('slow');
        }
    );
    

    正在尝试使用JSFiddle,那里似乎还不错。可能需要一些修改以供您使用。

    【讨论】:

    • 谢谢。这完美地工作,除了现在我必须为其余的子导航做同样的事情。我有八个,我不想在代码中重复自己。例如,是否有一种优雅的编写方式,以便有一个类。我在哪里可以要求它一次只显示一个子菜单?
    • 我一直在寻找按照您在我的 html 文件中建议的方式将它们放入 div 中。感谢我对代码的改进。但是js代码不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 2021-05-12
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多