2015-11-09 19 views
6

OK. Nie trzeba długo czekać, aby się nauczyć, że uczę się tutaj jQuery i mogłem to zrobić w możliwie najskryśniejszy sposób. Dlatego jestem tutaj.Jquery wielokrotny div przełącz

Tworzyłem system oparty na "panelu", który zapewnia wiele różnych funkcji (menu, filtr, wyszukiwanie, koszyk i konto). Mam 99% tam, gdzie chcę być. Rzeczywiście, jeśli klikniesz ikonę menu (jako przykład), zobaczysz dokładny efekt. Kliknij ponownie i wszystko jest idealne.

Mój problem pojawia się, gdy użytkownik kliknie inną ikonę z otwartym początkowym "panelem". Teraz możesz zobaczyć luki w mojej wiedzy.

Należy zwrócić uwagę, że efekt dotyczy innego elementu div dla panelu i tego samego div za każdym razem (main). Oczywiście najlepiej by było, gdyby: a) po kliknięciu na nową ikonę bez zamykania panelu jQuery zamyka poprzedni panel, usuwa close-btn, ślizga się z powrotem do głównej, a następnie otwiera ogień do nowego panelu. lub b) zamyka poprzedni panel, usuwa close-btn, ale utrzymuje główny otwarty (myślę, że to już komplikuje).

HTML

<div id="mainpanel"> 
<div class="menunav"> 
    <div class="toggle menu-btn"></div> 
    <div class="toggle filter-btn"></div> 
    <div class="toggle search-btn"></div> 
    <div class="toggle basket-btn"></div> 
    <div class="toggle account-btn"></div> 
</div> 
</div> 
<div class="togglepanel mainmenu"> 
menu here 
</div> 
<div class="togglepanel filter"> 
filter here 
</div> 
<div class="togglepanel search"> 
search here 
</div> 
<div class="togglepanel basket"> 
basket here 
</div> 
<div class="togglepanel account"> 
account here 
</div> 
<main> 
content will be here 
</main> 

CSS

#mainpanel { 
position: fixed; 
display: table; 
top: 0; 
left: 0; 
width: 125px; 
height: 100%; 
background: #206ba4; 
vertical-align: middle; 
z-index: 9999;} 

main { 
position: relative; 
top: 0; 
margin-left: 125px; 
transform: translateX(0); 
transform: translateY(0); 
transition: transform .5s;} 

.move { 
transform: translateX(300px) !important;} 

.menunav { 
display: table-cell; 
color: #fff; 
z-index: 1001; 
margin: 20px 0 0; 
text-align: center; 
vertical-align: middle;} 

.menunav div { 
display: block; 
width: 100%; 
margin: 0 0 30px; 
text-align: center;} 

.menu-btn:after, .filter-btn:after, .search-btn:after, .basket-btn:after, .account-btn:after, .close-btn:after { 
font-family: FontAwesome; 
content: "menu"; 
font-size: 1.8em; 
font-weight: 200; 
color: #fff; 
display: block; 
height: 1em; 
width: 1em; 
margin: 0 0 0 30%; 
cursor: pointer;} 

.filter-btn:after { 
content: "filter";} 

.search-btn:after { 
content: "search";} 

.basket-btn:after { 
content: "basket";} 

.account-btn:after { 
content: "account";} 

.close-btn:after { 
content: "close";} 

.mainmenu, .filter, .search, .basket, .account { 
position: fixed; 
width: 300px; 
top: 0; 
left: 125px; 
height: 100%; 
background: #54a4de; 
transform: translateX(-100%); 
transition: transform .5s; 
z-index: -1;} 

.expand { 
transform: translateX(0px);} 

jQuery

jQuery(function($){ 
    $('.menu-btn').click(function(){ 
    $('.mainmenu').toggleClass('expand') 
    $('main').toggleClass('move') 
    $('.menu-btn').toggleClass('close-btn') 
    }) 
}) 
jQuery(function($){ 
    $('.filter-btn').click(function(){ 
    $('.filter').toggleClass('expand') 
    $('main').toggleClass('move') 
    $('.filter-btn').toggleClass('close-btn') 
    }) 
}) 
jQuery(function($){ 
    $('.search-btn').click(function(){ 
    $('.search').toggleClass('expand') 
    $('main').toggleClass('move') 
    $('.search-btn').toggleClass('close-btn') 
}) 
}) 
jQuery(function($){ 
    $('.basket-btn').click(function(){ 
    $('.basket').toggleClass('expand') 
    $('main').toggleClass('move') 
    $('.basket-btn').toggleClass('close-btn') 
    }) 
}) 
jQuery(function($){ 
    $('.account-btn').click(function(){ 
    $('.account').toggleClass('expand') 
    $('main').toggleClass('move') 
    $('.account-btn').toggleClass('close-btn') 
    }) 
}) 

Here is the jsfiddle

Dziękujemy, z góry za wszelkie wskazówki .... moja głowa boli!

Odpowiedz

4

DEMO HERE

Wielu zwolnionych code w próbie, ale wciąż dobry próba osiągnięcia tego celu. Poniżej znajdują się moje sugestie, aby to osiągnąć.

Porady:

  • Nie zawierają wielokrotność jQuery(function jak to jest równoważne $(document).ready funkcji i jego dobre, jeśli masz tylko jeden za js plik
  • Napisz jeden wspólny zdarzenie wszystkie przyciski i rozróżniać na podstawie $(this) dla każdego kliknięcia, które się stanie

  • dodać dodatkowy DATA- * atrybut do elementu .toggle, tutaj powiedzieć data-target, aby kierować jej odpowiednia panel-body

więc poniżej kilka zmian zrobiłem do kodu ..

HTML

<div class="menunav"> 
    <!--data-target to each of its corresponding body class--> 
    <div class="toggle menu-btn" data-target=".mainmenu"></div> 
    <div class="toggle filter-btn" data-target=".filter"></div> 
    <div class="toggle search-btn" data-target=".search"></div> 
    <div class="toggle basket-btn" data-target=".basket"></div> 
    <div class="toggle account-btn" data-target=".account"></div> 
</div> 

JS

jQuery(function($){ 
    //click event to one common class i.e toggle 
    $('.toggle').click(function(){ 
     var target=$(this).data('target'); //get the clicked element's target property 
     $('.togglepanel').not($(target)).removeClass('expand'); 
     //remove class from all the togglepanel elements except the current element's target 
     $('.toggle').removeClass('close-btn'); 
     //general action in any scenario to remove close-btn 
     if($(target).hasClass('expand')) 
     { 
      //if target has expand class then remove it and do necessary changes 
      $(target).removeClass('expand') 
      $('main').removeClass('move') 
      $(this).removeClass('close-btn') 
     } 
     else 
     { 
      //else add necessary classes 
      $(target).addClass('expand') 
      $('main').addClass('move') 
      $(this).addClass('close-btn') 
     } 
    }) 
}) 
+1

Cóż za wspaniały człowiek;) Dziękuję bardzo. Wyskakuję na lunch, wracam, a ty w poniedziałek. Mam nadzieję, że zdajesz sobie sprawę, co to oznacza :) –

+1

Aha, i "Dziękuję" za twoje łagodne podejście do krytyki :) –

+0

Rozumiem .. W każdej chwili .. Szczęśliwe kodowanie .. :) i tak możesz przegłosować i zaakceptować odpowiedź jeśli to pomógł ci ..;) –

3

jQuery(function($){ 
 
     $(document).on('click', '.toggle', function(){ 
 
      
 
      // to close all open contents 
 
      $('.togglepanel').removeClass('expand'); 
 
      $('main').removeClass('move'); 
 
      
 
      var target = $(this).data("target"); 
 
      
 
      if($(this).hasClass('close-btn')){ 
 
       $('.toggle').toggleClass('close-btn', false); 
 
       console.log('has close'); 
 
       $('main').toggleClass('move', false) 
 
       $(target).toggleClass('expand', false); 
 
      }else{ 
 
       $('.toggle').toggleClass('close-btn', false); 
 
       $(this).toggleClass('close-btn', true); 
 
       $('main').toggleClass('move', true) 
 
       $(target).toggleClass('expand', true); 
 
       console.log('no close'); 
 
      } 
 
      
 
     }); 
 
    
 
\t })
#mainpanel { 
 
\t position: fixed; 
 
\t display: table; 
 
\t top: 0; 
 
\t left: 0; 
 
\t width: 125px; 
 
\t height: 100%; 
 
\t background: #206ba4; 
 
\t vertical-align: middle; 
 
\t z-index: 9999; 
 
} 
 

 
main { 
 
    position: relative; 
 
\t top: 0; 
 
\t margin-left: 125px; 
 
\t transform: translateX(0); 
 
\t transform: translateY(0); 
 
\t transition: transform .5s; 
 
} 
 

 
.move { 
 
\t transform: translateX(300px) !important; 
 
} 
 

 
.menunav { 
 
\t display: table-cell; 
 
\t color: #fff; 
 
\t z-index: 1001; 
 
\t margin: 20px 0 0; 
 
\t text-align: center; 
 
\t vertical-align: middle; 
 
} 
 

 
.menunav div { 
 
\t display: block; 
 
\t width: 100%; 
 
\t margin: 0 0 30px; 
 
\t text-align: center; 
 
} 
 

 
.menu-btn:after, .filter-btn:after, .search-btn:after, .basket-btn:after, .account-btn:after, .close-btn:after { 
 
\t font-family: FontAwesome; 
 
\t content: "menu"; 
 
\t font-size: 1.8em; 
 
\t font-weight: 200; 
 
\t color: #fff; 
 
\t display: block; 
 
\t height: 1em; 
 
\t width: 1em; 
 
\t margin: 0 0 0 30%; 
 
\t cursor: pointer; 
 
} 
 

 
.filter-btn:after { 
 
\t content: "filter"; 
 
} 
 

 
.search-btn:after { 
 
\t content: "search"; 
 
} 
 

 
.basket-btn:after { 
 
\t content: "basket"; 
 
} 
 

 
.account-btn:after { 
 
\t content: "account"; 
 
} 
 

 
.close-btn:after { 
 
    content: "close"; 
 
} 
 
} 
 

 
.close-btn:after { 
 
\t content: "\f00d"; 
 
} 
 

 
.mainmenu, .filter, .search, .basket, .account { 
 
\t position: fixed; 
 
\t width: 300px; 
 
\t top: 0; 
 
\t left: 125px; 
 
\t height: 100%; 
 
\t background: #54a4de; 
 
\t transform: translateX(-100%); 
 
\t transition: transform .5s; 
 
\t z-index: -1; 
 
} 
 

 
.expand { 
 
\t transform: translateX(0px); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="mainpanel"> 
 
    <div class="menunav"> 
 
     <div class="toggle menu-btn" data-target=".mainmenu"></div> 
 
     <div class="toggle filter-btn" data-target=".filter"></div> 
 
     <div class="toggle search-btn" data-target=".search"></div> 
 
     <div class="toggle basket-btn" data-target=".basket"></div> 
 
     <div class="toggle account-btn" data-target=".account"></div> 
 
    </div> 
 
</div> 
 
<div class="togglepanel mainmenu"> 
 
    menu here 
 
</div> 
 
<div class="togglepanel filter"> 
 
    filter here 
 
</div> 
 
<div class="togglepanel search"> 
 
    search here 
 
</div> 
 
<div class="togglepanel basket"> 
 
    basket here 
 
</div> 
 
<div class="togglepanel account"> 
 
    account here 
 
</div> 
 
<main> 
 
    content will be here 
 
</main>

jesteś rzeczywiście robi wiele kodów, które mogą być przekonwertowany do pojedynczej linii. Zamiast dodawania zdarzenia click na każdy guziki, spróbuj coś takiego:

pierwsze, dodać atrybut data-target do przycisków, coś jak:

<div class="toggle menu-btn" data-target=".mainmenu"></div> 
<div class="toggle filter-btn" data-target=".filter"></div> 
<div class="toggle search-btn" data-target=".search"></div> 
<div class="toggle basket-btn" data-target=".basket"></div> 
<div class="toggle account-btn" data-target=".account"></div> 

I na jQuery:

jQuery(function($){ 
    $(document).on('click', '.toggle', function(){ 

     // to close all open contents 
     $('.togglepanel').removeClass('expand'); 
     $('main').removeClass('move'); 

     var target = $(this).data("target"); 

     if($(this).hasClass('close-btn')){ 
      $('.toggle').toggleClass('close-btn', false); 
      $('main').toggleClass('move', false) 
      $(target).toggleClass('expand', false); 
     }else{ 
      $('.toggle').toggleClass('close-btn', false); 
      $(this).toggleClass('close-btn', true); 
      $('main').toggleClass('move', true) 
      $(target).toggleClass('expand', true); 
     } 

    }); 
});