JSFiddle - React, Tailwind, and code Playground
by Jordan Sayner
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">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>
<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">About</a>
<ul class="submenu">
<li class="submenu__item">
<a class="submenu__link" href="/our-mission">Our Mission</a>
</li>
</ul>
</li>
</ul>
</nav>
CSS
.submenu {
position: absolute;
left: 0;
padding: 0;
list-style: none;
height: 1px;
width: 1px;
overflow: hidden;
clip: rect(1px 1px 1px 1px); /* IE6, IE7 */
clip: rect(1px, 1px, 1px, 1px);
}
.menu__item:hover .submenu,
.menu__item:focus-within .submenu,
.menu__item.focus .submenu {
padding: 0.5rem 0;
width: 9rem;
height: auto;
background: #eedbff;
clip: auto;
}
JavaScript
try {
document.querySelector(':focus-within');
} catch (err) {
console.log("focus-within is not available, using polyfill");
focusWithinFallback(topLevelLinks);
}
function focusWithinFallback(array) {
topLevelLinks.forEach(link => {
if (link.nextElementSibling) {
link.addEventListener('focus', function() {
this.parentElement.classList.add('focus');
});
const subMenu = link.nextElementSibling;
const subMenuLinks = subMenu.querySelectorAll('a');
const lastLinkIndex = subMenuLinks.length - 1;
const lastLink = subMenuLinks[lastLinkIndex];
lastLink.addEventListener('blur', function() {
link.parentElement.classList.remove('focus');
});
}
});
}