修复响应式菜单父切换 - jQuery / Javasicript

时间:2016-03-01 21:12:13

标签: javascript jquery html css responsive-design

我正在使用jQuery / javascript和css构建一个完全响应的可访问菜单。

我的一切工作正常,除了当视口小于535像素且显示切换菜单时,点击父母不会扩展孩子,只是直接链接到该页面。

我喜欢它,所以当你点击父母时,请说"工具"例如,子项显示,父项和子项都是可单击的链接。

这是一个要查看的暂存网站:website link

这是js的样本:

            var ww = 0;

jQuery(document).ready(function($) {

    $(".menu").show();

    $(".menu .currenthas-child a, .menu .has-child a").each(function() {
        if ($(this).next().length > 0) {
            $(this).addClass("parent");
        };
    });

    $(".toggleMenu").click(function(e) {
        e.preventDefault();
        $(this).toggleClass("active");

        if($(this).hasClass("active")){
            //show menu
                $(".menu").removeClass("hidden").fadeIn(250);

        } else {
            //hide menu
                $(".menu").addClass("hidden");
        }

    });

    $(".menu li ul li").click(function(e) {
        if ($(".toggleMenu").hasClass("active")){
            $(".menu").toggleClass("hidden");
        }
    });

    //on click, anywhere on page, close all menu items
    $(document).click( function() {  
        $(".menu li").each(function() {
            if ($(this).hasClass("hover") || $(this).hasClass("keyhover")) {
                $(this).removeClass("hover");
                $(this).removeClass("keyhover");
                //console.log('hover removed');
            }
        });
    });


    //Focus State - Navigation
    $(".menu li").focusin(function (e) {
        if (!$(this).hasClass("keyhover")) {
            $(this).addClass("keyhover");
            showElement($(".menu"));
        } 
        //console.log('menu item focusin');
    });

    //Blur State - Navigation
    $(".menu li").focusout(function (e) {
        if ($(this).hasClass("keyhover")) {
            $(this).removeClass("keyhover");
        } 
        if ($(this).hasClass("hover")) {
            $(this).removeClass("hover");
        } 
        //console.log('menu item focusout');

    });

    //Focus State - Navigation Sub Items
    $(".menu li ul li").focusin(function () {
        if (!$(this).hasClass("glow")) {
            $(this).addClass("glow");
        } 
    });

    //Blur State - Navigation Sub Items
    $(".menu li ul li").focusout(function () {
        if ($(this).hasClass("glow")) {
            $(this).removeClass("glow");
        } 
    });

    //on window resize, recheck size and adjustMenu
    $(window).bind('resize orientationchange', function() {

        ww = viewportSize.getWidth();
        adjustMenu();

        //UN-COMMENT FOR DEBUG OUTPUT
        //var widthTest = document.documentElement.clientWidth;
        //var widthTest2 =  screen.width;
        //console.log("document.documentElement.clientWidth ="+widthTest);
        //console.log("screen.width = "+widthTest2);
        //console.log("viewport().width = "+ww);
        //var mql = window.matchMedia("screen and (max-width: 47.938em)");
        //console.log(mql);
    });

    var hideElement = function(elementToModify) {
        elementToModify.addClass("hidden");
    }

    var showElement = function(elementToModify) {
        elementToModify.removeClass("hidden");
    }

    var adjustMenu = function() {

        if (ww <= 535) {

            $(".toggleMenu").css("display", "inline-block");
            if (!$(".toggleMenu").hasClass("active")) {
                hideElement($(".menu"));
            } else {
                showElement($(".menu"));
            }

            $(".menu li h2.parent").unbind('click').bind('click', function(e) {
                // must be attached to anchor element to prevent bubbling
                e.preventDefault();

                if (e.stopPropagation){
                    e.stopPropagation();
                }
                else if(window.event){
                   window.event.cancelBubble=true;
                }

                //close any sibling menu items
                //$(this).parent().siblings('li').removeClass("hover");
                //$(this).parent().siblings('li').removeClass("keyhover");

                //handle click request
                if (!$(this).parent().hasClass("hover")) {
                    $(this).parent().addClass("hover");
                    //console.log('hover added');
                } else {
                    $(this).parent().removeClass("hover");
                    $(this).parent().removeClass("keyhover");
                    //console.log('hover removed');
                }

            });

        } 
        else if (ww > 535) {

            $(".toggleMenu").css("display", "none");
            $(".toggleMenu").removeClass("active");

            //show menu parents
            showElement($(".menu"));

            //hide any popped up menu sub-items
            $(".menu li").removeClass("hover");

            $(".menu li h2.parent").unbind('click').bind('click', function(e) {
                // must be attached to anchor element to prevent bubbling
                e.preventDefault();

                if (e.stopPropagation){
                    e.stopPropagation();
                }
                else if(window.event){
                   window.event.cancelBubble=true;
                }

                //close any sibling menu items
                $(this).parent().siblings('li').removeClass("hover");
                $(this).parent().siblings('li').removeClass("keyhover");

                //handle click request
                if (!$(this).parent().hasClass("hover")) {
                    $(this).parent().addClass("hover");
                    //console.log('hover added');
                } else {
                    $(this).parent().removeClass("hover");
                    $(this).parent().removeClass("keyhover");
                    //console.log('hover removed');
                }                
            });
        } 
    }

    //initialize the menu
    ww = viewportSize.getWidth();
    adjustMenu();
});

1 个答案:

答案 0 :(得分:0)

我认为你想要的是一个奇怪的菜单行为。如果第二次点击主链接重定向到此页面,如何关闭子菜单?

那就是说,你可以这样做你想做的事:

  $(".menu li").click(function(e) {
    if (!$(this).children('ul').is('.open')) {
      e.preventDefault();
      $(this).children('ul').addClass('open').css({'left' : '0px'});
    }
  });

最好测试子菜单是否可见,但您必须使用.sub-menu更改display:none班级的CSS,而不是left: -9999px < / p>

<强>更新

您不能在子菜单上设置slideDown效果,因为它们具有position : absolute属性。因此,您需要处理媒体查询以更改它并将其设置为display : none属性。这样,您可以对slideDown使用简单的click event效果,并在相应的子菜单不可见时阻止该事件。

请看这个示例:

&#13;
&#13;
$(document).ready(function(){
  $(".dropdown").click(function(e) {
    if (!$(this).children('ul').is(':visible')) {
      e.preventDefault();
      $(this).children('ul').slideDown();
    }
  });
});
&#13;
*, *:before, *:after {   
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

ul {
  list-style-type: none;
  width: 100%;
}

ul li {
  display: block;
  position: relative;
}

ul li a {
  color: #fff;
  text-decoration: none;
  cursor: pointer;
  padding: 10px 20px;
  display: block;
  width: 100%;
}

ul > li > a {
  background: #28AADC;
}

ul li a:hover {
  background: #00648C;
}

ul.submenu {
  display: none;
}

ul.submenu > li > a {
  background: #FFBE4F;
}

nav > ul {
  width: 400px;
}

@media screen and (min-width:536px){
  nav > ul > li {
    width: 33.33%;
    float: left;
  }  
  
  nav > ul > li:hover ul.submenu {
    display:block;
  }
  
  ul.submenu {
    position: absolute;
  }
}

@media screen and (max-width:535px){
  nav > ul > li {
    width: 100%;
    float: none;
  }  
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<nav>
  <ul>
    <li class="dropdown">
      <a href="http://stackoverflow.com">Nav 1</a>
      <ul class="submenu">
        <li><a href="#">Nav 1.1</a></li>
        <li><a href="#">Nav 1.2</a></li>
        <li><a href="#">Nav 1.3</a></li>
        <li><a href="#">Nav 1.4</a></li>
      </ul>
    </li>
    <li class="dropdown">
      <a href="http://stackoverflow.com">Nav 2</a>
      <ul class="submenu">
        <li><a href="#">Nav 2.1</a></li>
        <li><a href="#">Nav 2.2</a></li>
        <li><a href="#">Nav 2.3</a></li>
        <li><a href="#">Nav 2.4</a></li>
      </ul>
    </li>
    <li class="dropdown">
      <a href="http://stackoverflow.com">Nav 3</a>
      <ul class="submenu">
        <li><a href="#">Nav 3.1</a></li>
        <li><a href="#">Nav 3.2</a></li>
        <li><a href="#">Nav 3.3</a></li>
        <li><a href="#">Nav 3.4</a></li>
      </ul>
    </li>
  </ul>
</nav>
&#13;
&#13;
&#13;