【问题标题】:Mobile Menu Using CSS and jQuery使用 CSS 和 jQuery 的移动菜单
【发布时间】:2017-04-19 03:35:03
【问题描述】:

我正在尝试构建一个菜单,该菜单从右侧滑入子项目并允许用户在需要时返回。

当向左滑动元素起作用时,后退按钮不会删除该类,尽管如果 <li> 具有“后退”类,jQuery 会告诉它这样做。

我在这里的逻辑中是否遗漏了一些明显的东西?我还尝试将非后退元素设置为具有类,并将 jQuery 设置为仅在按下这些元素时运行,但仍然无效。

这是目前为止的代码:https://codepen.io/chops07876/pen/VbewZd

【问题讨论】:

    标签: jquery html css menu submenu


    【解决方案1】:

    您的点击事件正在冒泡并触发对父 li 的点击。使用stopPropagation() 来防止这种情况,并将点击事件限制为您点击的元素。 https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation

    $('li').on('click',function(e) {
      e.stopPropagation();
      if ($(this).hasClass('back')) {
        $(this).parent().parent().parent().removeClass('hide');
        
      } else {
        $(this).parent().addClass('hide');
      }
    });
    a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}body{line-height:1}blockquote,q{quotes:none}blockquote:after,blockquote:before,q:after,q:before{content:'';content:none}table{border-collapse:collapse;border-spacing:0}
    
    		body {
    			font-family: Arial, sans-serif;
    		}
    		
    		ul {
    			width: 100vw;
    			position: absolute;
    			background: #fff;
    			left: 0;
    			top: 0;
    			list-style: none;
    			-ms-transition: all .3s ease-in-out;
    			-webkit-transition: all .3s ease-in-out;
    		    -moz-transition: all .3s ease-in-out;
    		    -o-transition: all .3s ease-in-out;
    		    transition: all .3s ease-in-out;
    		}
    
    		ul.sub-menu {
    			left: 100vw;
    		}
    
    		ul.show {
    			left: 0;
    		}
    
    		ul.hide {
    			left: -100vw;
    		}
    
    		ul.sub-menu.hide {
    			left: 0;
    		}
    
    		ul li {
    			padding: 10px;
    			border-bottom: 1px solid #eee;
    			cursor: pointer;
    		}
    
    		ul li.back {
    			background: red;
    			color: #fff;
    		}
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <ul class="level-1">
    
      <li>Level One - Item One
    
        <ul class="sub-menu level-2">
    
          <li class="back">Back</li>
    
          <li>Level Two - Item One
    
            <ul class="sub-menu level-3">
    
              <li class="back">Back</li>
    
              <li>Level Three - Item One
    
                <ul class="sub-menu level-4">
    
                  <li class="back">Back</li>
    
                  <li>Level Four - Item One
    
                    <ul class="sub-menu level-5">
    
                      <li class="back">Back</li>
    
                      <li>Level Five - Item One</li>
                      <li>Level Five - Item Two</li>
                      <li>Level Five - Item Three</li>
    
                    </ul>
    
                  </li>
                  <li>Level Four - Item Two</li>
                  <li>Level Four - Item Three</li>
    
                </ul>
    
              </li>
              <li>Level Three - Item Two</li>
              <li>Level Three - Item Three</li>
    
            </ul>
    
          </li>
          <li>Level Two - Item Two</li>
          <li>Level Two - Item Three</li>
    
        </ul>
    
      </li>
      <li>Level One - Item Two</li>
      <li>Level One - Item Three</li>
    
    </ul>

    【讨论】:

    • @user1235285 不客气。我很好奇你为什么选择别人的答案而不是我的答案——我们回答了同样的问题,他们在我回答后 5 分钟回答了。你介意告诉我吗?
    • @user1235285 哦,谢谢!当您选择正确的答案时,它确实对社区有所帮助:)
    【解决方案2】:

    event.stopPropagation() 添加到li 的点击

    $('li').click(function() {
     event.stopPropagation();
     if ($(this).hasClass('back')) {
       $(this).parent().parent().parent().removeClass('hide');
     } else {
       $(this).parent().addClass('hide');
     }
    });
    

    我建议使用closest() 而不是parent().parent().parent()

     $(this).closest('.level-1').removeClass('hide');
    

    【讨论】:

    • 太好了,感谢这位丹。使用 .closet() 注释,我需要它来动态操作,因为有多个级别的子菜单。有没有更清洁的方法来做到这一点?
    • 你需要稍微修改一下你的 HTML 结构。
    • 在什么意义上?子菜单必须位于 li 内,但当然可以更改类。你能解释一下你的意思吗?
    • 添加一个通用类到你要添加隐藏类到ie的ul级别。具有子菜单的级别并调用closest() 到该类。因此,无论单击的 li 有多深,直接父菜单都会关闭。
    • 不接受我的回答,即使我提供了更多......嗯@user1235285
    猜你喜欢
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 2013-05-27
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多