【问题标题】:Responsive menu doesn't close even after browser resize即使在浏览器调整大小后响应菜单也不会关闭
【发布时间】:2015-02-04 00:29:16
【问题描述】:

这是我的代码: HTML:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>Responsive Menu</title>
    <link rel="stylesheet" href="css/colors.css"/>
    <link rel="stylesheet" href="css/font-awesome.css"/>
</head>
<body>
<header id="topbar">
    <p>Some title</p>

    <nav class="menu">
        <ul>
            <li><a href="#">Home</a></li>
            <li><a href="#">Work</a></li>
            <li><a href="#">Contact Me</a></li>
        </ul>
    </nav>

    <div class="nav-trigger">
        <span><i class="fa fa-bars fa-2x"></i></span>
    </div>

    <nav class="mobile-menu-enabler">
        <span></span>
    </nav>
</header>

<nav class="mobile-menu">
    <ul>
        <li><a href="#">Home</a></li>
        <li><a href="#">Work</a></li>
        <li><a href="#">Contact Me</a></li>
    </ul>
</nav>


<!-- Begin main sample site content -->
<div id="wrapper">
    <p>Lorem ipsum dolor set amet...</p>
</div>


<script src="js/jquery-2.1.3.js"></script>
<script src="js/script.js"></script>
</body>
</html>

CSS:

body {
    font-family: "Ludica Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif;
}

p {
    margin: 0;
    padding: 0;
    display: inline-block;
}

header {
    margin: 0;
    padding: 0;
    display: inline-block;
    position: absolute;
    top: 0;
    left: 0;
    background-color: azure;
    border: 1px solid black;
    width: 100%;
}

/* Begin Menu Code */
.menu {
    display: inline-block;
    float: right;
}

.menu ul {
    list-style: none;
    margin: 5px 0;
}

.menu ul:last-child {
    margin-right: 10px;
}

.menu ul li {
    display: inline-block;
    margin: 0 2px;
    padding: 0;
    border: 1px solid black;
}

.menu ul li a {
    text-decoration: none;
    color: black;
    padding: 3px;
}

.menu ul li>:hover {
    background-color:black;
    color: white;
}
/* End Menu Code */

/* Mobile Menu Begin */
.mobile-menu-enabler {
    display: none;
    background-color: aqua;
}

.mobile-menu {
    display: none;
    position: relative;
    top: 38px;
    width: 100%;
    border-top: 1px solid black;
}

.mobile-menu ul {
    list-style: none;
    margin: 0;
    padding: 0;
}

.mobile-menu ul li {
    margin: 0;
    padding: 0;
    border: 1px solid black;
    border-top: 1px solid transparent;
    text-align: center;
}

.mobile-menu ul li a {
    margin: 0;
    padding: 0;
    text-decoration: none;
    color: black;
}

.mobile-menu ul li:hover {
    background-color: darkkhaki;
}
/* Mobile Menu End */

/* Mobile Trigger Button */
.nav-trigger {
    display: none;
    text-transform: uppercase;
    color: black;
    background-color: transparent;
    margin-right: 10px;
    padding: 0;
    text-align: center;
}

.nav-trigger:hover {
    color: red;
    background-color: transparent;
}
/* End Mobile Trigger Button */


/* Dummy wrapper stuff */
#wrapper {
    clear: both;
    display: inline-block;
    position: relative;
}
/* End Dummy wrapper stuff */

@media screen and (max-width: 900px) {
    .menu {
        display: none;
    }

    .mobile-menu-enabler {
        display: block;
    }

    .nav-trigger {
        display: inline-block;
        float: right;
    }

    /*.mobile-menu {*/
        /*display: block;*/
    /*}*/
}

JavaScript:

$(document).ready(function(){ // Begin document ready function
    var headerHeight = $("#topbar").height();

    $(".nav-trigger").click(function() {
        $(".mobile-menu").slideToggle(400)
    });

    $(".mobile-menu").css("top", headerHeight);

    $("#wrapper").css("top", headerHeight);
}); // End document ready function

当页面加载时,我有一个包含虚拟链接的顶部标题栏。当浏览器宽度缩小到 900px 处的断点以下时,响应式菜单启动,此时单击“3 条图标”时,下拉菜单按预期显示。

但是,如果我在不先关闭下拉菜单的情况下将屏幕大小调整回全尺寸,那么即使在浏览器完全展开后它也会继续保持。

如何使下拉菜单在超过 900px 的断点处自动“取消切换”?

谢谢

编辑:截图:

这是我希望它的行为方式: callmenick.com/lab-demos/10-simple-responsive-navigation 移动导航完全展开后,浏览器窗口展开后会自动向上滑动

【问题讨论】:

  • 似乎是一个极端的情况,但您必须使用 onresize 做一些事情。
  • 请提供小提琴链接或现场示例,谢谢
  • @epascarello 不,这是错误的,因为会有一个巨大的性能问题。我以前在其他示例中看到过这样做。

标签: javascript jquery html css responsive-design


【解决方案1】:

由于您在单击该菜单栏图标时使用 Javascript 来切换显示,因此它在某种程度上几乎使 .mobile-menu 的“显示”css 无效(因为它在 css 已经更改样式之后加载)。因此,您需要切换 UL 显示值(子),而不是 .mobile-menu(父)。这样,响应式 .mobile-menu css 就会保持原样......我相信这就是您提到的示例网站所做的。

<nav class="mobile-menu">
    <ul class="mobile-menu-items">
        <li><a href="#">Home</a></li>
        <li><a href="#">Work</a></li>
        <li><a href="#">Contact Me</a></li>
    </ul>
</nav>

将 .mobile-menu 的 css 保留为 display: none 在大屏幕上, display:block 用于较小。然后对于新类“.mobile-menu-items”,您可以最初将其设置为显示:无,并使用您的 jQuery 切换它:

$('.nav-trigger').click(function(){
    $('.mobile-menu-items').slideToggle();
});

或者,您可以切换可见性而不是显示。

$('.nav-trigger').click(function(){
  if ( $('.mobile-menu').css('visibility') == 'hidden' )
    $('.mobile-menu').css('visibility','visible');
  else
    $('.mobile-menu').css('visibility','hidden');
});

【讨论】:

    【解决方案2】:

    如果您想在窗口过宽时真正收回移动菜单(而不仅仅是在 CSS 中隐藏它),试试这个:

    var $window = $(window), // caching the objects for performance
        $mobileMenu = $(".mobile-menu");
    
    $window.resize(function(){
    
      if( $window.width() > 900) $mobileMenu.slideUp();
    
    })

    【讨论】:

    • jquery slideUp 在完成 100% 时使用 display:none,这只是将其隐藏在 css 中,查看他们的文档here
    • 你用过 SlideUp() 吗?这将在隐藏菜单之前折叠菜单。因此,与您的方法不同,缩小窗口时菜单不会再次显示。否决票是不公平的。
    • 我没有投反对票。如果您阅读了我的评论,它会说,jquery 网站“在完成 100% 时显示:无”也是如此。它不会立即设置它,那会使它崩溃。
    • 我认为我们彼此误解,实际上说的是同一件事。我没有说对我投了反对票,我不知道是谁投了票。这很不公平,但“有人”取消了它:)
    • 没有人取消它,我只是赞成这个答案,因为它是一个很好的答案。虽然当窗口调整到 900 像素以上时,它可能会不断重复上滑动画。在调用该代码之前,总是可以先检查 $(''.mobile-menu').css('display') == 'block'
    【解决方案3】:

    updated.非常粗暴的例子。调整大小

    ul{list-style-type:none;}
    
    @media screen and (min-width: 500px) {
      
      #big li{display:inline-block;width:100px;height:32px;border:1px solid red;}
      #small{display:none;}
      
      }
    
    @media screen and (max-width: 500px) {
      
      #big{display:none;}
      #small{display:block;}
      .smaller{display:none;}
      #small li:hover~ul{display:block}
      .smaller:hover{display:block;}
      
      }
    <ul id="big">
      <li>1</li>
       <li>1</li>
       <li>1</li>
       <li>1</li>
      </ul>
    <ul id="small">
      <li>home1</li>
            <ul class="smaller">
              <li>3</li>
              <li>3</li>
              <li>3</li>
              <li>3</li>
            </ul>
    
       <li>home2</li><ul class="smaller">
              <li>3</li>
              <li>3</li>
              <li>3</li>
              <li>3</li>
            </ul>
      </ul>

    【讨论】:

    • 这是一个简单的解决方案,但是一旦屏幕再次缩小,菜单就会显示为展开。这不会折叠菜单,它只是隐藏它
    • 我想避免使用调整大小,也不要使用这些媒体查询技巧。这是我希望它的行为方式:callmenick.com/lab-demos/10-simple-responsive-navigation 当移动导航完全展开时,一旦浏览器窗口展开,它就会自动向上滑动。
    • @Elgringorrible jquery slideup 将 display 属性设置为 none,我引用 Once the height reaches 0 (or, if set, to whatever the CSS min-height property is), the display style property is set to none to ensure that the element no longer affects the layout of the page. ,我只是做得更快。
    • @jack ,这可能是一个媒体查询。如果您没有使用 js 调整大小或媒体查询,我知道您无法让浏览器屏幕调整大小...
    • @Billy : 同意,但是用你的方法,如果你再次缩小页面,移动菜单会立即显示为扩展,因为你没有retract它,你只是隐藏它。@JackSparrow:首先,你已经在你自己的 CSS 中使用了媒体查询。其次,您为什么不想使用它们或 resize() ?没有很多其他方法......我同意比利
    猜你喜欢
    • 2020-03-17
    • 2022-01-21
    • 2016-05-20
    • 2023-03-23
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多