提问者:小点点

展开/折叠jQuery菜单选择器


I',试图构建一个扩展/折叠菜单。

我有一个主导航栏,里面有3个子菜单。默认情况下,子菜单的高度为50px,但一旦点击,这个高度就会变为200px。再点击一下,让它塌陷回原来的50px。

让我烦恼的是,当我展开subMenu1,然后展开Submenu2-Submenu1保持展开,并且我希望它在第二个子菜单被选中时折叠。

这是我的代码;

<!DOCTYPE html>
<html>
<head>
    <title>projectFive</title>
    <link rel="stylesheet" href="css/style.css" type="text/css">
</head>
<body>




    </div>
</div>
<div class="sideMenu">

    <div class="sideButton">&#9776;</div>
    <div class="profilePic"></div>

    <div class="menuButtonHolder">


        <div class="menuButton">
            <a class="menuButtonIcon" href="#"><img src="./img/rightArrow.png" id="arrow" alt=""><span>link</span></a>
            <div class="subMenu"></div>
        </div><!--  ending toggle button -->


    <div class="menuButton">
            <a class="menuButtonIcon" href="#"><img src="./img/rightArrow.png" id="arrow" alt=""><span>link</span></a>
            <div class="subMenu"></div>
        </div><!--  ending toggle button -->


    <div class="menuButton">
            <a class="menuButtonIcon" href="#"><img src="./img/rightArrow.png" id="arrow" alt=""><span>link</span></a>
            <div class="subMenu"></div>
        </div><!--  ending toggle button -->


    </div> <!-- ending menu button holder -->

</div>
<!-- ending side menu
 -->


<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js" type="text/javascript"></script>
<script src="my.js" type="text/javascript"></script>
</body>
</html>

和jQuery:

$(document).ready(function(){


    var $menuButton = $(".sideButton");
    var $menuBar = $(".sideMenu");
    var $profilePic = $(".profilePic");

    $menuButton.click(function(){
        if ($(this).hasClass("active")){

            $profilePic.fadeOut(200);
            $profilePic.css({"width": "25px", "height": "25px", "transition": "width 0.3s linear, height 0.3s linear"}, 500);

            $(".menuButtonHolder").css({
                "top": "1000px", 
                "transition": "top .4s ease-out"});

            $menuBar.animate({width: "60px"}, 500);
            $menuBar.css({"background-color": "rgba(0,0,0,0.9)"});
            $menuButton.removeClass("active");



        } else {

            $profilePic.fadeIn(500);
            $profilePic.css({"width": "150px", "height": "150px", "transition": "width 0.7s linear, height 0.7s linear"}, 500);

            $(".menuButtonHolder").css({
                "top": "0px", 
                "transition": "top .8s ease-out"});

            $menuBar.animate({width: "300px"}, 800);
            $menuBar.css({"background-color": "rgba(0,0,0,0.5)", "transition": "background-color .5s linear"});
            $menuButton.addClass("active");
        }


});


$(".menuButtonIcon").click(function(){


        if ($(this).hasClass("filter")){

            $(this).find("#arrow").css({"-webkit-transform": "rotate(90deg)", "transition": "transform 0.5s ease-out"});
            $(this).css({"height": "50px", "transition": "height 0.5s ease-out"});
            $(this).removeClass("filter");





        } else {
            $(this).find("#arrow").css({"-webkit-transform": "rotate(180deg)", "transition": "transform 0.5s ease-out"});
            $(this).css({"height": "200px", "transition": "height 0.5s ease-out"});
            $(".menuButtonIcon").addClass("filter");
        }


});


});

我想知道什么功能或什么使用来确保一旦任何子菜单的被点击-它的兄弟会崩溃,如果有一个展开。

我希望我的代码有足够的信息给你们一个想法。

提前道谢!


共1个答案

匿名用户

尝试将子菜单折叠逻辑移动到一个单独的函数中,并使用click事件函数中的相关元素调用它,如下所示:

function collapse($elements) {
  $elements.removeClass("filter");
  $elements.find("#arrow").css({"-webkit-transform": "rotate(90deg)", "transition": "transform 0.5s ease-out"});
  $elements.css({"height": "50px", "transition": "height 0.5s ease-out"});
}

$(".menuButtonIcon").click(function(){
  if ($(this).hasClass("filter")){
    collapse($(this));
  } else {
    $(this).find("#arrow").css({"-webkit-transform": "rotate(180deg)", "transition": "transform 0.5s ease-out"});
    $(this).css({"height": "200px", "transition": "height 0.5s ease-out"});
    $(this).addClass("filter");
    collapse($(".menuButtonIcon").not($(this)));
  }
});

如果菜单项有“filter”类,则折叠菜单项;如果菜单项没有,则折叠除单击菜单项之外的所有内容,但其他项可能会折叠。

下面是一个简单的实例:http://codepen.io/nrbernard/pen/doqwlr