CSS Dropdown menu sem JavaScript ou hacks

Postado por: Pedro Rogério em
Menu Dropdown

Aqueles que como eu que trabalham com desenvolvimento web sabem o quanto é complicado desenvolver um menu dropdown que além de funcionar em todos os browsers ainda funcione através do teclado, tudo isso sem a utilização de JavaScript ou Hacks CSS.

Mas Michael MacNaughton conseguiu desenvolver um menu desse tipo, que funciona em todos os browsers, inclusive no Internet Explorer 6. O código HTML pode ser visto abaixo:

<div class="wrapper">

    <div class="mainmenu">
        <ul class="menu">
        <li class="list"><a class="category" href="#Home">Home</a></li>
        </ul>
        <ul class="menu">
            <li class="list">
                <a class="category" href="#about">About Us&nbsp;&nbsp;&raquo;</a>
                <ul class="submenu">
                    <li><a href="#about1">About link 1</a></li>
                    <li><a href="#about2">About link 2</a></li>
                    <li><a href="#about3">About link 3</a></li>
                    <li><a href="#about4">About link 4</a></li>
                    <li><a class="endlist" href="#about5">About link 5</a></li>
                </ul>
            </li>
        </ul>
        <ul class="menu">
            <li class="list">
                <a class="category" href="#articles">Articles&nbsp;&nbsp;&raquo;</a>
                <ul class="submenu">
                    <li><a href="#articles1">Articles link 1</a></li>
                    <li><a href="#articles2">Articles link 2</a></li>
                    <li><a href="#articles3">Articles link 3</a></li>
                    <li><a class="endlist" href="#articles4">Articles link 4</a></li>
                </ul>
            </li>
        </ul>
        <ul class="menu">
            <li class="list">
                <a class="category" href="#news">News&nbsp;&nbsp;&raquo;</a>
                <ul class="submenu">
                    <li><a href="#news1">News link 1</a></li>
                    <li><a href="#news2">News link 2</a></li>
                    <li><a class="endlist" href="#news3">News link 3</a></li>
                </ul>
            </li>
        </ul>
        <ul class="menu">
            <li class="list"><a class="category" href="#donate">Donate</a></li>
        </ul>
        <ul class="menu">
            <li class="list"><a class="category" href="#contact">Contact</a></li>
        </ul>
    </div>
</div>

E após, aplicamos o seguinte CSS:

body {
	font-family: Verdana, Geneva, sans-serif;
	font-size: 100%;
	color: #666;
	background-color: #fff;
	margin-left: 20px;
	margin-top: 20px;
	margin-right: 20px;
	margin-bottom: 20px;
}

a, a:hover, a:active, a:focus {
	outline:0;
	direction:ltr;
}

.wrapper {
	position:relative; height:25px;
}

.mainmenu {
	position:absolute;
	z-index:100;
	font-family:Verdana, Geneva, sans-serif;
	font-weight:normal;
	font-size:90%;
	line-height:25px;
	left:50%;
	margin-left:-303px;
	width:606px;
}

ul.menu {
	padding:0;
	margin:0;
	list-style:none;
	width:100px;
	overflow:hidden;
	float:left;
	margin-right:1px;
}

ul.menu a {
	background:#369;
	text-decoration:none;
	color:#fff;
	padding-left:5px;
}

ul.menu li.list {
	float:left;
	width:250px;
	margin:-32767px -125px 0px 0px;
	background:url(images/top1.png) no-repeat left bottom;
}

ul.menu li.list a.category {
	position:relative;
	z-index:50;
	display:block;
	float:left;
	width:120px;
	margin-top:32767px;
	background:transparent;
}

ul.menu li.list a.category:hover,
ul.menu li.list a.category:focus,
ul.menu li.list a.category:active {
	margin-right:1px;
	background-image:url(images/tophover1.png);
	background-repeat:no-repeat;
	background-position:left top;

}

ul.submenu {
	float:left;
	padding:25px 0px 0px 0px;
	margin:0;
	list-style:none;
	background-image:url(images/tophover1.png);
	background-repeat:no-repeat;
	background-position:left top;
	margin:-25px 0px 0px 0px;
}

ul.submenu li a {
	float:left;
	width:120px;
	background:#369;
	clear:left;
	color:#fff;
}

ul.submenu li a.endlist {
	background:url(images/bottom1.png);
}

ul.submenu li a.endlist:hover,
ul.submenu li a.endlist:focus,
ul.submenu li a.endlist:active {
	background:url(images/bottomhover1.png);
}

ul.submenu a:hover,
ul.submenu a:focus,
ul.submenu a:active {
	background:#900;
	margin-right:1px;
	color:#fff;
}

Vocês podem ver aqui um exemplo do menu em funcionamento, ou se preferir, pode fazer o download do menu para estudo.

Posts Relacionados

Confira também outros artigos interessantes postados aqui no blog.

Gostou desse post?

Assine o nosso Feed RSS, siga-nos no Twitter, ou simplesmente nos recomende a seus amigos!

Sobre Pedro Rogério

Pedro Rogério é desenvolvedor web por paixão, não saberia fazer melhor outra coisa. Além de escrever para o CSS no Lanche também escreve para o Pinceladas da Web, blog com assuntos gerais sobre desenvolvimento web.

29 Responses to “CSS Dropdown menu sem JavaScript ou hacks”

  1. william disse:

    valeu pedro, vai ser muito util.
    Abç.

  2. O único ruim disso é falta de semântica no código devido ele funcionar no Internet Explorer 6.

    Sinceramente, só para fazer funcionar no Internet Explorer 6 não vale apena escrever 15 linhas de código a mais.

    Mas é bem legal vocẽ ter mostrado esse código pelo fato de faze-lo funcionar com o TAB, o que muitos não conseguem ou esquecem de implementar. :D

    Abraços. ;)

  3. Thiago disse:

    Muito interessante o que vc trouxe pra gnt…

    eu particularmente faço drop down e para o ie eu uso javascript, nunca imaginei que funcionasse no ie6 sem javascript.

    boa….valeu

  4. Leo Caseiro disse:

    Nossa! Pq você demorou tanto tempo para descobrir isso? rsrs

    Lembra o quanto a gente apanhava pra fazer um menu desses?

    Show de bola!

    del.icio.us neste link rsrs
    Abs

  5. Felipe Constâncio de Jesus disse:

    Show, como o amigo acima disse, deve ser guardado mesmo, mas, eu tenho uma dica, eu fui testá-lo aqui e quando eu seleciono um item do sub-menu e clico nele por exe: about link 1, se eu tirar o mouse dele, ele ainda fica com o menu aberto e se eu passar o mouse no menu ao lado ele mostra os sub menus tbm, eu resolvi aqui retirando as linhas onde aparece o FOCUS … ai deu certo, posso clicar no link ele iria alterar a tela ou sei la o que for e quando eu tirar o mouse ele iria sumir

    =)

    Abraços e valew pelo post !!!!

  6. Felipe disse:

    Interessante demais.

    Ficou um pouco grande, talvez tenha-se até um pouco de dificuldade para implementar isso em um sistema dinâmico e a semântica não ficou lá essas coisas. Vou guardar e tentar aproveitar algo pq o maior interesse aqui é fazer o menu sem js.

  7. vitor disse:

    Funciona muito bem no ie6 e 7, mas não estou conseguindo fazer funcionar no ie8 e fifefox, o menu fica sempre aberto, com os itens do sub menu.

  8. Não está funcionando no IE, porque?
    Fiz tudo correto, no Ffox funciona blz, mas no IE não desce os menus, http://www.maringanet.com/dcc

    Alguém poderia me dar uma luz?

    Cláudio – cjcinformatica@gmail.com

  9. Guilherme Franco disse:

    Bem que alguêm poderia dizer o pulo do gato ai neh….

    To vasculhando o código aqui e não consigo entender o que dispara o evento hover no css…

    Usando o firebug, eu retirei TODAS as propriedades definidas no unico hover que achei ( a:hover) e a coisa continua funcionando!!! aihauiehauihe

    Bem que poderia fazer outro post soh explicando a mágica neh!(por favor).

  10. Edo disse:

    Na verdade Thiago, vale a pena fazer funcionar no IE 6 SIM!
    Infelizmente, ainda tem uma boa parcela de gente que o utiliza e a página não vai ficar pesada para quem usa IE 8 ou Firefox.

    Bem galera, DropDown está beleza, mas como faz para ser um “drop UP”, “drop left” ou a´t mesmo “drop rigth”?
    Alguem me indica um tuts ae?

  11. Juan Fernandes disse:

    Bacana e simples pena que até o momento só encontro DropDown Menus em java de forma a não serem sobrepostos por select.

  12. Danilo Ramos disse:

    Pra funcionar esse menu no IE6 o css aumenta drasticamente, putz, esse IE é uma pedra no caminho !

  13. O único problema q estou tendo no IE (8) é q os submenus estão aparecendo por baixo das divs q vem logo a seguir.

    • Plínio disse:

      Oi Jennifer, estou com o mesmo problema que o seu (é q os submenus estão aparecendo por baixo das divs q vem logo a seguir) se vc ja conseguiu resolver me manda a dica por favor… obirgado.

  14. Daltox disse:

    Muito bom mesmooooooooooooooooooo!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    Mas (como sempre “mas”), como faço para colocar mais submenus, quero dizer, colocar mais níveis de submenu. Tipo Home > Adress > Fone / CEL???

  15. Plínio disse:

    estou com o mesmo problema da Jennifer… é q os submenus estão aparecendo por baixo das divs q vem logo a seguir no IE. No firefox ta beleza…mas no IEca os submenus ficam porbaixo das divs…. como faço??

    • Eduardo disse:

      utiliza o z-index: 999;

      • Diogo Muniz disse:

        Olá Eduardo,
        Estou com mesmo problema do pessoal aí de cima. Com apenas uma diferença. O menu só fica por baixo se eu aplico tranparência nas DIVs. Tentei o z-index mas não funcionou.
        Vc tem alguma dica?
        Se quiser dar uma olhada no código ele tah aqui..

        http://www.4shared.com/file/1L1fR17v/website.html

        Meu email: diogo.muniz@darkhound.com.br

        Valeu!!

      • Juliana disse:

        Olá, Eduardo. Poxa, quebrei a cabeça horas aqui!!!! Meu menu estava ficando por baixo da imagem q tinha embaixo dele, aí segui sua dica e fiz isso:

        ul#navmenu ul { ———-> Nessa propriedade inseri z-index:999; como mostra abaixo:
        margin: 0;
        border: 0 none;
        padding: 0;
        width: 160px;
        list-style: none;
        display: none;
        position: absolute;
        top: 24px;
        left: 0;
        z-index: 999; —-> AQUI.

        E resolveu!

        valeu!

  16. Davis Peixoto disse:

    Olá Pedro.

    Cara, eu tô tentando fazer um menu dropdown, puramente com HTML 5 e CSS 3 (na verdade CSS 2.1, porque não tem nada de mais de CSS 3 ainda).

    O link é este: http://www.davedev.com.br/projects/developing/library/templatesWeb/html5andcss3/changeable/

    O desafio é: deixar o tamanho dos links dinâmico. No exemplo que está no post, temos o inconveniente de ter um tamanho fixo, 120px.

    Se alguém souber como resolve… Ah sim, o código até que está bem bacana. Quem quiser pode dar uma olhada nos fontes.

    E de quebra também tem uma outra coisa no exemplo que estou fazendo: folhas alternativas. Para ver é só ir em (no Firefox) – Visualizar -> Estilo da Página -> Escolher o formato.

    Abraço.

  17. Alexandre disse:

    \o/ Estou enfrentando o mesmo problema que o Plínio, a Jennifer, o Cláudio, o Diogo… descreveram. Alguém me dá um help!

  18. Alexandre disse:

    Bom, descobri o que pode resolver no meu caso == menu não fununcionando no ie8. Mas não adianta (?). É que a saída seria alterar o companheiro “DOCTYPE” (o que não pode ser feito, no meu caso, NÃO POSSO ALTERAR O COMPANHEIRO “DOCTYPE”. A culpa é do carinha que mora logo ali (Quirks). Se servir p/ alguém, eu vou morrer de inveja, não dá p/ fazer outra coisa:

  19. Helcio disse:

    Estou com problemas de fazer o menu funcionar no IE7, uso o IE8 e funciona normalmente… alguém passou por isso, resolveu e pode dar uma dica?

    Obrigado

  20. Fernando disse:

    Não está funcionando corretamente no IE 9

  21. Rodrigo Nunes disse:

    obrigado graças a vc eu consegui fazer meu menu thanks…..

  22. Hagamenom disse:

    “O único problema q estou tendo no IE (8) é q os submenus estão aparecendo por baixo das divs q vem logo a seguir.”

    A solução pode ser colocar no código html as div’s que sobrepõem os sub-menus antes da div do menu propriamente dito. Em seguida é ajustar as propriedades “TOP” das div’s até que as a do Menu fique sobre as outras. Assim, acaba a sobreposição.

    Ps.: Para quem não sabe, div’s são dinâmicas e aceitam por exemplo “Top: -30px” ;)

  23. Emilly disse:

    Eu estava com o mesmo problema no internet explorer
    depois vi que estava faltando essa tag
    se estiver sem num funciona no internet explorer

  24. felipe disse:

    queria saber porque meu drop down quando passo o mouse ele fika embaixo do meu conteudo nao consiguo que ele apareça em cima do meu conteudo como ke faço ???
    valeu

Leave a Reply