Responsive Navigation Menu Using Only CSS
Responsive Navigation Menu Using Only CSS
http://medialoot.com/blog/how-to-create-a-responsive-navigation-menu-using-only-css/
In this tutorial we will be creating a basic responsive navigation menu with dropdown using only HTML
and CSS. Many navigation menus (especially responsive ones) are created using a combination of
HTML, CSS and Javascript. This simple CSS only method will demonstrate that Javascript isn't always
necessary!
The code we will create includes only the most essential CSS required for structure and basic styling.
This makes it much easier to follow and understand the purpose of each line of code. It also means that
the end product is primed and ready for your unique customization.
The only content within the body tags is a nested unordered list. To demonstrate which top level links will
have dropdowns, I have included a unicode down arrow (↓) i.e. ↓
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS Only Navigation Menu</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="style.css">
</head>
<body>
<ul id="menu">
<li><a href="#">Home</a></li>
<li><a href="#">About ↓ </a>
<ul class="hidden">
<li><a href="#">Who We Are</a></li>
<li><a href="#">What We Do</a></li>
</ul>
</li>
<li>
<a href="#">Portfolio ↓</a>
<ul class="hidden">
<li><a href="#">Photography</a></li>
<li><a href="#">Web & User Interface Design</a></li>
<li><a href="#">Illustration</a></li>
</ul>
</li>
<li><a href="#">News</a></li>
<li><a href="#">Contact</a></li>
</ul>
</body>
</html>
1
First of all, some basic styling to the ul and li elements to remove bullet points and other list styles. The
inline-block and float:left attributes make the list display horizontally.
ul {list-style-type:none;
margin:0;
padding:0;
position: absolute;
}
li { display:inline-block;
float: left;
margin-right: 1px;
}
The following attributes are almost exclusively for aesthetic appeal. If you intend to style this menu to your
liking then this is the section of code to fiddle about with.
li a {display:block;
min-width:140px;
height: 50px;
text-align: center;
line-height: 50px;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
color: #fff;
background: #2f3036;
text-decoration: none;
}
li:hover a {
background: #19c589;
}
2
/*Style for dropdown links*/
li:hover ul a {
background: #f3f3f3;
color: #2f3036;
height: 40px;
line-height: 40px;
}
Next up, some styling for the dropdown links. The first class defines that the dropdown will not be visible
by default. And the final class says that the dropdown element will become visible on top level link hover
li ul {
display: none;
}
li ul li a {width: auto;
min-width: 100px;
padding: 0 20px;
}
display: block;
3
The navigation menu is ready for desktop use now, however we should also include some love for mobile
users. Using a media query I target devices with a max width of 760px and make a few changes to the
code.
/*Responsive Styles*/
Space is limited on mobile devices, so it would be cool if we also had a button prompting mobile users to
click a button before displaying the whole menu. To do this a couple of lines of code to the HTML where
you want the button to appear.
4
Add the following code into the CSS anywhere outside the media query:
.show-menu {
text-decoration: none;
color: #fff;
background: #19c589;
text-align: center;
padding: 10px 0;
display: none;
/*Hide checkbox*/
input[type=checkbox]{
display: none;
input[type=checkbox]:checked ~ #menu{
display: block;}
.show-menu { display:block;}
5
Complete Code
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
</head>
6
<body>
<ul id="menu">
<li><a href="#">Home</a></li>
<li>
<ul class="hidden">
</ul>
</li>
<li>
<ul class="hidden">
<li><a href="#">Photography</a></li>
<li><a href="#">Illustration</a></li>
</ul>
</li>
<li><a href="#">News</a></li>
<li><a href="#">Contact</a></li>
7
</ul>
</body>
</html>
ul {
list-style-type:none;
margin:0;
padding:0;
position: absolute;
li {
display:inline-block;
float: left;
margin-right: 1px;
li a {
display:block;
min-width:140px;
height: 50px;
8
text-align: center;
line-height: 50px;
color: #fff;
background: #2f3036;
text-decoration: none;
li:hover a {
background: #19c589;
li:hover ul a {
background: #f3f3f3;
color: #2f3036;
height: 40px;
line-height: 40px;
li:hover ul a:hover {
9
background: #19c589;
color: #fff;
li ul {
display: none;
li ul li {
display: block;
float: none;
li ul li a {
width: auto;
min-width: 100px;
padding: 0 20px;
10
ul li a:hover + .hidden, .hidden:hover {
display: block;
.show-menu {
text-decoration: none;
color: #fff;
background: #19c589;
text-align: center;
padding: 10px 0;
display: none;
/*Hide checkbox*/
input[type=checkbox]{
display: none;
input[type=checkbox]:checked ~ #menu{
display: block;
11
/*Responsive Styles*/
ul {
position: static;
display: none;
li {
margin-bottom: 1px;
ul li, li a {
width: 100%;
.show-menu {
display:block;
Live Demo
http://medialoot.com/preview/css-only-navigation-menu/index.html
12