Abas com CSS utilizando :target

Postado por: Pedro Rogério em
Pseudo seletor :target

Para aumentar a usabilidade do seu site o ponto inicial seria dar uma maior atenção aos links internos dos seu site, e hoje vou mostrar aqui a utilização do pseudo-seletor CSS3 :target, que é utilizado para manipular as âncoras do HTML. Já falei sobre a sua utilização em um outro post. Já mostrei em um post anterior os benefícios da utilização do pseudo seletor :target, onde eu tenho a possibilidade de aplicar qualquer estilo a âncora após o usuário clicar na mesma.

O exemplo de hoje foi baseado no exemplo citado na Revista W, edição 101, onde o autor Craig Grannell nos ensina a desenvolver um menu em abas que ao clicar o conteúdo é trocado. Isso até então era possível somente com a utilização de JavaScript, mas com a utilização do pseudo seletor :target isso agora fica fácil.

Primeiramente temos que montar a nossa estrutura HTML, muito simples e de fácil entendimento:

<div id="container">

    <ul id="tabs">
    	<li><a class="tab_pinceladas" href="#pinceladas" title="Pinceladas da Web" rel="me">Pinceladas da Web</a></li>
        <li><a class="tab_css" href="#css" title="CSS no Lanche" rel="alternate">CSS no Lanche</a></li>
    </ul>

    <div id="pinceladas">
    	<ul>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
        </ul>
    </div>

    <div id="css">

    	<ul>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
            <li><a href="#" title="Texto aqui">Texto aqui</a></li>
        </ul>

    </div>

</div>

Utilizei de uma div #container para conter toda a estrutura de nossas abas, após isso, utilizei de uma lista desordenada com os links para as tabs com nomes fictícios: pinceladas e css, vocês entenderão o por que disso quando verem o exemplo final. Após, defini o conteúdo de cada aba, na div #pinceladas conteúdo referente a aba pinceladas e na div #css conteúdo referente a aba css. Para aquele que já desenvolveram sistemas de tabs com JavaScript até agora estão se sentindo familiarizados com a estrutura, mas o grande segredo está no CSS:

* {
	padding: 0;
	margin: 0;
}
body {
	font: 62.5% "Lucida Grande", "Lucida Sans Unicode", Lucida, Arial, Helvetica, san-serif;
	padding: 30px;
}
a {text-decoration:none}
li {
	font-size:1.2em;
	list-style:none;
}

Primeiramente vamos aplicar algumas definições gerais ao nosso exemplo, como utilizar um CSS Reset genérico, após definimos tamanho e família de fonte e outros estilos. Os estilos listados abaixo serão os utilizados no exemplo:

#container {
	background-color:#aaa;
	border:10px solid #666;
	width: 300px;
	position: relative;
	overflow: auto;
	padding:20px;
}
#tabs li {
	float:left;
	text-align:center;
	width:150px;
}
#tabs li a {
	color:#000;
	padding:5px;
	display:block;
}
#pinceladas {
	background-color: #eaedf0;
}
#css {
	background-color: #69c;
}
#pinceladas a {
	color:#000;
}
#css a {
	color:#fff;
}
#pinceladas, #css {
	float:left;
	padding:10px;
	width:280px;
}
#pinceladas li, #css li {
	border-bottom: 1px dotted #000000;
	padding: 5px 0;
}
.tab_pinceladas {
	background-color:#eaedf0;
}
.tab_css {
	background-color:#69c;
}
#css {
	position: relative;
	margin-left: -300px;
	z-index: -1 !important;
}
#container :target {
	z-index: 1 !important;
}

No CSS listado acima, os estilos das linhas 1 até a 45 não existem segredo, mas é a partir da linha 46 as coisas começam a acontecer, pois temos que definir que uma das abas fiquem escondidas, por isso utilizamos z-index:-1. É obrigatório a definição de float para o conteúdo de nossas abas, como você pode verificar na linha 32, pois depois teremos que definir uma margem negativa para a aba que ficará escondida, caso contrário o espaço que ela ocuparia no fluxo normal da página ficaria visível.

Agora vamos a linha 51 onde aplicamos o pseudo seletor :target, que fará com que ao usuário clicar em uma das abas, seja definido um z-index maior e a aba que antes estava invisível ao usuário agora se torne visível. Finalmente vamos ver agora um exemplo de tabs com CSS funcionando.

Infelizmente o seletor :target não é suportado por todos os browsers, mas se vocês repararem no código fonte do exemplo, verão que foi utilizado um arquivo JavaScript chamado: csstarget.js, um script desenvolvido por Peter Ryan que faz com que o seletor :target funcione em todos os browsers que não suportam esse seletor corretamente.

O que também deve ser feito é que você deve definir uma classe no CSS, chamada .target para aqueles browsers que não suportam o :target, pois ela será utilizada pelo JavaScript para executar os efeitos, como você pode ver no código abaixo:

#container .target {
	z-index: 1 !important;/*Para Browsers que não suportam :target*/
}

Vejam o exemplo. Caso tenha interesse você pode baixar os arquivos utilizados no tutorial.

Posts Relacionados

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

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.

Central Server

17 Responses to “Abas com CSS utilizando :target”

  1. SikiGalo disse:

    Que pena!
    frustração total ao chegar no final do artigo e ler esta frase “Infelizmente o seletor :target não é suportado por todos os browsers”.
    Fica pra próxima!

  2. Dav7 disse:

    vinha agora perguntar a opiniao se valia a pena alterar o meu menu em abas .js do blogger por esta versão CSS, mas sabendo que não funciona com todos os browsers, achei melhor esquecer a ideia :(

  3. @Dav7,

    Se você não está nem aí para o Internet Explorer, pode usar perfeitamente essa técnica, mas se você quiser prestar suporte a ele basta adicionar o JavaScript que foi citado no exemplo.

  4. Dav7 disse:

    infelizmente vejo nas estatisticas do blog que mais de 70% entra com o IE

    Maioritariamente IE7

    :(

    são uma praga l-o-l

  5. Leonardo disse:

    Muito boa técnica!!!! Parabéns pelo post!

  6. @Dav7,

    Mas a grande sacada desse script é o tamanho do mesmo, cerca de 2KB. Agora imagine você desenvolver um sistema de abas semelhante a esse com jQuery, lá se vão quase 60KB de JavaScript. Sem sombra de dúvida o diferencial desse script é a performance.

  7. rafael veloso disse:

    Muitooo bacana, gostei mesmo, vou testar aqui e faze um modelo.

    t+

  8. Diego Pereira disse:

    Deviamos fazer um manifesto contra o internet explorer. Todos os desenvolvedores da Web colocando
    algum selo contra o IE ou a favor no FF.

  9. @Diego Pereira,

    Postei aqui uma ótima opção para tentar acabar com o Internet Explorer 6:

    http://www.pinceladasdaweb.com.br/blog/2009/04/16/ie6-upgrade-warning/

  10. Acoplando com uma solução no servidor para identificar o UA e servir a versão com js somente para os que não tem suporte ficaria muito bom…

  11. Helder disse:

    Muito boa essa solução. Em breve vou testar esse método. Parabéns …

  12. Marcio Zaiosc disse:

    Interessante, mas experimentem clicar algumas vezes nas abas e depois tentem voltar para a página anterior…

  13. Hikari disse:

    hehe essa quebra no Back inviabiliza mesmo essa feature!

  14. Pessoal tenho uma coisa a dizer:
    1º excelente esse tutorial script, principalmente quando se fala em espaço na página.
    2º não é o que todos pensam o IE8 está começando a superar expectativas para os desenvolvedores.
    3º o Chorme, digo de passagem, além de ter gostado muito por ser leve e em média 30% mais rápido que o Firefox.
    4º o Firefox me deixou na mão está semana, utilizo no meu index e em outra página accordion (Jquery) e por causa dele todos os meus comentários feitos no php estava dando conflito na minha página e deixando as divs embaralhadas.
    Como descobri isso ?
    Só acontecia no FF e pior estava aparecendo os marcadores dos comentários nas páginas que estão embaralhadas, com isso depois de ficar uns dois dias quebrando a cabeça percebi nas últimas das tentativas que se tirasse todos os comentários da página ele voltaria ao padrão dos atributos do CSS.
    Pronto agora está tudo funcionando bem.

    até

  15. Existe um problema com este método. Caso o conteúdo das abas possuem height’s dinamicos não funciona devido utilizar z-index;. Então um conteúdo fica por cima do outro.

    A solução para este caso é utilizar o visibility:hidden; e visibility:visible; e então ajustar as margens das abas.

    Quem não entendeu… bom, quando utilizar este método de uma forma mais dinâmica vai saber do que estou falando.

    Parabéns pelo post

  16. ps2: ou então o disply:none; e display:block;
    Isso eu digo no :target e .target.

    Qualquer dúvida so entrar em contato que eu mando um exemplo.

  17. [...] CSS3. A Pseudo-classe :target tem como função alterar os estilos do elemento alvo, já fiz outros tutoriais sobre o assunto, portanto, não vou me alongar explicando os benefícios de utilização dessa [...]

Leave a Reply