Tableless - Desenvolvimento inteligente com Padrões Web

23/03/2009
CSS

Seletores do CSS: Pseudo-classes

Uma breve explicação sobre pseudo-classes, seus funcionamentos e tipos.

Por


Existem vários tipos de pseudo-classes. Podemos separá-las em dois grandes grupos: Estruturais e Dinâmicas. Existem outras pseudo-classes que não se encaixam nestes dois grupos principais, que controlam a interface do usuário, elementos de URLs e etc. Não irei me alongar em todos os grupos, entenda melhor sobre todos os grupos e pseudo-classes diretamente da fonte: CSS3 Selectors ou se quiser, temos uma tabela de compatibilidade de CSS para que você possa conferir o que funciona em cada browser.

Pseudo-classes Dinâmicas

As pseudo-classes dinâmicas controlam os estados dos elementos. Abaixo, vão alguns deles:

  • :hover – quando passamos o mouse em cima do elemento.
  • :active – quando ativamos o elemento. Por exemplo, quando clicamos em um link e não soltamos o botão do mouse. Nesse momento, estamos ativando a ação do elemento. Esse estado é ativado também quando navegamos pelos links pelo teclado utilizando o TAB. Este estado não há em todos os elementos.
  • :visited – quando o link é visitado.
  • :focus – quando um elemento recebe foco. Muito utilizado em campos de texto. Quando clicamos em cima um campo de texto para escrever, o elemento está ganhando foco.

Teoricamente, todos os elementos tem estes estados. Partindo dessa premissa, podemos fazer, por exemplo, um menu com submenu sem utilizar Javascript. Basta fazer com que ao passar em cima de uma LI, a UL que ela contém, apareça, ou seja, ganhe display: block;. Complicado? Claro que não. Veja o HTML abaixo:


Largue de ser preguiçoso, copie o código acima em um HTML com Doctype STRICT e veja o resultado no browser. Agora, defina o seguinte CSS:

ul li ul {
   display: none;
}

ul li:hover ul {
   display: block;
}

No seletor UL LI UL, você selecionou a UL que está dentro da LI, e definiu para que ela não aparecesse com a propriedade display: none;.
No seletor UL LI:HOVER UL, como no seletor acima, você selecionou a UL que está dentro da LI. Mas com uma diferença: você colocou logo após a LI a pseudo-classe :hover, o seja, você definiou a UL que está dentro da LI, mas só quando o mouse é passado em cima dessa LI. Complicado? Que nada. Veja aí no seu exemplo como ficou, ou veja aqui.

Eu não preciso dizer que isso não funciona no IE6. Esse artigo faz parte daquela série: o que podemos fazer sem o IE6.

Abriu um pouco a cabeça para várias possibilidades, não é? Pois é. Essa é a idéia.

Pseudo-classes Estruturais

As pseudo-classes estruturais servem para selecionarmos um elemento da estrutura do código. Existem várias, por exemplo:

:first-child – seleciona o primeiro filho de um outro elemento.
:last-child – seleciona o último filho de um elemento.
:root – representa um elemento que é a raiz do documento. No HTML 4, é sempre a tag HTML.
:nth-child() – permite que selecionemos qualquer elemento no meio de um grupo de elementos. Por exemplo, você pode selecionar linhas de uma tabela. Assim, podemos fazer uma tabela zebrada, sem a ajuda de javascript. Há variações dessa pseudo-classe para podermos pegar os elementos de baixo para cima (:nth-last-child) e assim por diante. Testei aqui e isso não funcionou no meu FF3 (mac).
:lang() – seleciona elementos que tem o atributo lang com um valor específico. Veja um exemplo.

Um exemplo básico.
Imagine que você tem o seguinte HTML:

Título do Destaque Nullam cursus, dui vitae rhoncus imperdiet, nibh justo fermentum lectus, ac faucibus est ipsum id mauris. Phasellus auctor pede sed sem. Proin metus diam, ullamcorper ac, aliquet sit amet, semper in, ipsum. Nullam turpis dui, tristique quis, cursus non, tristique ac, mauris. Nunc mauris. Sed adipiscing. Aliquam ultricies egestas eros. Etiam nec ipsum id justo vestibulum condimentum. Aenean rhoncus, erat at luctus tincidunt, dolor dolor pharetra sem, ac iaculis lacus neque ut lectus. Quisque elementum bibendum diam.
Título do Destaque Nullam cursus, dui vitae rhoncus imperdiet, nibh justo fermentum lectus, ac faucibus est ipsum id mauris. Phasellus auctor pede sed sem. Proin metus diam, ullamcorper ac, aliquet sit amet, semper in, ipsum. Nullam turpis dui, tristique quis, cursus non, tristique ac, mauris. Nunc mauris. Sed adipiscing. Aliquam ultricies egestas eros. Etiam nec ipsum id justo vestibulum condimentum. Aenean rhoncus, erat at luctus tincidunt, dolor dolor pharetra sem, ac iaculis lacus neque ut lectus. Quisque elementum bibendum diam.
Título do Destaque Nullam cursus, dui vitae rhoncus imperdiet, nibh justo fermentum lectus, ac faucibus est ipsum id mauris. Phasellus auctor pede sed sem. Proin metus diam, ullamcorper ac, aliquet sit amet, semper in, ipsum. Nullam turpis dui, tristique quis, cursus non, tristique ac, mauris. Nunc mauris. Sed adipiscing. Aliquam ultricies egestas eros. Etiam nec ipsum id justo vestibulum condimentum. Aenean rhoncus, erat at luctus tincidunt, dolor dolor pharetra sem, ac iaculis lacus neque ut lectus. Quisque elementum bibendum diam.

E agora, defina a formatação abaixo para este HTML:

div#destaques div{
	width: 300px;
	float: left;
	padding: 10px 30px;
	border-right: 1px solid black;
}

Ao aplicar esse código, você vai perceber que o último destaque também tem uma borda do lado direito. Normalmente, queremos as bordas apenas entre os elementos do meio. Para fazer isso por meios não muito inteligentes, nós teríamos que marcar algum dos divs das laterais para tirar a borda, ou marcar o div do meio para definir uma borda para os seus dois lados.
Mas considere que você não pode modificar o HTML por algum motivo, e apenas é liberado modificações pelo CSS, como fazer?
A pseudo-classe :last-child pode ajudar. Você quer retirar a borda do último filho do div #DESTAQUES. Você iria inserir uma linha de CSS assim:

div#destaques div:last-child {border-right:none;}

Veja o resultado final.

Você selecionou o DIV que é o último filho do div#destaques e retirou a borda da direita que havíamos dado logo anteriormente. Sem modificar o HTML, colocando novas tags ou novas classes apenas para retirar uma borda.

Há outras pseudo-classes como a :disabled ou :enabled, que modificam elementos com os atributos DISABLED ou ENABLED, como por exemplo, campos de texto, checkbox, radios etc.

O CSS pode fazer muito por nós, basta os navegadores implementarem essas possibilidades. É por isso toda essa campanha contra o Internet Explorer 6. Esse artigo e outros artigos fazem parte dessa campanha. É uma forma de mostrar o quanto perdemos de produtividade em nosso dia a dia.

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://twitter.com/diegoeis/

Veja os outros posts de

  • http://www.vedovelli.com.br Ved

    Excelente post. Infelizmente o exemplo http://tableless.com.br/wp-content/uploads/2009/03/lastchild.html nao funcionou nem no IE8. Quando será que a MS fará um trabalho decente? =(

  • Kaleb Martins

    Muito Show Diego. Graças ao Diego consegui fazer sites melhores e bem visto nos buscadores. Um exemplo disso é esse site http://californiaadministracao.com.br/ todo em padrões web e em WordPress.

    Muito obrigado DIEGO !! e grande post

    Kaleb Martins
    Grande Fã ;-)

  • http://juarezpaf.com Juarez P. A. Filho

    Mais um ótimo artigo Diego. Pseudo-classes são muito interessantes e com certeza podem nos dar alguns minutos a mais para relaxar. :)
    Em alguns casos como preciso dar suporte para alguns navegadores antigos uso jQuery para substituir essas pseudo-classes, em outros casos CSS puro e elegante.
    Estou gostando muito dessa série e estou retribuindo com screencasts lá no meu blog. Dá uma olhada ^^

  • http://linkdemusica.blogspot.com Samuel Moraes

    Adoro este tipo de artigo.
    Este nos faz recordar as reais funções de elementos que usamos com pouca frequência e acabamos por esquecê-los. Também gosto muito de ver exemplos de o que podemos fazer com determinados elementos. É sempre bom deixar o javascript e substitui-lo pelo CSS.

  • http://www.comunicaweb.com.br Leonardo

    Poxa show de bola o artigo.
    To adorando essa série.
    Algumas dessas pseudo-classes estruturais eram desconhecidas para mim, porém são de um uso que me enche os olhos de brilho e me dá vontade de realizar modificações em todos os clientes nesse exato momento.
    Porém tenho uma dúvida.
    A parte do “lang” não apareceu verde no IE7, porém no Firefox e no Chrome apareceu.
    O problema é aqui no meu navegador ou existe alguma compatibilidade que não deixa ele funcionar?
    Fora isso, o artigo tá sensacional, e vai me poupar linhas de códico e classes criadas. =D

  • http://www.comunicaweb.com.br Sodré

    Muito bom esse artigo.
    Me ajudou a resolver um probleminha que vinha tendo com menus horizontais.
    Alguns das pseudo-classes não funfo no meu IE 7.0 já no firefox belezera.
    Abraço a todos.

  • Frank Gilber

    Ótimo post Diego mais uma vez, você vem contribuindo para o nosso conhecimento e aperfeiçoamento profissional, valeu cara!:)

  • http://blog.marta.preuss.nom.br Marta

    Mas demora pra esse IE6 sumir do mapa? =/

    Esses seletores salvam a vida de um jeito tão simples, fácil, rápido, bonito e (com o perdão da palavra) f*d* que deveriam ter existido desde sempre!

    Obrigada pelos artigos!

  • http://www.adrianorosa.com Adriano Rosa

    Excelente artigo, fiz os testes no IE 8 e funcionou beleza!!!

    Abraços

  • http://linkdemusica.blogspot.com Samuel Moraes

    Infelizmente pode demorar para o IE6 desaparecer.
    Trabalho no SEBRAE-PI e aqui apenas a Unidade de TI pode usar o Firefox e o IE7. Para todos os outros usúarios da empresa existe um bloqueio que não permite que as páginas sejam carregadas no Firefox. E as atualizações do windows não chegam com o IE7. Para vocês terem uma idéia, até pouco tempo ainda se usava o Windows 2000 no meu departamento. Esse tipo de situação ainda é bem corriqueiro nas empresas.

  • http://www.workaholics.com.br Ariê

    Muito legal as Pseudo-classes Estruturais, as :focus, link, active e visited acho que são basicas para quem trabalha com css mas as restantes mostradas são muito legais, e até já vou colocar em pratica a first-child amanha para colocar um bg na primeira li do menu de um blog wordpress, fica mais facil, por não podermos colocar class aonde precisamos no menu do worpress por ser dinâmico.

    Visitem o site dos meus trabalhos a workaholics criação de sites e quem estiver afim de fazer parte da sociedade só dar um alô pelo contato.

  • Maurício Carneiro

    Diego,

    Você nomeou duas seções do post como “Pseudo-classes Estruturais”. Acontece que, segundo o W3C, as primeiras que você apresentou – :visited, :link, :hover, :active – são “Pseudo-classes Dinâmicas”.

    No mais, parabéns pelo trabalho.

    Maurício

  • Maurício Carneiro

    Pessoas,

    Não é só no IE o problema.

    Testei os seletores :nth-child, :nth-last-child e :nth-of-type no FF 3 no Mac OS X e nada de funcionar. No Safari 4 Beta, tudo como o esperado.

    []s

  • http://www.enfasetecnologia.com Murilo

    Olá legal , sempre via essas pseudo-classes imaginava mais ou menos isso que foi dito , mais não sabia ao certo ainda ,por que ninguém tinha falado nada.

    Boa mandou bem =D

  • http://designcombolachas.blogspot.com/ Thiago Cavalcanti

    Motivos não faltam, como este artigo muito bem demonstra, para abandonarmos o suporte ao IE6.

    Entretanto, casos como o que o Samuel Moraes falou aqui ainda são comuns, portanto ainda há ocasiões em que é necessário o uso de javascript para fazer com que o IE6 se comporte como um navegador moderno. Um bom exemplo disso é o suckerfish :hover de Patrick Griffiths e Dan Webb.

    Faz-se necessário que sejamos cuidadosos para que não alienemos uma porção ainda considerável dos usuários finais.

    Que fique claro que eu ODEIO o IE6 e seus (muitos) bugs e que mal posso esperar pelo dia em que não tenha mais que lidar com eles, mas até lá…

  • Calil

    Muito bom o post, curto e objetivo. Ajudou a esclarecer as pseudo-classes.
    Só uma dúvida: o 1o grupo que você apresentou não seriam as pseudo-classes dinâmicas?
    Abraço.

  • http://www.onebit.com.br André

    Muito bem explicado, entendi até o que não entendia muito bem e acabava não usando, venho cada vez mais ignorando o IE6, nos meus sites e blogs pessoais, nem testo mais no IE6…

  • http://www.chrisb.com.br/blog Chris Benseler

    Posso ser “chato”? A tabela de compatibilidade poderia ter o FF3, né? hehe

    []s!

  • Mateus

    Muito bom esse post, realmente ele expande bastante sua forma de desenvolver, mas é uma pena que, como sempre, os IE’s não colaboram com a gente… em todos (6, 7, e 8) o exemplo http://tableless.com.br/wp-content/uploads/2009/03/lastchild.html não funcionou… É inconcebível que uma empresa com o porte da Microsoft desenvolve, e continua desenvolvendo, softs tão problemáticos, usando como exemplo apenas o seu browser com o Firefox… É um absurdo.

  • Pingback: nth-child | Boas práticas de Desenvolvimento com Padrões Web

  • Pingback: Simples Tooltip com CSS | Geração Beta

  • Pingback: Mundo do Design » Blog Archive » Simples Tooltip com CSS