Postado por Cássio Fabre terça-feira, 25 de junho de 2013 às 11:04


E ai pessoal, tudo certo? Semana passada não houveram posts, se não estou enganado. Mas não foi porque não quis postar, mas tive um problema na hora de upar o vídeo da Parte 4 da série Aprenda HTML e CSS na Prática. Mas se tudo der certo, hoje ainda conseguirei colocar o vídeo aqui pra vocês. Mas por agora nosso assunto é apenas o CSS. Hoje aprenderemos a trabalhar com as pseudo-classes first-child, last-child e as intermediárias ("second-child", "third-child", ...), que fogem a este padrão. Bom, abra seu editor de código predileto e mãos à obra.

Quando falamos em first-child no CSS, estamos nos referindo exatamente ao que o termo sugere: o primeiro filho ou, no caso, a tag filha.

Bom, a primeira coisa que temos que ter em mente é que essas pseudo-classes se aplicam a qualquer coisa dentro do código HTML. Elas vão formatar a tag que você configurar e não aleatoriamente. O que isso significa? Que você terá que dizer ao CSS qual tag ele vai formatar. Vamos a um exemplo para melhor entendimento. Suponhamos o seguinte código, dentro da tag body:
<div id="teste">
    <p>TESTE 1</p>
    <p>TESTE 2</p>
    <p>TESTE 3</p>
</div>
Agora vamos colocar o seguinte CSS:
#teste p:first-child{
background: #159357;
}
Muito fácil de entender: temos um HTML simples e no CSS estamos dizendo para o navegador o seguinte:
Olha cara, você vai pegar a primeira tag <p> que estiver dentro da <div id="teste"> e vai colocar um plano de fundo verde.
No caso, a primeira tag <p> é a que tem escrito TESTE 1 dentro. E assim funciona também com a last-child. A única coisa que vamos mudar é no CSS de first-chil para last-child. Faça isso e veja a diferença. Legal, né?!

Uma coisa muito importante a se observar é em qual tag você vai colocar a pseudo-class. No exemplo acima, estamos tratando a tag <p> que é a tag de Parágrafo. Mas se por acaso você tivesse colocado a pseudo-class na #teste o efeito seria diferente, compreendendo toda a extensão do container. Vamos a um exemplo deste tipo, escreva o seguinte HTML dentro do body.
<div class="teste">
    <p>Teste 1</p>
    <p>Teste 2</p>
    <p>Teste 3</p>
</div>


<div class="teste">
    <p>Teste 4</p>
    <p>Teste 5</p>
    <p>Teste 6</p>
</div>
Agora vamos colocar o seguinte CSS:
.teste:first-child{
background: #159354;
}
Dessa vez dizemos ao nosso navegador:
Agora, meu camarada, você vai pegar a primeira <div class="teste"> que tiver dentro do HTML pintar toda ela de verde.
Faça o teste!

Isso funciona para qualquer coisa. Mais um exemplo para você entender melhor: suponhamos que queiramos pintar a primeira div que estiver no corpo do nosso código, independendo da id ou class dela, como vamos fazer? Vamos continuar com o mesmo HTML do exemplo acima, e apenas modificar o CSS para este:

body div:first-child{
background: #159354;
}

Troque novamente o first pelo last-child para ver a diferença. Se quiser que esta formatação se encaixe em outra tag como ul, li, p, tr, td ou qualquer outra basta substituir o div pela tag de sua preferência.

Ok, sabemos configurar a primeira tag filha e também a última, mas e as intermediárias? A segunda, terceira e outras que eventualmente possam ter? Bom, não existe uma pseudo-class second-child ou third-child. Então, como faz? Para esses casos existe duas formas que podemos utilizar para que funcione corretamente. Vamos pegar o HTML abaixo como exemplo:
<div class="teste">
    <p>Teste 1</p>
    <p>Teste 2</p>
    <p>Teste 3</p>
    <p>Teste 4</p>
</div>
Agora vamos ao CSS:
.teste p:nth-child(2){
background: #111;
color: #fff;
}
A pseudo-class nth-child trata de todas os "filhos", intermediários ou não, que no caso é o segundo identificado por (2). Basta você substituir o número pelo número de ordem do elemento que você quer formatar. Por exemplo, se quisermos trocar a cor do texto do <p>TESTE 3</p> basta fazermos isso:
.teste p:nth-child(3){
color: #888;
}

Como dissemos "intermediários ou não", isso significa que você pode utilizar esta forma para tratar da first-child também, substituindo o número entre parênteses por (1).

Em relação ao last-child, apesar de funcionar, não é aconselhável utilizar esta forma pois você teria que trocar o número manualmente no caso de colocar mais um elemento. Por exemplo, se você colocasse mais um <p>TESTE 5</p> dentro da <div class="teste">, e já tivesse uma formatação para o last-child que, no caso, é o  "TESTE 4" e passou a ser o TESTE 5, utilizando a pseudo-class nth-child(4), teria que substituir o (4) por (5), o que não é muito interessante, não é mesmo?

A outra forma de fazer isso, é "somando" as tags da seguinte forma:
.teste p:first-child + p + p{
background: #111;
color: #fff;
}
Neste caso, o navegador vai aplicar as configurações à tag <p> de número 3. Mas como assim? O navegador vai começar a somar a partir da pseudo-class que estiver antes do primeiro mais (+). No caso, a pseudo-class é a de número 1 (first-child) e são somados mais dois p, dando um total de "3p", ou seja, a "third-child". Isso é matemática básica. Claro que você pode somar a partir de outros números, como a partir da segunda tag, por exemplo:
.teste p:nth-child(2) + p + p{
background: #111;
color: #fff;
}

E por fim, a questão: Por que utilizar esse monte de configuração, e não apenas colocar class ou id direto nas tags para fazer os efeitos?
Além de deixar seu código mais limpo e profissional, essas configurações fazem com que fique tudo automático, ou seja, no caso de você precisar adicionar mais tags, não precisará ficar se preocupando em criar mais código CSS e nem reconfigurar o que já foi feito. De longe, vale muito a pena.

Mas e quanto à aplicação, posso usar em qualquer lugar e com qualquer tag? Como disse no começo do post: SIM! Particularmente eu uso muito quando vou criar menus. Vamos pensar em um menu simples, como o abaixo:
Eu usei os atributos first-child e last-child para trocar o background do primeiro e ultimo link do menu de para cores diferentes. Muito interessante isso. Abaixo o código que usei para fazer este menu. Primeiro o HTML:
<div class="menu-post">
  <ul>
   <li><a href="#">Home</a></li>
   <li><a href="#">Sobre</a></li>
   <li><a href="#">Contato</a></li>
  </ul>
 </div>
Agora o CSS:
.menu-post{
width: 95%;
height: 40px;
background: #ddd;
margin: 10px auto;
border-radius: 10px;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
padding-left: none;
font-family: calibri;
text-transform: uppercase;
}

.menu-post ul li{
display: inline;
}

.menu-post ul li a{
float: left;
padding: 10.5px;
border-right: 2px groove #fff;
text-decoration: none;
color: #444;
margin-left: -1px;
}

.menu-post ul li a:hover{
background: #efefef;
}

.menu-post ul li:first-child a{
border-radius: 10px 0 0 10px;
-webkit-border-radius: 10px 0 0 10px;
-moz-border-radius: 10px 0 0 10px;
}

.menu-post ul li:first-child a:hover{
background: #F90;
}

.menu-post ul li:last-child a{
border: none;
}

.menu-post ul li:last-child a:hover{
background: #f0331c;
color: #fff;
}

Mas se você pensa que é só isso, você está infinitamente enganado. Existem muito mais configurações, algumas até mesmo que os navegadores atuais nem suportam ainda. Então, espero que tenham gostado e espero voltar em breve com o vídeo. Até mais.

0 comentários:

Postar um comentário