2015-11-09 8 views
6

ठीक है। यह काम करने में कोई भी समय नहीं लगेगा कि मैं यहां jQuery सीख रहा हूं और शायद इस बारे में सबसे अधिक कैक-हाथ तरीके से हो सकता है। यही कारण है कि मैं यद्यपि यहाँ हूँ।Jquery एकाधिक div टॉगल

मैं एक "पैनल" आधारित मेनू सिस्टम बना रहा हूं जो कई अलग-अलग फ़ंक्शंस (मेनू, फ़िल्टर, खोज, टोकरी और खाता) प्रदान करता है। मेरे पास 99% है जहां मैं बनना चाहता हूं। दरअसल यदि आप मेनू आइकन (उदाहरण के रूप में) पर क्लिक करते हैं तो आपको सटीक प्रभाव दिखाई देगा। इसे फिर से क्लिक करें और सबकुछ सही है।

मेरी समस्या तब होती है जब उपयोगकर्ता अपने प्रारंभिक "पैनल" के साथ दूसरे आइकन पर क्लिक करता है। अब आप मेरे ज्ञान में अंतराल देख सकते हैं।

कृपया ध्यान दें कि पैनल पैनल के लिए एक अलग div पर और प्रत्येक बार (मुख्य) पर एक ही div पर प्रभाव है। स्वाभाविक रूप से यह सबसे अच्छा होगा यदि 0:ए) पैनल को बंद किए बिना किसी नए आइकन पर क्लिक करते समय jQuery पिछले पैनल को बंद कर देता है, क्लोज-बीटीएन को हटा देता है, मुख्य को वापस स्लाइड करता है और फिर नया पैनल आग लगाता है। या बी) यह पिछले पैनल को बंद करता है, बंद-बीटीएन को हटा देता है लेकिन मुख्य खुला रहता है (मुझे लगता है कि यह जटिल हो रहा है)।

एचटीएमएल

<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> 

सीएसएस

#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

बहुत धन्यवाद, अग्रिम में, किसी भी संकेत दिए गए के लिए .... मेरे सिर में दर्द!

उत्तर

4

DEMO HERE

कई अनावश्यक code अपने प्रयास में, लेकिन अभी भी इस लक्ष्य को हासिल करने के लिए एक अच्छा प्रयास। तो इसे प्राप्त करने के लिए मेरे सुझाव नीचे दिए गए हैं।

सुझाव:

  • शामिल न करें कई jQuery(function इस रूप में $(document).ready समारोह के बराबर है और इसकी अच्छा है अगर आपके पास केवल एक ही प्रति js फ़ाइल
  • के लिए एक एकल आम घटना लिखें प्रत्येक क्लिक के लिए $(this) पर आधारित सभी बटन और अंतर

  • अपनी इसी panel-body

लक्षित करने के लिए अपने .toggle तत्व के लिए एक अतिरिक्त डेटा- * विशेषता जोड़ें, यहाँ data-target कहते हैं, तो नीचे दिए गए कुछ परिवर्तन मैं अपने कोड में किए गए हैं ..

एचटीएमएल

<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> 

जे एस

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

आप कितने अद्भुत इंसान हैं;) बहुत बहुत धन्यवाद। मैं दोपहर के भोजन के लिए बाहर निकलता हूं, वापस आ जाता हूं और आप मेरे सोमवार को हुए हैं। मुझे आशा है कि आपको एहसास होगा कि इसका मतलब क्या है :) –

+1

ओह, और आलोचना के लिए आपके सौम्य दृष्टिकोण के लिए "धन्यवाद" :) –

+0

मैं समझता हूं .. कभी भी .. हैप्पी कोडिंग .. :) और हाँ, अगर आप उत्तर दे सकते हैं और जवाब स्वीकार कर सकते हैं आपकी सहायता की.. ;) –

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>

आप वास्तव में कोड जो हो सकता है की एक बहुत कुछ कर रहे हैं एक लाइन में परिवर्तित प्रत्येक बटन पर एक click घटना को जोड़ने का इसके बजाय, कुछ इस तरह का प्रयास करें:

पहले, अपने बटन के लिए एक data-target विशेषता जोड़ने, कुछ की तरह:

<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> 

और अपने 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); 
     } 

    }); 
}); 
संबंधित मुद्दे