Mootools – Menu Sanfona
A Mootools, além de ser uma ótima biblioteca para tarefas variadas relacionadas a Strings, Arrays, DOM e Ajax, ela também possui alguns "extras" muito úteis na hora de desenvolver algo mais "bonitinho". O menu sanfona (ou accordion menu, como preferir) é um deles, do qual irei falar nesse post mais-do-que-atrasado. Aproveite e veja como ficará.
O HTML
Antes de começar com o comportamento, primeiro vamos criar o conteúdo do menu. Uma lista simples, com outras listas aninhadas, as quais
ficarão escondidas até que seus títulos sejam clicados.
<ul>
<li><h3>Título 1</h3>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</li>
<li><h3>Título 2</h3>
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</li>
</ul>
Nada em especial até agora, mas temos que incluir mais alguns atributos aí. Para que a Mootools possa identificar quais itens serão clicáveis e quais deverão ficar “escondidos”, precisamos identificá-los com classes. Não há restrição para alguma classe específica, mas costumo usar toggler para os clicáveis e element para os itens escondidos.
<ul>
<li><h3 class="toggler">Título 1</h3>
<ul class="element">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</li>
<li><h3 class="toggler">Título 2</h3>
<ul class="element">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
</li>
</ul>
O Script
Agora sim, a parte difícil, ou nem tanto assim. Como tudo na Mootools é baseado em classes, o menu sanfona não foge à regra. A classe Accordion é a responsável por todo o menu, desde identificar seus elementos até mostrar/esconder o conteúdo.
window.addEvent('domready', function() {
var accordion = new Accordion('h3.toggler', 'ul.element')
})
Como parâmetros, passamos os títulos clicáveis e o conteúdo de cada item, somente isso. A biblioteca cuida do resto. Difícil, não?
Algumas Opções
Podemos ir um pouco além do básico, e adicionar alguma personalização em nosso menu. Para isso, a classe nos dá algumas opções. Basta passar um objeto como terceiro parâmetro. As opções possíveis são:
show: índice do elemento a ser mostrado inicialmentedisplay: índice do elemento a ser mostrado inicialmente. Diferentemente deshow, esse elemento será mostrado com uma transiçãofixedHeight: altura fixa dos itens, padrãofalsefixedWidth: largura fixa dos itens, padrãofalseheight: inclui transição de altura, padrãotrueopacity: inclui transição de opacidade, padrãotruewidth: inclui transição de largura, padrãofalsealwaysHide: permite esconder todos elementos, em vez de manter ao menos um sendo mostrado, padrãofalse
Além das opções, temos também dois eventos:
onActive: executado quando algum item se tornar ativoonBackground: executado quando algum item for escondido
Finalizando
Agora vamos modificar um pouco nosso menu, utilizando as opções e eventos vistos acima.
window.addEvent('domready', function() {
var accordion = new Accordion('h3.toggler', 'ul.element', {
"opacity": false,
"onActive": function(toggler) {
toggler.setStyle("color", "#f00");
toggler.setStyle("font-weight", "bold");
},
"onBackground": function(toggler) {
toggler.setStyle("color", "#000");
toggler.setStyle("font-weight", "normal");
}
})
})
Pronto! Veja o exemplo finalizado. E mais: retirando todas as transições, você tem um menu sanfona totalmente customizável. O poder e a facilidade da Mootools. Incrível, muito bem pensado, por isso adoro essa biblioteca. Até mais!







Olá, tudo bem?
Tentei visitar o link de exemplo mas está quebrado :s
Parabéns pelo site
@Flávio: obrigado por reportar. O arquivo estava lá, mas o servidor insistia em não mostrar… Corrigido!
Até mais!
Dica muito util, e um ótimo blog.
JulioGreff, muito útil esta dica mesmo!
Mas estou com um problema de caráter navegacional…
Ao clicar no menu, que seria remetido para uma página,que também tenha este mesmo menu.
Preciso que fique ‘aberto’ no menu que foi previamente clicado… Entedeu?
Ele esta voltando para a posição inicial toda vez que abro um link interno…
Aqui: http://glaumaq.tempbr.net/index.php?option=com_content&view=article&id=66&Itemid=7
Se existir uma maneira de abrir manualmente baseado em um id… abraço!