Imagem post: CSS3 – Abas com a pseudo-classe :target
Client-Side

CSS3 – Abas com a pseudo-classe :target

Fazer abas sempre foi muito chato para mim. Agora, os problemas acabaram com o :target.

Por
14

O CSS está cada vez mais facilitando as coisas. Alguns problemas que eram resolvidos apenas via Javascript já podem ser resolvidos inteiramente com CSS. Obviamente que para alguns browsers temos que usar algum script para conseguir a compatibilidade. Mesmo assim, se for já possível utilizar as novas maravilhas do CSS 3 e outras compatibilidades que estão surgindo do CSS 2.1, faça-o já. Você com certeza vai se agradecer um tempo próximo! ;-)

Um caso muito comum na produção de sites é a construção de tabs. Todo desenvolvedor já deve ter feito pelo menos uma vez na vida um script de tabs. Com a pseudo-classe :target seus problemas acabaram.

Quando queremos relacionar um link na própria página, utilizamos o recurso de “âncora”. Quando colocamos um link com o valor assim:

[cc lang="html"]
Link
[/cc]

Falamos para o browser que ao clicar no LINK, ele deve encontrar um ponto na página chamado, nesse exemplo, nome-da-ancora. Ele vai encontrar o elemento na página que tenha um ID com esse nome e navegará a barra de rolagem até a posição deste elemento. Você já deve saber disso e já deve ter visto funcionando.

Com a pseudo-classe :target isso ganha nova vida. O :target consegue relacionar isso a um objeto de forma que se você estiver criando abas (tabs), ele mostra automaticamente a aba relacionada. Vamos ao exemplo. Primeiro faça um HTML como o abaixo.

[cc lang="html"]

Primeira Aba
Primeira Aba 2
Primeira Aba 3

[/cc]

Note um detalhe muito importante: o valor do HREF dos links é exatamente o nome do ID dos DIVs referente ao conteúdo das abas.

Agora, para formatar e deixar bonitinho:

[cc lang="html"]
* {margin:0; padding:0;}
body {
font:13px verdana, arial, tahoma;
}

ul { margin:20px 20px 0; list-style:none;}
li {float:left;}
.itens a {
float:left;
border:1px solid black;
background:gray;
padding:5px 15px;
color:#FFF;
text-decoration:none;
}

.itens a:focus {background:red;}

.aba { padding:0 20px;width:400px; clear:both;}
.aba div {
background:white;
border:1px solid black;
padding:10px;
width:100%;
display:none;
}

.aba div:first-child {
display:block;
}

[/cc]

Note que a última linha está dizendo para que os DIVs referentes às tabs fiquem escondidas e que só a primeira apareça.

A coisa toda acontece aqui, com uma linha de código:
[cc lang="html"]
.aba div:target {
display:block;
}
[/cc]

Essa linha entende o valor do HREF do link, capturando o ID referente ao div que o browser deve mostrar.

Veja o exemplo completo aqui.

14

Por Diego Eis

Diego Eis criou o Tableless para disseminar os padrões web no Brasil. Como consultor já treinou equipes de empresas como Nokia, Globo.com, Yahoo! e iG. É palestrante e empreendedor.

http://about.me/diegoeis/

Mais posts do autor

  • Arthur Corenzan

    Eu conhecia essa técnica, que inclusive é compatível com IEs. (o único drawback é o fato de alguns navegadores habilitarem o scroll na que tem overflow:hidden, para amenizar isso, usa-se as abas uma ao lado da outra, ai invés de uma embaixo da outra.)

    http://www.3point7designs.com/blog/cssdomtabs.html

  • http://admolin.com/ André Dal Molin

    Legal d+! E com CSS3 dá para fazer uma transição legal entre as abas, para não ficar “seco”.
    E não sei se percebeu, a primeira aba está sempre aberta (uso Firefox 3.6), mesmo quando abro outras (http://i53.tinypic.com/10wuuqp.png).

    André.

  • Fabiana Simões

    O mesmo que aconteceu com o André, aconteceu comigo. Imagino que o problema não seja de compatibilidade, mas sim que a div:first-child nunca volta a ser display:none.

  • Fabiana Simões

    O mesmo que aconteceu com o André, aconteceu comigo.
    Acho que o problema não é de compatibilidade, mas sim que #aba1 nunca volta a ter display: none por causa do seletor .aba div:first-child.

  • Ray

    Super dica do Arthur Corenzan. Funciona até no IE6, hehehe.

  • http://twitter.com/diegoeis/ Diego Eis

    Arrumei. Faltou umas linhas de position. ;-)
    Mas o :target funciona com outros exemplos.. É só usar a imaginação.

  • http://www.macola.com.br André Mácola

    Pena que não funciona no IE…

  • estenio

    o legal disso é que da pra fazer um a carrossel estático agora o lado ruim não funciona no ie8 nem no 7 nem preciso dizer pq né

  • Rarylson Freitas

    A solução possui algumas limitações. Por exemplo, não se podem passar parâmetros por GET: http://tableless.github.com/tableless/aba-target.html#aba3?id=4 não funciona; Segundo, se eu precisar de duas ou mais regiões com abas, ou mesmo se quiser criar um sumário com links a exemplo do que é implementado nas wikis, a solução não pode ser aplicada. Na realidade, a pseudo-classe :target não foi desenvolvida para abas, assim como um hiperlink com uma URL não foi feito para navegar entre abas.
    De qualquer modo, a solução é criativa e mostra a versatilidade e o poder dos novos elementos CSS3.

  • wellington

    Rarylson Freitas vc pode mudar a pocisão do seu parametro assim

    http://tableless.github.com/tableless/aba-target.html?id=4#aba3

  • http://www.dejotaweb.xpg.com.br Diego

    nossa cara! vlw mesmo estava procurando por isso ja fazia algum tempo o ccs3 chegou pra ficar em ele esta facilitando nossa vida muito rs

  • http://iepm12.com Natanael Lopes

    Interessante o artigo.
    Porém me recaiu uma questão:

    - Comportamentos não deveriam ser feitos com JS?

  • http://twitter.com/gustvomelo Gustavo Melo

    ótimo artigo.

  • Pingback: Abas com a classe :target | essencial arte

Mais artigos