1
resposta

Dúvida sobre nth-child(2) - ainda não entendi a lógica

Não entendi porque foi usado nth-child(2) no primeiro elemento de .destaques__secundario.

No código HTML é o primeiro elemento com a classe .destaques__secundario. Antes dele é a classe destaques__principal.

<section class="destaques">
            <div class="destaques__principal caixa">
                <h3 class="destaques__titulo">Fortnite</h3>
            </div>
            <div class="destaques__secundario caixa">
                <h3 class="destaques__titulo">PUBG</h3>
            </div>
            <div class="destaques__secundario caixa">
                <h3 class="destaques__titulo">Slack</h3>
            </div>
            <div class="destaques__secundario caixa">
                <h3 class="destaques__titulo">Whatsapp</h3>
            </div>
            <div class="destaques__secundario caixa">
                <h3 class="destaques__titulo">CS: GO</h3>
            </div>
            ...
    </section>

Para aplicar o as configurações do PUBG, foi usado no CSS:

.destaques__secundario:nth-child(2) {
  background-image: url('../img/pubg.jpg');
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;

  grid-column-start: 4;
  grid-column-end: 4;

  grid-row-start: 1;
  grid-row-end: 1;

}
Eu vi a resposta que foi dada para a mesma pergunta do colega (https://cursos.alura.com.br/forum/topico-nth-child-2-205475), mas confesso que pra mim, isso ainda não faz sentido.

Pela resposta, tenho a impressão que eu poderia escrever destaques:nth-child(2) ao invés de destaques__secundario:nth-child(2) assim:

.destaques:nth-child(2) {
  background-image: url('../img/pubg.jpg');
  background-position: center;
  background-repeat: no-repeat;
  background-size: cover;

  grid-column-start: 4;
  grid-column-end: 4;

  grid-row-start: 1;
  grid-row-end: 1;

}

Mas não funcionou!

Pensei também em alterar para destaques__principal:nth-child(2) ao invés de destaques__secundario:nth-child(2) assim:

.destaques__principal:nth-child(2){
    background: url("../img/pubg.jpg") center / cover no-repeat;
    grid-column: 4 / 4;
    grid-row: 1 / 1;
}

Mas também não funcionou!

Pois bem, se eu indico a classe pai (.destaques), ela não funciona - imagino que seja por ser a classe pai e não filho, e essa pseudo classe funciona entre elementos irmãos (ou seja, filhos da classe .destaques).

Então se essa é a lógica, ao escrever .destaques__principal:nth-child(2), entendo que deveria funcionar, pois ainda que o elemento do pubg tenha um outro nome (no caso, secundário), ele vai pegar a posição dos elementos irmãos que pertencem ao elemento pai (destaques), que nesse caso é 2. Porém, novamente, não funcionou.

Se a lógica for indicar o nome da classe corretamente + a posição do elemento irmão, não seria melhor criar uma classe genérica (p.ex. destaques__itens) para todos elementos que pertencem ao elemento pai "destaques" e ao invés de "classificar" como destaques__principal e destaques__secundario, apenas informar sua posição?

.destaques__itens:nth-child(1){
    background: url("../img/fortnite.jpg") center / cover no-repeat;
    grid-column: 1 / 4;
    grid-row: 1 / 3;
}

.destaques__itens:nth-child(2){
    background: url("../img/pubg.jpg") center / cover no-repeat;
    grid-column: 4 / 4;
    grid-row: 1 / 1;
}
1 resposta

Oi Magno! Tudo certo?

A nomeação confunde um pouco mesmo. Mas olhando para a sintaxe do nth-child fica mais claro.

Nesse exemplo da aula, queremos estilizar o destaque PUBG que foi nomeado com a class="destaques__secundario caixa".

Temos mais de uma class com essa nomeação então vamos usar a pseudo-class :nth-child() para chama-la no CSS, sem precisar alterar o HTML.

Para isso, vamos analisar quem é o elemento pai e qual a posição dessa class em relação aos seus elementos irmãos.

O elemento pai da class destaques__secundario é o container section com a class destaques. Print do terminal com o código HTML demonstrando que a class destaques__secundário é o 2º filho do container destaques.

Olhando o print percebemos que a class destaques__secundario do PUBG é a 2ª div do container, ou seja, ele ocupa o 2º lugar entre seus elementos irmãos.

Por esse motivo atribuímos o valor 2 entre os parênteses, representando esse 2º filho. E chamamos o .destaques__secundario:nth-child(2) no CSS.

Print do seguinte trecho da dúvida do Magno: Pela resposta, tenho a impressão que eu poderia escrever destaques:nth-child(2) ao invés de destaques__secundario:nth-child(2) assim:

Se refizermos a linha de raciocínio anterior, vai percebe que chamando destaques:nth-child(2) o elemento pai seria a <main class="conteudo">, que possui apenas a <section class="destaques"> como filho.

Como o nth-child(2) da class destaques não existe, você não viu nenhuma alteração.

Print do terminal com o código HTML que demonstra que só existe um elemento filho para a class conteudo

E mesmo que houvesse um 2º filho, não estaríamos atingindo o objetivo de estilizar o destaque PUBG que está dentro da class="destaques".

Em relação ao destaques__principal:nth-child(2), gera conflito por conta da nomeação da class.

Trecho: não seria melhor criar uma classe genérica (p.ex. destaques__itens) para todos elementos que pertencem ao elemento pai "destaques" e ao invés de "classificar" como destaques__principal e destaques__secundario, apenas informar sua posição?

Acho que essa é uma escolha do programador. Pode ser que o professor fez isso para fins didáticos ou para facilitar o fluxo de trabalho. Não sei dizer.

Mas quando pensamos em boas práticas para nomeação de classes, é importante que uma class seja específica e ao mesmo tempo o mais genérica possível.

E da forma que o professor fez deu pra entender bem que entre os destaques temos o principal (que é o que ocupa o espaço maior do grid) e os secundários (que tem o mesmo tamanho entre eles e um peso menor de destaque em relação ao principal).

Esse artigo aqui fala um pouco sobre isso:

https://www.alura.com.br/artigos/organizando-o-css-no-seu-projeto

E para o :nth-child() também vale olhar uma documentação, porque tem vários seletores interessantes que facilitam o nosso trabalho sem precisar alterar o HTML.

https://developer.mozilla.org/pt-BR/docs/Web/CSS/:nth-child

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software