Categories: jquerytodas

Efeito jQuery toggle para revelar e esconder

Um dos efeitos mais empregados em desenvolvimento com uso da biblioteca jQuery é aquele que proporciona ao usuário a escolha de revelar e esconder conteúdos.

Neste tutorial vou mostrar os fundamentos da técnica que fazem funcionar este efeito, desenvolvendo um exemplo prático no qual mostrarei como fazer seu script não obstrutivo e um pequeno plugin que se destina a fazer a mudança do texto que o usuário deverá clicar para Revelar ou Esconder o conteúdo.

O efeito revelar/esconder carrega consigo implicitamente as seguintes facilidades

  • é simples e fácil de ser projetado;
  • requer cuidados mínimos para ser “não obstrutivo”;
  • permite inserir muito conteúdo em pouco espaço;
  • facilita a visualização e entendimento dos conteúdos;
  • proporciona interação agradável com o usuário;
  • cria impacto visual interessante.

Desenvolvi um exemplo prático que ilustra as técnicas aqui demonstradas. O exemplo encontra-se em: Revelar e esconder conteúdos com jQuery.

Como funciona?

A estrutura de marcação HTML necessária para o funcionamento do efeito consiste, basicamente, em se marcar um texto curto, uma palavra ou mesmo um símbolo que servirá de “chave”, a ser clicado pelo usuário, para fazer o efeito funcionar, ou seja revelar e esconder o conteúdo. A chave referida é de duas posições tal como são os interruptores de corrente elétrica destinados a acender e apagar luzes.

Os textos curtos que definem as posições da chave normalmente são: “revelar/esconder”, “ver/ocultar”, “abrir/fechar” “mostrar/esconder” ou ainda os símbolos “+/-“, etc.

Em seguida à chave encontra-se a marcação dos conteúdos a revelar/esconder. Estes conteúdos devem ser inseridos com marcação HTML semântica apropriada e, obviamente, variável com o tipo de conteúdo.

Inicialmente é apresentada ao usuário uma página contendo uma lista de chaves na posicão “Revelar” que ao serem clicadas revelarão o conteúdo a seguir e ao mesmo tempo mudarão a chave para a posição “Esconder”. Sempre que o usuário clicar uma chave para revelar e existir um conteúdo que tenha sido revelado anteriormente este deverá ser escondido.

Marcação HTML

Observe a marcação HTML que foi desenvolvida para o exemplo que ilustra esta matéria.

<div id="box-toggle">

<div class="tgl">
   <h2>Conteúdo um</h2>
   <p>Lorem ipsum dolor sit amet, consectetuer...</p>
</div>

<div class="tgl">
   <h2>Conteúdo dois</h2>
   <p>Lorem ipsum dolor sit amet, consectetuer...</p>
</div>

<div class="tgl">
   <h2>Conteúdo três</h2>
   <p>Lorem ipsum dolor sit amet, consectetuer...</p>
</div>

</div>

No exemplo criamos três blocos de conteúdos a revelar/esconder. Os textos das chaves não foram marcados diretamente no HTML. Eles serão criados com JavaScript como veremos a seguir. Fizemos assim para que as chaves não apareçam quando a página for renderizada com JavaScript desabilitado. Outro cuidado que devemos ter é não esconder inicialmente os conteúdos a revelar com uso de folhas de estilo. Se assim fizermos iremos bloquear o acesso aos conteúdos em navegadores com JavaScript desabilitado. Esconda os conteúdos com declaração CSS definida com JavaScript.

Os dois cuidados mencionados acima fazem com que seu script retire da marcação as chaves e não bloqueie acesso aos conteúdos quando JavaScript e/ou CSS estiverem desabilitadas no navegador. E, infelizmente a quase totalidade dos scripts para produzir o efeito revelar/esconder que tenho encontrado na web não levam em conta estas duas considerações. Colocam, equivocadamente, a chave diretamente na marcação e escondem conteúdos com regras CSS em folhas de estilo.

Notar ainda que os conteúdos foram inseridos dentro de um div com a classe tgl e a área que contém os três conteúdos foi inserida dentro de um div geral com id box-toggle.

Script jQuery

<script type="text/javascript"> 
jQuery.fn.toggleText = function(a,b) {
return   this.html(this.html().replace(new RegExp("("+a+"|"+b+")"),function(x){return(x==a)?b:a;}));
}

$(document).ready(function(){
$('.tgl').before('Revelar conteúdo');
$('.tgl').css('display', 'none')
$('span', '#box-toggle').click(function() {
$(this).next().slideToggle('slow')
.siblings('.tgl:visible').slideToggle('fast');
// aqui começa o funcionamento do plugin
$(this).toggleText('Revelar','Esconder')
.siblings('span').next('.tgl:visible').prev()
.toggleText('Revelar','Esconder')
});
})
</script>

Código comentado

Linha Descrição
2 Sintaxe para criar um método personalizado denominado toggleText que executa uma função admitindo dois parâmetros, a e b. Cria um pequeno plugin.
3 O método criado verifica qual é conteúdo HTML textual de um elemento entre os dois fornecidos nos parâmetros da função e troca um pelo outro. Considere, por exemplo, a=Revelar e b=Esconder para entender o funcionamento da função.
7 Criamos, com script, a marcação HTML para a chave revelar/esconder com o valor inicial revelar e a inserimos antes dos conteúdos a revelar div.tgl.
8 Escondemos os conteúdos a revelar com declaração CSS no script.
9 Atrelamos o evento click às chaves.
10 Clicando a chave a visibilidade do conteúdo imediatamente a seguir é trocada. Se escondida é revelada e vice-versa.
11 Ao mesmo tempo qualquer dos conteúdos vizinhos que estejam revelados serão escondidos.
13 Alterna Revelar com Esconder.
14 e 15 Troca Esconder por Revelar para conteúdos vizinhos que estejam revelados e foram escondidos conforme descrito para a linha 11.

O exemplo que ilustra este tutorial encontra-se em: Revelar e esconder conteúdos com jQuery.

Créditos para o pequeno plugin Autor: Matt Kruse

Maujor

View Comments

  • Fantástico.

    Quero criar um checkbox, onde ao selecioná-lo, ai sim aparece.

    Como seria?

    Obrigado.

  • Bom dia, gostaria de saber como faço pra poder abrir um link no lugar de um conteúdo estático, tipo ao clicar em revelar conteúdo 1 abrir o site da Google por exemplo?

  • Só vou comentar pra dizer muito obrigado! Era exatamente o que eu procurava e de maneira muito simples!

  • Para quem esta com dificuldades em trocar o titulo dos conteudos:

    ao invéz de atribuir o span com jquery como em $('.tgl').before('Revelar conteúdo');

    crie os spans no html antes das divs escondidas.

    funciona perfeitamente

  • Basta apertar Ctrl+U na ´página que mostrao exemplo funcionando, copiar e colar o codigo no notepad++ e salvar no formato .html

  • Segue alteração do código alterado conforme muitos queriam desta forma o seu funcionamento:

    #box-toggle {
    width:500px;
    margin:0 auto;
    text-align:justify;

    }
    #box-toggle .tgl {margin-bottom:30px;}
    #box-toggle .tg2 {margin-bottom:30px;}
    #box-toggle .tg3 {margin-bottom:30px;}
    #box-toggle .tg4 {margin-bottom:30px;}

    #box-toggle span {
    display:block;
    cursor:pointer;
    font-weight:bold;
    font-size:12px;
    color:#c30;
    margin-top:15px;
    }

    jQuery.fn.toggleText = function(a,b) {
    return this.html(this.html().replace(new RegExp("("+a+"|"+b+")"),function(x){return(x==a)?b:a;}));
    }

    $(document).ready(function(){
    $('.tgl').before('16) Quais as garantias e seguranças em ser um franqueado?');
    $('.tgl').css('display', 'none')

    $('.tg2').before('Pergunta 2');
    $('.tg2').css('display', 'none')

    $('span', '#box-toggle').click(function() {
    $(this).next().slideToggle('slow')
    .siblings('.tgl:visible').slideToggle('fast');

    $(this).toggleText('Revelar','Esconder')
    .siblings('span').next('.tgl:visible').prev()
    .toggleText('Revelar','Esconder')
    });
    })

    resposta da pergunta 1.

    resposta da pergunta 2

    Para ver o script em ação acesse a página: http://www.franquia.delyver.com.br

    Att. Publycydade • http://www.publycydade.com.br

  • Fantástico este script. Realizei várias alterações a partir deste modelo e ficou como exatamente o cliente exigiu.

Share
Published by
Maujor

Recent Posts

Teste seu conhecimento #20

Em 2006 comecei a publicar nesse blog uma série de desafios CSS que consistiam em…

7 anos ago

Teste seu conhecimento #19

Há muito tempo que eu não publico um "Teste seu conhecimento". Esta semana, revendo algumas…

9 anos ago

JavaScript bubbling e capturing

Introdução Elementos da marcação HTML podem ser aninhados uns dentro de outros, criando-se uma cadeia…

10 anos ago

HTML5 – W3C versus WHATWG

HTML5? Web universal? É comum eu me deparar com dúvidas sobre a HTML5 não só…

10 anos ago

Seria esse o futuro das imagens responsivas?

Quem é Tab Atkins Jr? Tab Atkins Jr, um desenvolvedor americano, trabalhou durante muitos anos…

10 anos ago

BrazilJS Conf 2013

Pessoal, a BrazilJS Conf 2013 disponibilizou para o Maujor cupons de desconto para serem oferecidos…

11 anos ago