Como criar um Menu Dropdown com apenas CSS

10:52

Este tutorial ensina a como criar um menu Dropdown com apenas recursos do CSS 3. Veja abaixo o resultado final:

O menu que vamos criar é composto de 3 níveis, título principal, sub categoria e sub-sub categoria. Uma vez que passar o mouse por cima do título, automaticamente é disparado o evento :hover que mostrará as sub categorias. A primeira série de sub-links aparecem embaixo da barra principal de navegação, então a segunda série de links irá aparecer horizontalmente a partir do primeiro sub item. Dê uma olhada na imagem.

menu

A Estrutura HTML

Primeiro vamos precisar criar nossa estrutura HTML. Vamos utilizar a tag <nav> do HTML 5, em seguida, adicionar os links de navegação primários em uma lista desordenada.

<nav> <ul> <li><a href="#">Home</a></li> <li><a href="#">Tutoriais</a> <ul> <li><a href="#">CSS</a></li> <li><a href="#">HTML</a></li> <li><a href="#">JavaScript</a> <ul> <li><a href="#">jQuery</a></li> <li><a href="#">Angular</a></li> </ul> </li> </ul> </li> <li><a href="#">Artigos</a> <ul> <li><a href="#">Node.js</a></li> <li><a href="#">MongoDB</a></li> </ul> </li> <li><a href="#">Crie seu Próprio Menu</a></li> </ul></nav>

O resultado sem a inserção do CSS ficaria da seguinte forma:

Estilizando com CSS

Vamos começar com o básico, primeiro vamos apenas esconder nossos sub-links e fazê-los aparecer caso passe o mouse por cima do menu pai. Para isto, vamos utilizar o seletor :hover que, quando passado o mouse sobre o menu, os seu elementos filhos serão mostrados. Com este pequeno código já temos um resultado interessante. Passe o mouse sobre os links para ver o resultado em ação. Também centralizamos o menu.

nav ul ul { display: none;} nav ul li:hover> ul { display: block; }nav { margin: 0 auto; text-align: center;}

Agora vamos dar uma melhorada no visual adicionando cor e espaçamentos.

nav ul { background: #efefef; background: linear-gradient(top, #efefef 0%, #bbbbbb 100%); background: -moz-linear-gradient(top, #efefef 0%, #bbbbbb 100%); background: -webkit-linear-gradient(top, #efefef 0%,#bbbbbb 100%); box-shadow: 0px 0px 9px rgba(0,0,0,0.15); padding: 0 20px; border-radius: 10px; list-style: none; position: relative; display: inline-table;} nav ul:after { content: ""; clear: both; display: block; }

Veja como está ficando até agora.

Continuando, agora vamos fazer o posicionamento dos menus, definir a cor para os sub-menus e dispor como espaços e blocos.

 nav ul li { float: left; } nav ul li:hover { background: #4b545f; background: linear-gradient(top, #4f5964 0%, #5f6975 40%); background: -moz-linear-gradient(top, #4f5964 0%, #5f6975 40%); background: -webkit-linear-gradient(top, #4f5964 0%,#5f6975 40%); } nav ul li:hover a { color: #fff; } nav ul li a { display: block; padding: 15px 20px; color: #757575; text-decoration: none; }

Neste ponto nosso menu começa a ficar interessante, ganhando um visual e funcionando de modo precário ainda. Agora, vamos adicionar os posicionamentos e cores. Veja que sub-menus agora ganham uma cor diferenciada e seus descendentes uma formatação para melhor apresentação.

 nav ul ul { background: #5f6975; border-radius: 0px; padding: 0; position: absolute; top: 100%; } nav ul ul li { float: none; border-top: 1px solid #6b727c; border-bottom: 1px solid #575f6a; position: relative; } nav ul ul li a { padding: 15px 40px; color: #fff; } nav ul ul li a:hover { background: #4b545f; }

A barra de navegação está quase completa, agora ela já está eslizada mas seus sub-menus ainda apresentam algum problema de posicionamento. Eles estão herdando configurações de seus pais, vamos mudar este comportamento para os sub-menus se posicionarem ao lado de seus elementos pai. Adicione mais este código:

 nav ul ul ul { position: absolute; left: 100%; top:0; }

Resultado:

No elemento final, adicionamos uns efeitos ao fundo, veja como ficou.

Dica: Utilizando o normalize.css, você obterá uma maior compatibilidade com browsers antigos.