JSFiddle - React, Tailwind, and code Playground
by Andrew Bone
HTML
<nav>
<ul class="menu">
<li class="menu__item">
<a href="/" class="menu__link">About</a>
<ul class="submenu">
<li class="submenu__item">
<a class="submenu__link" href="/our-mission">Our Mission</a>
</li>
<li class="submenu__item">
<a class="submenu__link" href="/our-team">Our Team</a>
</li>
</ul>
</li>
<li class="menu__item">
<a href="/" class="menu__link">Contact us</a>
<ul class="submenu">
<li class="submenu__item">
<a class="submenu__link" href="/find-us">On the map</a>
</li>
<li class="submenu__item">
<a class="submenu__link" href="/contact">Send an email</a>
</li>
<li class="submenu__item">
<a class="submenu__link" href="/chat">Live chat</a>
</li>
</ul>
</li>
</ul>
</nav>
CSS
@import url(http://fonts.googleapis.com/css?family=Open+Sans);
body {
font-family: "Open Sans";
margin: 0;
}
nav {
line-height: 40px;
align-items: center;
height: 40px;
background: #333;
}
.menu {
margin: 0;
padding: 0;
list-style: none;
}
.menu * {
color: white;
text-decoration: none;
}
.menu__item {
position: relative;
display: inline-block;
padding: 0 5px;
}
.submenu {
position: absolute;
white-space: nowrap;
min-width: 100%;
padding: 0;
margin-left: -5px;
background: #333;
list-style: none;
opacity: 0;
pointer-events: none;
}
.submenu__item {
padding: 0 4px;
}
.menu__item:hover .submenu,
.menu__item:focus-within .submenu ,
.menu__item.focus-within .submenu {
opacity: 1;
pointer-events: auto;
}
.menu__item:hover,
.menu__item:focus-within,
.menu__item.focus-within,
.submenu__item:hover,
.submenu__item:focus-within{
background: rgba(255, 255, 255, 0.3)
}
JavaScript
(function(window, document){
'use strict';
var slice = [].slice;
var removeClass = function(elem){
elem.classList.remove('focus-within');
};
var update = (function(){
var running, last;
var action = function(){
var element = document.activeElement;
running = false;
if(last !== element){
last = element;
slice.call(document.getElementsByClassName('focus-within')).forEach(removeClass);
while(element && element.classList){
element.classList.add('focus-within');
element = element.parentNode;
}
}
};
return function(){
if(!running){
requestAnimationFrame(action);
running = true;
}
};
})();
document.addEventListener('focus', update, true);
document.addEventListener('blur', update, true);
update();
})(window, document);