CSS Vertical Navbar
A vertical navigation bar stacks its links in a column, a common pattern for sidebars and dashboards.
Navigation bars almost always start life as an unordered list of links. To turn that list into a vertical menu, you strip away the default list styling and give the links block-level styling so the whole row is clickable.
Removing the list styling
Reset the list
<!DOCTYPE html>
<html>
<head>
<style>
.sidebar ul {
list-style-type: none;
margin: 0;
padding: 0;
}
</style>
</head>
<body>
<div class="sidebar">
<ul>
<li>Home</li>
<li>About</li>
<li>Contact</li>
</ul>
</div>
</body>
</html>Removing the bullets, margin, and padding gives you a clean column of links to build on. Each list item still stacks vertically, which is exactly what a vertical navbar needs.
Making the links full-width blocks
Block-level links
<!DOCTYPE html>
<html>
<head>
<style>
.sidebar a {
display: block;
padding: 12px 16px;
color: #fff;
background: #00643c;
text-decoration: none;
}
</style>
</head>
<body>
<div class="sidebar">
<a href="#">Home</a>
<a href="#">About</a>
<a href="#">Contact</a>
</div>
</body>
</html>Note: Setting the links to display: block makes the entire area, not just the text, respond to clicks and hover, which is easier for users to hit.
Adding a hover and active state
Hover and current page
<!DOCTYPE html>
<html>
<head>
<style>
.sidebar a {
display: block;
padding: 12px 16px;
color: #fff;
background: #00643c;
text-decoration: none;
}
.sidebar a:hover {
background: #00502f;
}
.sidebar a.active {
background: #003d24;
}
</style>
</head>
<body>
<div class="sidebar">
<a href="#" class="active">Home</a>
<a href="#">About</a>
<a href="#">Contact</a>
</div>
</body>
</html>- Start from a semantic <nav> with a <ul> of links for accessibility
- Reset list-style, margin, and padding to remove default bullets and spacing
- Use display: block so each link fills the sidebar width
- Add :hover and an active class to show state, drawing on pseudo-classes