JSFiddle - React, Tailwind, and code Playground
HTML
<div class="container">
<a href="#" class="toggle">Open sesame</a>
<ul class="menu" tabindex="0">
<li><a href="#">Some option</a></li>
<li><a href="#">Option with longer text</a></li>
</ul>
</div>
<div class="container">
<a href="#" class="toggle">Open sesame</a>
<ul class="menu" tabindex="0">
<li><a href="#">Some option</a></li>
<li><a href="#">Option with longer text</a></li>
</ul>
</div>
<div class="container">
<a href="#" class="toggle">Open sesame</a>
<ul class="menu" tabindex="0">
<li><a href="#">Some option</a></li>
<li><a href="#">Option with longer text</a></li>
</ul>
</div>
<div id="console"></div>
CSS
body { font: 10pt/125% Sans-Serif; padding: 1em; }
a { text-decoration: none; color: #00c; }
#console { float:right; font-size: 8pt; line-height: 1em; }
.container {
float: left;
margin-right: 5px;
}
.toggle {
display: block;
line-height: 25px;
border: 1px solid #ccc;
outline: none;
padding: .25em 1em;
background: #eee;
border-radius: 5px;
}
.toggle:hover {
background: #ddd;
}
.toggle:after {
content: "";
display: inline-block;
margin: 0 -3px 2px 5px;
border-width: 5px 5px 0 5px;
border-style: solid;
border-color: #999 transparent;
}
.menu {
display: none;
position: absolute;
background: #eee;
margin: 1px 0 0;
border: 1px solid #ccc;
outline: 0 none;
padding: 3px 0;
border-radius: 5px;
list-style: none;
box-shadow: 0px 1px 5px #ddd;
}
.menu li a {
padding: .5em 1em;
display: block;
}
.menu li a:hover {
background: #ddd;
}
.open .menu {
display: block;
}
.open .toggle:after {
border-width: 0 5px 5px 5px;
}
JavaScript
var con = $("#console");
var log = function(text) {
con.append("<div>" + text + "</div>");
}
$(".menu li *").click(function(evt) {
evt.preventDefault();
log("menu click");
});
$(".toggle").click(function(evt){
evt.preventDefault();
log("toggle menu")
var c = $(this).closest(".container").toggleClass("open");
c.hasClass("open") && c.find(".menu")[0].focus();
});
$(document).click(function(e){
var $tgt=$(e.target)
if( !$tgt.closest('.container').length){
log('non menu el clicked')
}else{
$tgt.closest('.container').siblings().removeClass('open')
}
})