<header>
<nav role="navigation" aria-label="Main">
<button class="nav__toggle" aria-expanded="false" aria-controls="nav__list">Menu</button>
<ul id="nav__list" class="nav__list" hidden>
<li class="nav__list-item">
<a href="#" class="nav__list-link">Link 1</a>
</li>
<li class="nav__list-item">
<a href="#" class="nav__list-link">Link 2</a>
</li>
<li class="nav__list-item">
<a href="#" class="nav__list-link">Link 3</a>
</li>
<li class="nav__list-item">
<a href="#" class="nav__list-link">Link 4</a>
</li>
</ul>
</nav>
</header>
[hidden] {
display: none;
}
// Focus styles for keyboard users
:focus {
outline: 2px solid red;
}
:focus:not(:focus-visible),
:focus:not(:focusring) {
outline: 0;
}
:focus-visible,
:focusring {
outline: 2px solid red;
}
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:wght@400;700&display=swap');
body {
min-height: 100vh;
font-family: "Open Sans", Arial, Helvetica, sans-serif;
background-color: #FFFFFF;
padding: 1em;
}
.nav__toggle {
font-size: 1.3rem;
padding: 0.4em 1.3em;
border: 0;
cursor: pointer;
background-color: hsl(169, 90%, 30%);
color: #FFFFFF;
font-weight: 700;
transition: all 200ms ease-in-out;
&:hover {
background-color: hsl(169, 90%, 45%);
}
}
.nav__list {
font-size: 1em;
background-color: hsl(169, 90%, 13%);
padding: 0;
max-width: 20ch;
padding: 0;
margin: 5px 0 0;
.nav__list-item {
list-style-type: none;
.nav__list-link {
display: block;
color: #FFFFFF;
text-decoration: none;
padding: 0.5em 1em;
background-color: hsl(169, 90%, 13%);
&:hover {
background-color: hsl(169, 90%, 30%);
transition: all 200ms ease-in-out;
}
}
}
}
View Compiled
const navToggle = document.querySelector('.nav__toggle');
const navList = document.querySelector('.nav__list');
const navLinks = document.querySelectorAll('.nav__list-link');
navToggle.addEventListener('click', function () {
if (navList.hasAttribute('hidden')) {
this.setAttribute('aria-expanded', 'true');
navList.removeAttribute('hidden');
// Set focus on first link
// will be highlighted for keyboard users
navLinks[0].focus();
} else {
navList.setAttribute('hidden', 'true');
this.setAttribute('aria-expanded', 'false');
}
});
document.addEventListener('keydown', (event) => {
// Ignore IME composition
if (event.isComposing || event.keyCode === 229) {
return;
}
// Close menu with ESC key
if (event.keyCode === 27) {
if (!navList.hasAttribute('hidden')) {
navToggle.setAttribute('aria-expanded', 'false');
navList.setAttribute('hidden', 'true');
}
}
});
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.