Então, você aprendeu os seletores básicos: identificador, classe, e descendente - e achou que tinha aprendido tudo? Se acha que sim, então você está deixando de aproveitar uma gama de possibilidades. Enquanto a maioria dos seletores mencionados nesse artigo fazem parte da especificação do CSS3, e estão, consequentemente, disponíveis apenas em navegadores modernos, você deve saber todos eles de cabeça.
Vamos falar primeiro dos mais óbvios, para os iniciantes, antes de começarmos a falar dos seletores mais avançados.
O asterísco (ou estrela) tem como alvo todos os elementos em uma página. Muitos desenvolvedores usam-no para zerar as margens e o preenchimento (margine padding, respectivamente). Embora isso funcione para testes rápidos, recomendo não usar essa técnica em produção. Ela deixa o navegador muito pesado (por ter de selecionar todo e cada elemento), além de ser desnecessário.
O * também pode ser usado como um seletor filho.
Isso mirará todo elemento que for filho de uma div com um identificador nomeado de #container. Novamente, não use muito essa técnica em produção. De preferência, nunca.
Prefixar um seletor com o "jogo da velha" (ou cerquilha, caso prefira), permite mirar algum elemento com um identificador. Ele é um dos seletores mais usados, contudo, seja cuidadoso ao usar seletores com identificador.
Faça-se a seguinte pergunta: Preciso, realmente, aplicar um identificador a esse elemento para poder selecioná-lo
Seletores identificador são rígidos e não permitem reuso. Se possível, tente usar, primeiro, o nome da tag, um dos novos elementos do HTML5 ou uma pseudo-classe.
Esse é um seletor de classe. A diferença entre um identificador e uma classe é que, com a classe, você pode selecionar vários elementos. Use uma classe quando você precisar estilizar um grupo de elementos. Alternativamente, use um identificador quando precisar achar "uma agulha num palheiro", para estilizar um único elemento.
O próximo seletor mais comum é o seletor de descendência.Quando precisar ser mais específico em seus seletores, use esse. Por exemplo, se, ao invés de mirar todas as tags de âncora (a), talvez você só precise selecionar aquelas que estão dentro de uma lista não ordenada? Esse seletor, o seletor descendente, é especificamente para isso.
Dica - Se seu seletor parecer com isso X Y Z A B.error, tenha certeza que há algo errado. Pergunte-se se, realmente, é necessário todo esse peso, toda essa especificidade.
E se você quiser selecionar todos os elementos da página, de acordo com o tipo deles, ao invés do seu identificador ou classe? Faça o simples e use um seletor de tipo. Se você precisar selecionar todas as listas não ordenadas, use ul {}.
Nós usamos a pseudo-classe :link para selecionar todas as âncoras que foram clicadas.
Alternativamente, nós também temos a pseudo-classe :visited, que, como esperado, permite-nos aplicar uma estilização específica somente às âncoras da página que já foram clicadas ou visitadas.
Esse é chamado de seletor adjacente. Ele selecionará somente o elemento imediatamente após o primeiro elemento. No exemplo acima, selecionará só o primeiro parágrado após cada ul na página, e fará que ele tenha a cor vermelha.
A diferença entre o seletor descendente X Y padrão e o seletor X > Y é que o último somente seleciona filhos diretos. Por exemplo, considere o código HTML abaixo.
<li> Filho </li>
<li> Item da lista </li>
Um seletor #container > ul somente selecionará aquelas uls que são filhas diretas de uma div com identificador nomeado como container. Ele não selecionará, por exemplo, a ul que é filha do primeiro li.
Por esse motivo, há benefícios relacionados a performances ao usar o combinador de filhos. Na verdade, é recomendável utilizá-lo quando estiver trabalhando com motores de seleção de CSS criados em JavaScript.
O seletor de irmão é parecido com o seletor X + Y, contudo, é menos restritivo. Enquanto o seletor adjacente (ul + p) só selecionará o primeiro elemento, imediatamente, após o elemento inicial, esse é mais generalista. Ele selecionará, usando o nosso exemplo acima, qualquer elemento p, desde que ele venha depois de um elemento ul.
Chamado de seletor de atributos, no nosso exemplo acima, ele só selecionará aquelas âncoras com um atributo title. As âncoras que não tiverem esse atributo, não receberão esse estilo em particular. Mas, e se precisarmos ser mais específicos? Bem...
O trecho acima estilizará todas as âncoras que apontem para o endereço http://net.tutsplus.com; eles serão estilizados com o verde do nosso site. Todas as outras âncoras não serão afetadas.
Atente que estamos envolvendo o valor entre aspas. Lembre-se de fazer isso quando estiver trabalhando com motores de seleção CSS criados em JavaScript. Quando possível, sempre use os seletores CSS3 ao invés dos métodos não oficiais.
Ele funciona muito bem, embora seja um tanto rígido. E se o link, realmente, direcionar para o Nettuts+, mas, o endereço usado seja o nettuts.com ao invés da URL completa? Para esses casos, podemos usar a sintaxe de expressões regulares.
Aqui está; é isso o que precisamos. O asterísco designa que o valor utilizado no seletor deve aparecer em algum lugar do valor do atributo do elemento. Assim, esse novo seletor cobre nettuts.com, net.tutsplus.com, e até o tutsplus.com.
Tenha em mente que ele é bem abrangente. E se a âncora apontar para algum site que não seja da Envato, mas que tenha em sua URL a cadeia de caracteres tuts? Quando precisar ser mais específico, use ^ e $, para referenciar o começo e o fim de uma cadeia de caracteres, respectivamente.
Você, alguma vez, já parou para pensar como alguns sites fazem para mostrar um pequeno ícone ao lado de alguns links que levam para outros sites? Tenho certeza que você já viu algo parecido antes; Eles são ótimos lembretes que o link em questão levará você para um site completamente diferente.
Isso é bem fácil de fazer, usando o acento circunflexo. Ele é, comumente, usado em expressões regulares para designar o começo de uma cadeia de caracteres. Se quisermos selecionar todas as âncoras que tem um atributo href que começam com http, nós poderíamos usar um trecho de código parecido com o que temos acima.
Atente que não estamos procurando por http://; isso é desnecessário e não leva em consideração as URLs que começam com https://.
Agora, e se quiséssemos estilizar todos os links que apontam, digamos, para uma foto? Nesses casos, temos de pesquisar pelo final da cadeia de caracteres.
Nós usaremos um símbolo de expressão regular, o $, para referenciar o final da cadeia de caracteres. Nesse caso, nós buscaremos por todas as âncoras que apontem para uma imagem – ou, pelo menos, uma URL que termine com .jpg. Lembre-se que isso não funcionará com gifs e pngs.
Lembre-se do exemplo oito; como fazer para referenciar todos os tipos de imagens: png, jpeg,jpg e gif? Bem, poderíamos criar múltiplos seletores, dessa forma:
Mas, isso é muito chato e ineficiente. Outra possível solução é usar atributos customizados. E se adicionarmos um atributo data-filetype a cada uma das âncoras que apontem para uma imagem?
<a href="path/to/image.jpg" data-filetype="image"> Link para Imagem</a>
Então, com esse gancho, podemos usar os seletores de atributo padrão para selecionar somente essas âncoras.
Eis um seletor especial que impressionará seus amigos. Nem todo mundo sabe desse truque. O til (~) permite-nos selecionar um atributo que tem, em seus valores, uma lista separada por espaços.
Seguindo com o nosso atributo customizado do seletor quinze, poderíamos criar um atributo data-info, que pode receber uma lista de itens, separados por espaço, para podermos anotar o que quisermos. Nesse caso, nós tomaremos nota dos links externos e dos links para imagens – só para exemplificar.
"<a href="path/to/image.jpg" data-info="external image"> Clique em mim </a>
Com esse código, agora podemos selecionar qualquer tag que tenha qualquer um desses valores, usando o truque do seletor de atributos com o ~.
/* Seleciona o atributo data-info que contem o valor "external" */
/* E aquele que contem o valor "image" */
Essa pseudo-classe somente selecionará o elemento da interface que foi marcado como selecionado – como um botão radio ou checkbox. Simples assim.
As pseudo-classes before e after são muito boas. Parece que, todos os dias, o pessoal encontra maneiras criativas e efetivas de usá-las. Elas, simplesmente, geram conteúdo ao redor do elemento selecionado.
Vários aprenderam sobre eles quando foram encontrar o hack do ajuste dos floats (alguns conhecem como clear-fix hack).
Esse hack usa a pseudo-classe :after para adicionar um espaço após o elemento e, então, limpa-lo. É um ótimo truque para se ter em seu cinto de utilidades, principalmente quando a técnica do overflow: hidden; não é possível ser utilizada.
Para outros usos criativos dessa técnica, veja meu guia rápido sobre como criar sombras.
De acordo com a especificação dos Seletores CSS3, você deveria, tecnicamente, usar a sintaxe dos pseudo-elementos de dois "dois pontos", ::. Entretanto, para manter-se compatível, o navegador aceita o uso com um único "dois pontos". Na verdade, é melhor você usar a versão com um único "dois pontos" em seus projetos.
Vamos lá. Você já conhece esse. O termo oficial para esse seletor é pseudo-classe de ação do usuário. Pode parecer confuso, mas não é. Quer adicionar algum estilo específico ao passar o mouse sobre algum elemento? Esse seletor dará conta do recado!
Tenha em mente que versões antigas do Inter Explorer não respondem quando a pseudo-classe :hover é aplicada a qualquer outra coisa que não seja uma âncora (a).
Você, geralmente, selecionará esse seletor quando for aplicar, por exemplo, um border-bottom a âncoras quando passar o mouse sobre o link.
Dica - border-bottom: 1px solid black; é bem melhor que usar text-decoration: underline;.
A pseudo-classe negação é, particularmente, útil. Digamos que você queira selecionar todas as divs, exceto por aquelas que contenham um identificador nomeado de container. O trecho acima lida com essa tarefa, perfeitamente.
Ou, se eu quisesse selecionar todos os elementos (o que não é recomendado), exceto pelas tags de parágrafo, poderíamos fazer assim:
21. X::pseudoElemento
Nós podemos usar pseudo-elementos (designados por ::) para estilizar fragmentos de um elemento, como a primeira linha ou uma primeira letra. Lembre-se que essa regra precisa ser aplicada a elementos do tipo bloco para surtirem efeito.
Um pseudo-elemento é composto por dois "dois pontos": ::
Selecione a Primeira Letra de um Paraágrafo
Esse trecho encontrará os parágrafos de uma página e, então, buscará só a primeira letra de cada um desses elementos para aplicar o estilo.
Isso é, geralmente, usado para criar estilos que remotem à estilização que jornais aplicam à primeira letra de um artigo.
Selecione a Primeira Linha de um Parágrafo
De forma semelhante, o pseudo-elemento ::first-line irá, como esperado, estilizar, somente, a primeira linha do elemento em questão.
"Para manter a compatibilidade com as folhas de estilos existentes, os navegadores devem, também, aceitar a notação anterior, com um 'dois pontos', introduzida nas especificações CSS nível 1 e 2 (precisamente, :first-line, :first-letter, :before e :after). Essa compatibilidade não é permitida para os novos pseudo-elementos nesta especificação." - Fonte
Você se lembra quando tinha de indicar um elemento específico de um conjunto de elementos? a pseudo-classe nth-child acaba com esse problema!
Atente que o nth-child aceita um número inteiro como parâmetro, entretanto, a contagem não inicia em zero (como nas arrays e strings em programação). Se você deseja selecionar o segundo item de uma lista, faça assim li:nth-child(2).
Nós podemos, até mesmo, selecionar um número variável de elementos filhos. Por exemplo, nós podemos fazer algo como li:nth-child(4n), para selecionar todos os itens que estejam em uma posição que seja múltipla de quatro.
E se tivéssemos uma enorme lista de itens em uma ul e só precisássemos acessar o terceiro item, começando a contagem a partir do último elemento? Ao invés de fazer algo como li:nth-child(397), você pode usar a pseudo-classe nth-last-child.
Essa técnica funciona quase igual à técnica dezesseis, entretanto, a diferença é que ela começa do último elemento do conjunto e faz o caminho inverso até o primeiro elemento.
Haverá vezes que, ao invés de selecionar um elemento filho, você precisará de um certo elemento de um certo tipo.
Imagine um código que contenha cinco listas não ordenadas. Se você quiser estilizar, somente, a terceira ul e não tem um identificador para usar, você pode usar a pseudo-classe nth-of-type(n). No trecho acima, somente a terceira ul terá uma borda.
E, sim, para manter a consistência, nós também podemos usar a pseudo-classe nth-last-of-type para iniciar a contagem dos seletores pelo fim da lista e fazer o caminho inverso até o elemento desejado.
Essa pseudo-classe estrutural permite-nos selecionar o primeiro elemento do conjunto alvo. Você, geralmente, usará essa técnica para remover bordas dos primeiros e últimos elementos de listas.
Por exemplo, digamos que você tem uma lista e cada item dessa lista tem border-top e border-bottom. Bem, com esse arranjo, o primeiro e último elementos parecerão um pouco estranhos.
Muitos projetistas aplicam classes chamadas primeira e última para compensar isso. Para evitar esse tipo de coisa, você pode usar essa pseudo-classe.
O seletor oposto ao first-child, o last-child, selecionará o último item do conjunto alvo.
Vamos construir um exemplo simples para demonstrar um dos possíveis usos dessas pseudo-classes. Criaremos uma lista estilizada.
Nada especial, aqui. Só uma lista simples.
Esse estilo trabalhará o plano de fundo (background), removerá o preenchimento padrão (padding) que o navegador atribui à ul e aplica as bordas a cada elemento li para criar um ar de profundidade.
Para criar um ar de profundidade às suas listas, aplique uma cor à border-bottom a cada li, com um ou dois tons mais escuros que a cor do plano de fundo do li. Depois, aplique uma cor à border-top que seja um ou dois tons mais claros.
O único problema, como mostrado na imagem acima, é que uma borda será aplicada à parte de cima e à parte de baixo da lista desordenada – o que é estranho. Vamos usar as pseudo-classes :first-child e :last-child para ajustar isso.
E é isso. Resolvemos!
SIM – o IE8 dá suporte ao :first-child, mas não ao :last-child. Vai entender.
Francamente, você, provavelmente, não usará muito a pseudo-classe only-child. De qualquer modo, ela existe para o caso de você precisar.
Ela permite que você selecione aqueles elementos que são os únicos filhos de um certo elemento. Levando em consideração o trecho acima, somente o parágrafo que for o único filho de uma div ficará colorido de vermelho.
Vamos assumir que seja esse o nosso HTML.
<div><p> Meu parágrafo aqui. </p></div>
<p> Dois parágrafos no total. </p>
Nesse caso, os parágrafos da segunda div não serão afetados; somente os da primeira div. Assim que você inserir mais de um elemento filho nessa div, a pseudo-classe only-child deixará de funcionar.
Essa pseudo-classe estrutural pode ser usada de algumas formas bem interessantes. Ela selecionará elementos que não tem nenhum elemento irmão dentro do elemento pai. Como exemplo, selecionemos todas as uls que tem somente um único li.
Primeiro, pergunte-se como você resolveria isso. Você poderia usar o ul li, mas, ele selecionaria todos os itens da lista. A única solução é usar a pseudo-classe only-of-type.
A pseudo-classe first-of-type permite que você selecione o primeiro irmão de um conjunto de elementos do mesmo tipo.
Para entender melhor, façamos um teste. Copie o código abaixo em seu editor de códigos:
<p> Meu parágrafo aqui. </p>
<li> Item 1 da Lista </li>
<li> Item 2 da Lista </li>
<li> Item 3 da Lista </li>
<li> Item 4 da Lista </li>
Agora, sem continuar lendo, descubra como selecionar somente o "Item 2 da Lista". Quando descobrir (ou desistir), continue a leitura.
Há várias maneira de resolver esse teste. Nós usaremos alguns deles. Primeiro, usando o first-of-type.
Esse trecho de código, essencialmente, diz "encontre a primeira lista não ordenada na página, então encontre somente os filhos imediatos dessa lista e que são "itens de lista". Depois, filtre esses itens e pegue somente o segundo.
Outra opção seria usar o seletor adjacente.
Nesse cenário, nós encontramos a ul que está, imediatamente, após um p, e, então, encontramos o último item desse elemento.
Nós podemos ser bem desagradáveis ou brincalhões o quanto quisermos com esses seletores.
Dessa vez, nós pegamos o primeiro elemento ul da página e, então, encontramos o primeiro item da lista, na ordem reversa dos itens! :)
Se você tem de lidar com navegadores antigos, como o Internet Explorer 6, você ainda tem de tomar cuidado com esses novos seletores. Porém, não deixe isso deter seu aprendizado. Você estaria fazendo um desserviço a você mesmo. Tenha certeza de visualizar a lista de compatibilidade com os navegadores. Alternativamente, você pode usar o excelente script IE9.js do Dean Edward, para permitir que esses seletores sejam usados em navegadores.
Segundo, quando for trabalhar com bibliotecas, como a popular jQuery, sempre use os seletores nativos do CSS3 ao invés dos métodos/seletores customizados da biblioteca, sempre que possível. Isso fará seu código mais performático, uma vez que o motor de seleção poderão usará o analisador nativo do navegador, ao invés do seu próprio.