Certo dia me perguntei o quão complexo seria desenvolver um esquema de “abas” em HTML, partindo do zero. Existem vários plugins com essa funcionalidade na internet, porém, senti a necessidade de “praticar”, numa forma de explorar os recursos das tecnologias atualmente disponíveis e ver a que ponto elas realmente são “práticas” e “ágeis”.

O primeiro ponto seria desenvolver as abas com bordas arredondadas na parte superior. Antes das CSS3, era preciso montar todo um esquema utilizando várias imagens para simular essa borda, hoje, com a propriedade border-radius, essa passou a ser uma tarefa simples.

Tendo resolvido a primeira questão, o próximo passo seria tratar a “troca” de abas, alternando entre as “páginas” do conteúdo. Não existe um controle que se possa moldar como uma aba+página, logo, seria necessário dividir o componente em duas partes: cabeçalho (com as abas) e conteúdo (com as páginas contendo outros elementos quaisquer). Surge aí a primeira, digamos, dificuldade. Ao clicar em um elemento do cabeçalho, a respectiva página deveria ser selecionada. Em termos de design, seria interessante também que a aba selecionada tivesse um destaque em relação as outras. Sem problemas, o jQuery está aí para facilitar todo esse processo.

Vejamos então como ficou a estrutura do HTML (o primeiro passo):

Listagem 1: Estrutura do HTML


<div class="TabControl">
	<div id="header">
		<ul class="abas">
			<li>
				<div class="aba">
					<span>Tab 1</span>
				</div>
			</li>
			<li>
				<div class="aba">
					<span>Tab 2</span>
				</div>
			</li>
			<li>
				<div class="aba">
					<span>Tab 3</span>
				</div>
			</li>
			<li>
				<div class="aba">
					<span>Tab 4</span>
				</div>
			</li>
		</ul>
	</div>
	<div id="content">
		<div class="conteudo">
			Conteúdo da aba 1
		</div>
		<div class="conteudo">
			Conteúdo da aba 2
		</div>
		<div class="conteudo">
			Conteúdo da aba 3
		</div>
		<div class="conteudo">
			Conteúdo da aba 4
		</div>
	</div>
</div>

A estrutura é bastante simples: uma div chamada TabControl que contém duas divs principais em seu interior, as divs Content e Header.

Essa estrutura sozinha não faz muito sentido, é preciso aplicar uma folha de estilos para dar a ela a aparência adequada. O estilo (CSS) é exibido na Listagem 2 (no caso, utilizei a folha de estilos embutida no HTML, mas fica a critério do leitor optar por fazer dessa forma ou criar um arquivo externo).

Listagem 2: Folha de estilos utilizada


<style>
	body{font-family:Calibri, Tahoma, Arial}
	.TabControl{ width:100%; overflow:hidden; height:400px}
	.TabControl #header{ width:100%; border: solid 1px; overflow:hidden; cursor:hand}
	.TabControl #content{ width:100%; border: solid 1px;overflow:hidden; height:100%; }
	.TabControl .abas{display:inline;}
	.TabControl .abas li{float:left}
	.aba{width:100px; height:30px; border:solid 1px; border-radius:5px 5px 0 0;
		text-align:center; padding-top:5px; background:#3A5FCD}
	.ativa{width:100px; height:30px; border:solid 1 px; border-radius:5px 5px 0 0;
		text-align:center; padding-top:5px; background:#27408B;}
	.ativa span, .selected span{color:#fff}
	.TabControl #content{background:#27408B}
	.TabControl .conteudo{width:100%;  background:#27408B; display:none; height:100%;color:#fff}
	.selected{width:100px; height:30px; border:solid 1 px; border-radius:5px 5px 0 0;
		text-align:center; padding-top:5px; background:#27408B}
</style>

Após a aplicação destes estilos, a página deve ficar como na Figura 1.

Aparência inicial da página

Figura 1: Aparência inicial da página

Clicando sobre as abas, nada acontece AINDA. Falta implementar os scripts que darão “vida” ao TabControl.

O primeiro script a adicionar, é, na verdade, uma ligação à biblioteca jQuery, que é feita da seguinte forma:

Listagem 3: Referência à biblioteca jQuery.


<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>

Agora sim vamos ao script foco deste artigo, o qual pode ser visto na Listagem 4.

Listagem 4: Script de implementação das abas


01 <script type="text/javascript">
02 	$(document).ready(function(){
03 		$("#content div:nth-child(1)").show();
04 		$(".abas li:first div").addClass("selected");		
05 		$(".aba").click(function(){
06 			$(".aba").removeClass("selected");
07 			$(this).addClass("selected");
08 			var indice = $(this).parent().index();
09 			indice++;
10 			$("#content div").hide();
11 			$("#content div:nth-child("+indice+")").show();
12 		});
13 		
14 		$(".aba").hover(
15 			function(){$(this).addClass("ativa")},
16 			function(){$(this).removeClass("ativa")}
17 		);				
18 	});
19 </script>

Antes de tudo (nas linhas 3 e 4, respectivamente), deixamos visível a primeira página do TabControl, e adicionamos a classe selected à primeira aba.

Feito isso, trabalhamos no evento onclick das divs que se encontram no interior dos itens da lista que forma o cabeçalho. A explicação de cada linha segue logo abaixo:

6. Remove a classe selected de todas as abas que possam contê-la, deixando todas em estado comum.

7. Adiciona a classe selected à aba selecionada, dando a ela uma aparência diferenciada.

8. Recupera o índice da aba selecionada a partir da posição do item (<li>) que contém a div.

9. Incrementa a variável índice para ser usada no seletor nth-child(índice), pois a posição dos itens <li> começa em zero, enquanto no seletor nth-child, o primeiro índice é 1.

10. Esconde todas as páginas que pudessem estar visíveis no momento (apesar de só uma poder ser selecionada, não sabemos qual é exatamente).

11. Seleciona a página selecionada através da variável índice e a torna visível.

Por último, apenas a nível de design, usamos o evento hover das abas para alterar sua aparência ao passar o cursor do mouse sobre elas. A sintaxe desse evento é exibida na Listagem 5.

Listagem 5: Sintaxe do evento hover


$(elemento).hover(
	function(){/*função a ser executada ao pôr o cursor sobre o elemento*/},
	function(){/*função a ser executada ao tirar o cursor do elemento*/}
);

No caso, adicionamos a classe ativa ao passar o cursor sobre as abas e, ao removê-lo, removemos também a classe.

Bem, o artigo é bem simples, mas teve por objetivo mostrar, através de um exemplo prático, como as novas tecnologias web podem facilitar nossas vidas, tornando simples o que era tão complexo há pouco tempo.

Espero que tenham gostado. Um abraço e até a próxima oportunidade.

Leia o artigo Estrutura de abas com botão fechar em HTML, CSS e jQuery