2017-06-03 6 views
0

このサイトのようなドロップダウンメニューを作りたいと思います。私は3つのことが起こるようにしたい。stackoverflowのように複数のドロップダウンを作成する

  1. クリックするとドロップダウンが表示されます。
  2. 一度に1つのドロップダウンのみを表示するので、別のドロップダウンリンクをクリックすると、表示されているドロップダウンが削除され、クリックしたドロップダウンが追加されます。
  3. 同じドロップダウンリンクをクリックしたとき、またはドロップダウンの外側をクリックしたときに表示されるドロップダウンを削除します。

私はプラグインが必要かどうか、またはあなた自身のコードを書くことでこれを作成するのが最善の方法であるかどうかはわかりません。
ここに私のコードがあり、それはうまくいきますが、唯一の問題は、同じドロップダウンリンクをクリックしたときに表示されるドロップダウンを削除しないことです。

\t $('a#menu1').click(function() { 
 
    \t $("div#1").show(); 
 
    }); 
 
    $('a#menu2').click(function() { 
 
    \t $("div#2").show(); 
 
    }); 
 
    $('a#menu3').click(function() { 
 
    \t $("div#3").show(); 
 
    }); 
 

 
$(document).mouseup(function (e) 
 
{ 
 
    var container = new Array(); 
 
    container.push($('.display_menu1')); 
 
    container.push($('.display_menu2')); 
 
    container.push($('.display_menu3')); 
 
    
 
    $.each(container, function(key, value) { 
 
     if (!$(value).is(e.target) // if the target of the click isn't the container... 
 
      && $(value).has(e.target).length === 0) // ... nor a descendant of the container 
 
     { 
 
      $(value).hide(); 
 
     } 
 
    }); 
 
});
div.body { 
 
    background-color: white; 
 
    width: 100%; 
 
    height: 400px; 
 
    border: 1px solid grey; 
 
} 
 

 
div.display_menu1 { 
 
    display: none; 
 
} 
 

 
div.display_menu2 { 
 
    display: none; 
 
} 
 

 
div.display_menu3 { 
 
    display: none; 
 
} 
 

 
ul { 
 
    margin: 0 0 30px 0; 
 
    padding: 0px; 
 
} 
 

 
li { 
 
    display: inline-block; 
 
} 
 

 
a.display { 
 
    display: inline-block; 
 
    background-color: lightblue; 
 
    padding: 10px 20px; 
 
    text-decoration: none; 
 
} 
 

 
div.display { 
 
    background-color: grey; 
 
    width: 200px; 
 
    height: 100px; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<body> 
 
<div class="body"> 
 
    <ul> 
 
    <li> 
 
     <a href="#" method="POST" id='menu1' class="number">Menu 1</a> 
 
    </li> 
 
    <li> 
 
     <a href="#" method="POST" id='menu2' class="number">Menu 2</a> 
 
    </li> 
 
    <li> 
 
     <a href="#" method="POST" id='menu3' class="number">Menu 3</a> 
 
    </li> 
 
    </ul> 
 
    <div id="1" class="display display_menu1"> 
 
    This is dropdown-menu 1! 
 
    </div> 
 
    <div id="2" class="display display_menu2"> 
 
    This is dropdown-menu 2! 
 
    </div> 
 
    <div id="3" class="display display_menu3"> 
 
    This is dropdown-menu 3! 
 
    </div> 
 

 
</div> 
 
</body>

+0

クリック機能の内側で、divのstyle.displayプロパティを確認します。 "none"の場合はshow()を呼び出し、それ以外の場合はhide()を呼び出します – Lalit

+0

$( "div#1")の代わりに$( "div#1")toggle()を使用できます。 – Lalit

+0

答えをありがとう、しかし私はまだそれを動作させるために管理していません。これはトグルを追加するときに起こったことです。 https://jsfiddle.net/4wc54rq5/ – Night83

答えて

1

良いことは、私はdata属性を使用しています私の次の例のように、...ではないIDを持つクラスで動作し、すべてのdivのために同じクラスを使用することです

$('a[data-menu]').click(function() { 
 
    var menu_num = $(this).data('menu'); // get the href data-menu attribute to get the div id from it 
 
    $('.display_menu').not($('#'+menu_num)).hide(0); // hide all the divs but not the open one 
 
    $('#'+menu_num).slideToggle(100); // toggle the div its already shown .. this slideToggle will show/hide it by clicking the <a> 
 
    $('li').not($(this).closest('li')).removeClass('active'); 
 
    $(this).closest('li').toggleClass('active'); 
 
}); 
 

 
$(document).on('click',function (e) 
 
{ 
 
// no need here for using array and .each() 
 
    if (!$('a[data-menu] , .display_menu').is(e.target) // if the target of the click isn't the container... 
 
     && $('a[data-menu] , .display_menu').has(e.target).length === 0) // ... nor a descendant of the container 
 
    { 
 
     $('.display_menu').hide(0); 
 
     $('li').removeClass('active'); 
 
    } 
 
});
div.body { 
 
    background-color: white; 
 
    width: 100%; 
 
    height: 400px; 
 
    border: 1px solid grey; 
 
} 
 

 
div.display_menu { 
 
    display: none; 
 
} 
 

 

 
ul { 
 
    margin: 0 0 30px 0; 
 
    padding: 0px; 
 
} 
 

 
li { 
 
    display: inline-block; 
 
} 
 

 
a.display { 
 
    display: inline-block; 
 
    background-color: lightblue; 
 
    padding: 10px 20px; 
 
    text-decoration: none; 
 
} 
 

 
div.display { 
 
    background-color: grey; 
 
    width: 200px; 
 
    height: 100px; 
 
} 
 

 
.active{ 
 
    background : red; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<body> 
 
<div class="body"> 
 
    <ul> 
 
    <li> 
 
     <a href="#" method="POST" id='menu1' class="number" data-menu="1">Menu 1</a> 
 
    </li> 
 
    <li> 
 
     <a href="#" method="POST" id='menu2' class="number" data-menu="2">Menu 2</a> 
 
    </li> 
 
    <li> 
 
     <a href="#" method="POST" id='menu3' class="number" data-menu="3">Menu 3</a> 
 
    </li> 
 
    </ul> 
 
    <div id="1" class="display display_menu"> 
 
    This is dropdown-menu 1! 
 
    </div> 
 
    <div id="2" class="display display_menu"> 
 
    This is dropdown-menu 2! 
 
    </div> 
 
    <div id="3" class="display display_menu"> 
 
    This is dropdown-menu 3! 
 
    </div> 
 

 
</div> 
 
</body>

+0

ありがとう!よく働く! – Night83

+1

@ Night83よろしくお願いします..素晴らしい一日:-) –

+0

ドロップダウンが表示されているにもかかわらず、ドロップダウンリスト項目に背景色を追加しようとしていますが、それを機能させることはできません。あなたもこれをやる方法を知っていますか? – Night83

関連する問題