Publicidade (Anuncie Aqui)

Criando um menu retrátil com CSS e jQuery

Criando um menu retrátil com CSS e jQuery

Hoje vou ensinar como criar um menu usando listas (ol) e que tem o efeito de expandir/retrair feito com jQuery.

O efeito em sí é bem simples e fácil de ser modificado… O meu foi feito usando HTML puro e uma folha de estilos (CSS) pequena. No final do tutorial você vai encontrar o link pra download do arquivo .rar com o exemplo dessa aula.

Veja aqui um exemplo de como vai ficar o menu.

Bom… vamos lá!

Código (X)HTML do menu

<ul id="menu">
	<li class="header">Menu</li>
	<li><a href="#" title="">Página inicial</a></li>
	<li><a href="#" title="">Notícias</a></li>
	<li class="parent"><a href="#" title="">Produtos</a>
		<ul class="sub-menu">
			<li><a href="#" title="">Camisetas</a></li>
			<li><a href="#" title="">Calças</a></li>
			<li><a href="#" title="">Livros</a></li>
		</ul>
	</li>
	<li><a href="#" title="">Quem somos nós</a></li>
	<li><a href="#" title="">Contato</a></li>
</ul>

Vejam que o sub-menu (que irá aparecer) fica dentro do <li> e fora do <a>.

Código CSS do menu

* {
	margin: 0px;
	padding: 0px;
}

body {
	font-family: Verdana, Arial, sans-serif;
	font-size: 11px;
	margin: 20px;
} 

ul {
	list-style: none;
}                  

ul#menu {
	width: 170px;
	border: 1px solid silver;
	margin-top: 20px;
}

ul#menu li {
	color: black;
	line-height: 19px;
	background: #F4F4F4;
}

ul#menu li.header {
	background: #DFDFDF;
	font-weight: bolder;
	padding: 0px 3px;
	font-size: 12px;
}   

ul#menu li a {
	color: black;
	text-decoration: none;
	display: block;
	padding: 0px 3px;
	outline: none;
}                     

ul#menu li.parent > a {
	background: transparent url('../img/down.gif') right center no-repeat;
}                   

ul#menu li.aberto > a {
	background: transparent url('../img/up.gif') right center no-repeat;
}                   

ul#menu li a:hover {
	background-color: #EAEEFF;
}

ul#menu li ul.sub-menu {
  	display: none;
}                 

ul#menu li ul.sub-menu li a {
	padding-left: 15px;
	color: maroon;
}

Bloco de código do efeito (jQuery)

$(function() {
	// Evento de clique do elemento: ul#menu li.parent > a
	$('ul#menu li.parent > a').click(function() {
		// Expande ou retrai o elemento ul.sub-menu dentro do elemento pai (ul#menu li.parent)
		$('ul.sub-menu', $(this).parent()).slideToggle('fast', function() {
			// Depois de expandir ou retrair, troca a classe 'aberto' do <a> clicado
			$(this).parent().toggleClass('aberto');
		});
		return false;
	});
});

É só juntar todas as peças (como foi feito no exemplo) e o seu menu irá funcionar que é uma maravilha! :D

O código do efeito pode parecer um pouco complicado pra quem tá começando com jQuery, mas é só ler os comentários e procurar um pouco sobre cada função (slideToggle, toggleClass, click) na documentação que, com os exemplos de lá vai ficar tudo claro.

Faça aqui o download do arquivo .rar com os arquivos dessa aula.

Espero que tenham gostado, qualquer dúvida é só falar.

Você também vai gostar de ler:

Postado em CSS, HTML, Tutoriais, jQuery

Com as tags , , , , , , , , , , , , , , , , ,

Escrito por Thiago Belem

Gostou desse artigo?

Não se esqueça de assinar o RSS e divulgue-o para o mundo:

  • Rafael

    Muito bom, bem explicado como sempre, código limpo. Parabéns.

    vlw abraços Thiago!!

  • Rafael

    Muito bom, bem explicado como sempre, código limpo. Parabéns.

    vlw abraços Thiago!!

  • Rodrigo Berriel

    Valeu Thiago por ter falado um pouco sobre isso…

    Gostei muito…

    Só queria saber um coisa que não consegui encontrar na internet. Como eu faço para que o menu retrátil comece expandido, e não retraído?

    Agradeço desde já…

    Abraços!

  • Rodrigo Berriel

    Valeu Thiago por ter falado um pouco sobre isso…

    Gostei muito…

    Só queria saber um coisa que não consegui encontrar na internet. Como eu faço para que o menu retrátil comece expandido, e não retraído?

    Agradeço desde já…

    Abraços!

  • Rodrigo Berriel

    Muito Obrigado Thiago. Funcionou mesmo. Nossa, nem pensei nisso =[

    Valeu mais uma vez!!!

    Abraços!

  • Rodrigo Berriel

    Muito Obrigado Thiago. Funcionou mesmo. Nossa, nem pensei nisso =[

    Valeu mais uma vez!!!

    Abraços!

  • http://blog.thiagobelem.net/ Thiago Belem

    @Rodrigo
    No caso do meu tutorial, é só você mudar no CSS (seletor ul#menu li ul.sub-menu) para display block e no HTML, sempre usar .

    Abraços! :P

  • http://thiagobelem.net/ Thiago Belem

    @Rodrigo
    No caso do meu tutorial, é só você mudar no CSS (seletor ul#menu li ul.sub-menu) para display block e no HTML, sempre usar .

    Abraços! :P

  • http://www.eosilva.com.br Eduardo Oliveira Silva

    Thiago teu tutorial está otimo….eu só tenho uma dúvida…eu estou usando o menu e está perfeito, o problema eh que no IE6 quando passo o “display:block” do “ul#menu li a” ele abre um espaço entre as divs e nao consigo tirar isso… se eu retirar o display fico com o problema de o link nao preencher a total extenção da div.
    Se você souber uma forma de me ajudar ficaria grato.
    Obrigado desde ja.

  • http://www.eosilva.com.br Eduardo Oliveira Silva

    Thiago teu tutorial está otimo….eu só tenho uma dúvida…eu estou usando o menu e está perfeito, o problema eh que no IE6 quando passo o “display:block” do “ul#menu li a” ele abre um espaço entre as divs e nao consigo tirar isso… se eu retirar o display fico com o problema de o link nao preencher a total extenção da div.
    Se você souber uma forma de me ajudar ficaria grato.
    Obrigado desde ja.

  • http://blog.thiagobelem.net/ Thiago Belem

    Deixe o ul#menu li a com a altura e largura do container (li) e acho que vai dar certo. ;)

  • http://thiagobelem.net/ Thiago Belem

    Deixe o ul#menu li a com a altura e largura do container (li) e acho que vai dar certo. ;)

  • Jakson

    Ei colega se eu quiser criar uma sub-categoria de produto >camiseta > manga comprida , como poderia ser feito? Valeu desde já.

  • Jakson

    Ei colega se eu quiser criar uma sub-categoria de produto >camiseta > manga comprida , como poderia ser feito? Valeu desde já.

  • http://blog.thiagobelem.net/ Thiago Belem

    @Jackson
    É só manter a mesma lógica… Acredito que irá funcionar.. :)

  • http://thiagobelem.net/ Thiago Belem

    @Jackson
    É só manter a mesma lógica… Acredito que irá funcionar.. :)

  • marli coelho

    Sou do RS do sul e estou começando a pesquisar p/ poder criar. na verdade é mais uma pergunta que um comentário. Gostaria de saber se poço usar estes Códigos (X)HTML do menu que vc esta demonstrando na pág?Bj

  • marli coelho

    Sou do RS do sul e estou começando a pesquisar p/ poder criar. na verdade é mais uma pergunta que um comentário. Gostaria de saber se poço usar estes Códigos (X)HTML do menu que vc esta demonstrando na pág?Bj

  • http://blog.thiagobelem.net/ Thiago Belem

    @Marli
    Pode sim :)

  • http://thiagobelem.net/ Thiago Belem

    @Marli
    Pode sim :)

  • Deivison

    Cara muito bom, já virei fã desse site :D

  • Deivison

    Cara muito bom, já virei fã desse site :D

  • Jardel

    Boa dica… era o que eu tava procurando. Valeu…

  • Jardel

    Boa dica… era o que eu tava procurando. Valeu…

  • http://www.portalboasnovas.com.br Rogerio

    olá Thiago,

    gostei muito do seu site, e desse código tambem, só que quando eu clico no menu retratil, e abro o mesmo, e clico em um dos links, carrega a página novamente, dai o menu retrai de novo.

    eu sei o que tem q ser feito para o menu na hora q carregar a pagina continuar aberto, mudando o display do sub-menu que esta none pra block, só que eu naum queria que ficasse algo fixo, vc poderia me ajudar nisso ?

    agradeço muito…

  • http://www.portalboasnovas.com.br Rogerio

    olá Thiago,

    gostei muito do seu site, e desse código tambem, só que quando eu clico no menu retratil, e abro o mesmo, e clico em um dos links, carrega a página novamente, dai o menu retrai de novo.

    eu sei o que tem q ser feito para o menu na hora q carregar a pagina continuar aberto, mudando o display do sub-menu que esta none pra block, só que eu naum queria que ficasse algo fixo, vc poderia me ajudar nisso ?

    agradeço muito…

  • http://blog.thiagobelem.net/ Thiago Belem

    @Rogerio
    Você precisaria usar cookies para isso. :)

  • http://thiagobelem.net/ Thiago Belem

    @Rogerio
    Você precisaria usar cookies para isso. :)

  • Tiago Farias

    Cara, você é um genio, posta seus tutoriais sem custo nenhum, ao contrario de muitos que vejo pela internet.
    obrigado mesmo!

  • Tiago Farias

    Cara, você é um genio, posta seus tutoriais sem custo nenhum, ao contrario de muitos que vejo pela internet.
    obrigado mesmo!

  • valhalla

    eu gostaria de saber como eu coloco esse codigo jquery no meu blog, já tentei de várias formas e não consigo.

  • valhalla

    eu gostaria de saber como eu coloco esse codigo jquery no meu blog, já tentei de várias formas e não consigo.

  • http://blog.thiagobelem.net/ Thiago Belem

    @Valhalla
    Você precisará editar o seu tema.. :)

  • http://thiagobelem.net/ Thiago Belem

    @Valhalla
    Você precisará editar o seu tema.. :)

  • Guilherme

    Ai Thiago, vc eh cara!!!!Vlw pelos codigos.
    Abraço!!!

  • Guilherme

    Ai Thiago, vc eh cara!!!!Vlw pelos codigos.
    Abraço!!!

  • http://www.f1multimidia.com.br Fábio Maschi

    Olá, muito bom o post! Funcionou certinho, parabéns…
    Só preciso saber uma coisa: no meu caso, eu tenho mais de um sub-menu. Como eu faço para, quando um sub já estiver expandido, ao clicar em outro sub, o expandido retrai e o clicado expande.. deu para entender?
    Do modo do post, podem ter dois (ou mais) sub-menu expandidos, quero que só possa ter um expandido.
    Muito obrigado!

  • http://www.f1multimidia.com.br Fábio Maschi

    Olá, muito bom o post! Funcionou certinho, parabéns…
    Só preciso saber uma coisa: no meu caso, eu tenho mais de um sub-menu. Como eu faço para, quando um sub já estiver expandido, ao clicar em outro sub, o expandido retrai e o clicado expande.. deu para entender?
    Do modo do post, podem ter dois (ou mais) sub-menu expandidos, quero que só possa ter um expandido.
    Muito obrigado!

  • Thiago

    Olá Thiago, primeiramente quero agradecer pelo tuto, me ajudou muito…Eu quero saber se tem como eu fazer uma declaração no CSS para que ao passar o mouse sobre um link ele mude de cor (a:hover)!? Eu até consegui mudando o CSS nesse trecho aqui:

    ul#menu li a:hover {
    background-color: #EAEEFF;
    }

    Para:

    ul#menu li a:hover {
    color: #60D2D2;
    }

    Porém nesse caso ele pega tudo o que esta nas listas ordenadas, e eu quero configurar apenas alguns links para que fiquem com a:hover entendeu? Sendo mais exato, eu não queria que o texto produtos por exemplo mudasse de cor, apenas os sub ítens: camisetas, calças e livros…Pode me ajudar?

    Desde já eu agradeço!

    []‘s Thiago

  • Thiago

    Olá Thiago, primeiramente quero agradecer pelo tuto, me ajudou muito…Eu quero saber se tem como eu fazer uma declaração no CSS para que ao passar o mouse sobre um link ele mude de cor (a:hover)!? Eu até consegui mudando o CSS nesse trecho aqui:

    ul#menu li a:hover {
    background-color: #EAEEFF;
    }

    Para:

    ul#menu li a:hover {
    color: #60D2D2;
    }

    Porém nesse caso ele pega tudo o que esta nas listas ordenadas, e eu quero configurar apenas alguns links para que fiquem com a:hover entendeu? Sendo mais exato, eu não queria que o texto produtos por exemplo mudasse de cor, apenas os sub ítens: camisetas, calças e livros…Pode me ajudar?

    Desde já eu agradeço!

    []‘s Thiago

  • http://blog.thiagobelem.net/ Thiago Belem

    @Thiago
    Não entendi bem sua dúvida mas tenta isso:
    ul#menu li:hover a { OU ul#menu li:hover > a {

  • http://thiagobelem.net/ Thiago Belem

    @Thiago
    Não entendi bem sua dúvida mas tenta isso:
    ul#menu li:hover a { OU ul#menu li:hover > a {

  • http://blog.thiagobelem.net/ Thiago Belem

    @Fábio Maschi
    Você vai precisar estudar o script, entender como ele funciona e modificá-lo para as suas necessidades. ;)

  • http://thiagobelem.net/ Thiago Belem

    @Fábio Maschi
    Você vai precisar estudar o script, entender como ele funciona e modificá-lo para as suas necessidades. ;)

  • Thiago

    Não era bem isso…Mas eu consegui usando isso aqui:

    ul#menu li ul.sub-menu a:hover {
    color: #60D2D2;
    }

    Valeu amigo, obrigado e sucesso para você!!!!

  • Thiago

    Não era bem isso…Mas eu consegui usando isso aqui:

    ul#menu li ul.sub-menu a:hover {
    color: #60D2D2;
    }

    Valeu amigo, obrigado e sucesso para você!!!!

  • douglas

    Thiago parabens pelo codigo,
    Testei ele no firefox OK ja no ie8 não apareceu as imagens gif, será que errei algo?

  • douglas

    Thiago parabens pelo codigo,
    Testei ele no firefox OK ja no ie8 não apareceu as imagens gif, será que errei algo?

  • http://www.acaclan.com.br Anderson

    Douglas, a solução é simples. Eu tive o mesmo problema e penei p/ achar a resposta

    Adicione o seguinte, na primeira linha da página (não do arquivo CSS!):

    Funciona em IE7, IE8, IE8 em modo compatibilidade, Chrome, Firefox e Opera.

  • http://www.acaclan.com.br Anderson

    Douglas, a solução é simples. Eu tive o mesmo problema e penei p/ achar a resposta

    Adicione o seguinte, na primeira linha da página (não do arquivo CSS!):

    Funciona em IE7, IE8, IE8 em modo compatibilidade, Chrome, Firefox e Opera.

  • http://www.acaclan.com.br Anderson

    Não apareceu o código na página…
    Segue abaixo. Substitua os colchetes por > ou <, conforme o caso.

    [!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"]

    [/html]
  • http://www.acaclan.com.br Anderson

    Não apareceu o código na página…
    Segue abaixo. Substitua os colchetes por > ou <, conforme o caso.

    [!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"]

    [/html]

  • http://www.acaclan.com.br Anderson

    Não saiu o código.
    Douglas, adicione o doctype. Isso faz funcionar.

  • http://www.acaclan.com.br Anderson

    Não saiu o código.
    Douglas, adicione o doctype. Isso faz funcionar.

  • Kanzen

    Como fazer para ao clicar em um elemento todos os outros se retraírem?

    parabéns pelo site, “sigo” vc desde o eA (faz tempo heim Tiu) XD

  • Kanzen

    Como fazer para ao clicar em um elemento todos os outros se retraírem?

    parabéns pelo site, “sigo” vc desde o eA (faz tempo heim Tiu) XD

  • Marco Antonio

    Olá Thiago,

    Sou desenvolvedor java e com experiência em desenvolvimento de aplicações servidoras. Nos projetos em que trabalhei sempre tinha um ou mais webdesigners então nunca me preocupei com essa parte do sistema. Agora estou em um projeto sozinho e estou me deparando com as dificuldades do layout web. Gostaria de dizer que sua dica de menu foi excelente não só pelo menu em si, mas pelo que eu aprendi com relação ao jquery e css. Por conta da sua dica fui atrás de documentação dessas tecnologias para entender o que o seu código fazia.

    Parabéns pela sua iniciativa e muito obrigado pela dica.

  • Marco Antonio

    Olá Thiago,

    Sou desenvolvedor java e com experiência em desenvolvimento de aplicações servidoras. Nos projetos em que trabalhei sempre tinha um ou mais webdesigners então nunca me preocupei com essa parte do sistema. Agora estou em um projeto sozinho e estou me deparando com as dificuldades do layout web. Gostaria de dizer que sua dica de menu foi excelente não só pelo menu em si, mas pelo que eu aprendi com relação ao jquery e css. Por conta da sua dica fui atrás de documentação dessas tecnologias para entender o que o seu código fazia.

    Parabéns pela sua iniciativa e muito obrigado pela dica.

  • Nilson

    Olá, Parabéns pelo tutorial do Menu Retrátil…
    Estou com dificuldades, pois sou iniciante…
    para criar mais uma sub categoria tipo:
    > menu
    > sub_menu
    > sub_sub menu

    não estou conseguindo… já passei horas e horas tentando modificar o código… mas não estou conseguindo… se puder me ajudar agradeceria muito… obrigado!

  • Nilson

    Olá, Parabéns pelo tutorial do Menu Retrátil…
    Estou com dificuldades, pois sou iniciante…
    para criar mais uma sub categoria tipo:
    > menu
    > sub_menu
    > sub_sub menu

    não estou conseguindo… já passei horas e horas tentando modificar o código… mas não estou conseguindo… se puder me ajudar agradeceria muito… obrigado!

  • Daniel

    Bom dia, muito obrigado, caiu como uma luva para mim…
    Thiago ou alguém poderia fazer ou me explicar como fazer para se eu clicar em uma categoria (pai) todas as demais categorias (pais) se fecham? deixando expandir apenas uma por vez.
    peço auxilio pois não manjo bem de javascript nem jquery
    Obrigado

  • Daniel

    Bom dia, muito obrigado, caiu como uma luva para mim…
    Thiago ou alguém poderia fazer ou me explicar como fazer para se eu clicar em uma categoria (pai) todas as demais categorias (pais) se fecham? deixando expandir apenas uma por vez.
    peço auxilio pois não manjo bem de javascript nem jquery
    Obrigado

  • phz

    Para quem queria que todas as categorias que estão abertas fechem adicione o seguinte codigo:
    ……..
    $('ul#opcoes li.parent > a').click(function() {
    $('ul.sub-menu').hide(); //esse codigo vai fechar todos os abertos
    // Expande ou retrai o elemento ul.sub-menu dentro do elemento pai (ul#menu li.parent)
    ……….

  • Phbotelho

    Uma forma mais bonitinha de deixar o menu utilize o seguinte codigo, estou utilizando o exemplo html desta pagina, esse codigo fecha o menu que esta aberto bem bacana:

    <script language=”javascript” type=”text/javascript”>
    function initMenus() {
    $('ul#sub-menu ul').hide();
    $.each($('ul#sub-menu'), function(){ $('#' + this.id + '.expandfirst ul:first').show(); });
    $('ul#opcoes li a').click(function() {
    var checkElement = $(this).next();
    var parent = this.parentNode.parentNode.id;
    if((checkElement.is('ul')) && (!checkElement.is(':visible'))){$('#' + parent + ' ul:visible').slideUp('normal');checkElement.slideDown('normal');return false;}
    }
    );
    }
    $(document).ready(function() {initMenus();});
    </script>

blog comments powered by Disqus