2017-04-19 5 views
1

오른쪽에서 하위 항목을 이동하는 메뉴를 작성하려고합니다. 사용자가 필요하면 다시 이동할 수 있습니다.모바일 메뉴 CSS 및 jQuery 사용

슬라이드 왼쪽 요소가 작동하는 동안 <li> 클래스가 "뒤로"인 경우 jQuery가이를 알리지 만 뒤로 버튼은 클래스를 제거하지 않습니다.

여기 논리에서 확실하지 않은 것이 있습니까? 또한 non-back 요소를 설정하여 클래스를 만들고 jQuery 만 눌러도 실행되도록 설정했지만 여전히 작동하지 않았습니다.

여기에 지금까지 코드의 펜입니다 : https://codepen.io/chops07876/pen/VbewZd

답변

1

귀하의 클릭 이벤트가 버블 링 및 부모 리튬에 대한 클릭을 유발한다. 이를 방지하고 클릭 이벤트를 클릭 한 요소로만 제한하려면 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} 
 

 
\t \t body { 
 
\t \t \t font-family: Arial, sans-serif; 
 
\t \t } 
 
\t \t 
 
\t \t ul { 
 
\t \t \t width: 100vw; 
 
\t \t \t position: absolute; 
 
\t \t \t background: #fff; 
 
\t \t \t left: 0; 
 
\t \t \t top: 0; 
 
\t \t \t list-style: none; 
 
\t \t \t -ms-transition: all .3s ease-in-out; 
 
\t \t \t -webkit-transition: all .3s ease-in-out; 
 
\t \t  -moz-transition: all .3s ease-in-out; 
 
\t \t  -o-transition: all .3s ease-in-out; 
 
\t \t  transition: all .3s ease-in-out; 
 
\t \t } 
 

 
\t \t ul.sub-menu { 
 
\t \t \t left: 100vw; 
 
\t \t } 
 

 
\t \t ul.show { 
 
\t \t \t left: 0; 
 
\t \t } 
 

 
\t \t ul.hide { 
 
\t \t \t left: -100vw; 
 
\t \t } 
 

 
\t \t ul.sub-menu.hide { 
 
\t \t \t left: 0; 
 
\t \t } 
 

 
\t \t ul li { 
 
\t \t \t padding: 10px; 
 
\t \t \t border-bottom: 1px solid #eee; 
 
\t \t \t cursor: pointer; 
 
\t \t } 
 

 
\t \t ul li.back { 
 
\t \t \t background: red; 
 
\t \t \t color: #fff; 
 
\t \t }
<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>

+0

parent().parent().parent()의 감사를 사용하는 것이 좋습니다 것

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

을 클릭 lievent.stopPropagation() 추가 마이클. – user1235285

+0

@ user1235285 여러분을 환영합니다. 내가 왜 다른 사람의 대답을 선택했는지 궁금합니다. 우리는 똑같은 대답을했고, 5 분 후에 답했습니다. 나 한테 말해 줄 수있어? –

+0

죄송합니다! 나는 시대를 잘못 읽었습니다 ... – user1235285

1

'가의 내가 closest() 대신

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

Dan에게 감사드립니다. .closet() 주석을 사용하면 여러 수준의 하위 메뉴가 있으므로 동적으로 작동해야합니다. 이 작업을 수행하는 더 깨끗한 방법이 있습니까? – user1235285

+0

HTML 구조를 약간 수정해야합니다. 어떤 의미에서 –

+0

? 부 메뉴는 리에 앉아 있어야하지만 클래스는 물론 바꿀 수 있습니다. 무슨 뜻인지 설명해 주시겠습니까? – user1235285