# Combinação de seletores CSS

> Domine combinações de seletores CSS para regras mais eficazes. Aprenda descendentes, filhos diretos, irmãos adjacentes e seletores compostos.

URL: https://dpw.dev/css/combinacao-seletores-css/  
Publicado em: 2019-03-07  
Categoria: css  
Tags: basico-da-web  
Autor: Tárcio Zemel

Saber fazer **combinação de seletores CSS** é uma das partes mais importantes para se formar uma regra CSS eficaz.

> Artigo baseado em [Combining CSS Selectors](http://galjot.si/combining-css-selectors).

Existem métodos diferentes para se combinar seletores CSS. Os principais são (parênteses indicando o nível da Recomendação):

- - [Seletor descendente](#seletor-descendente), (Nível 1)
    - [Seletor descendente direto](#seletor-descendente-direto), [(Nível 2)](http://www.w3.org/TR/CSS2/selector.html)
    - [Seletor irmão](#seletor-irmao), ([Nível 3](http://www.w3.org/TR/css3-selectors/))
    - [Seletor irmão adjacente](#seletor-irmao-adjacente), [(Nível 2)](http://www.w3.org/TR/CSS2/selector.html)
    - [Composto de vários seletores de classe ou ID](#composto-seletores),
    - [Seletor de contexto ("seletor ascendente")](#seletor-contexto) ([Nível 4](http://dev.w3.org/csswg/selectors4/)).

> **Atenção:** Seletores Nível 4 ainda não são uma Recomendação oficial W3C, não possuindo amplo suporte pelos navegadores.

## Seletor descendente

**Padrão**: `E F`

Corresponde a qualquer elemento `F` que seja um **descendente** (esteja "dentro") de um elemento `E`.

**Exemplo CSS**: `h1 em {color: blue; }`

**Exemplo HTML**: `<h1>será <em>azul</em>&lt;/h1>`

_Corresponde a um elemento EM contido em um elemento H1._

Técnica básica e provavelmente a mais utilizada, que já estava presente no [CSS Level 1](https://www.w3.org/TR/CSS1/#contextual-selectors), de 1996.

## Seletor descendente direto

**Padrão:** `E > F`

Corresponde a qualquer elemento `F` que seja um **filho direto** (descendente de primeiro nível) de um elemento `E`.

**Exemplo CSS:** `body > p { color: blue; }`

**Exemplo HTML:**

```html
<body>
    <p>Parágrafo azul.</p>
</body>
```

Exemplo onde não corresponde ao elemento `<p>`:

```html
<body>
    <div>
    	<p>Não é um parágrafo azul.</p>
    </div>
</body>
```

_O elemento `<p>` é filho de um elemento `<div>`, portanto, as regras CSS não se aplicam._

Também é possível combinar seletores descendentes diretos com seletores descendentes, como em: `div ul > li span`.

## Seletor irmão

**Padrão:** `E ~ F`

Este seletor para combinação de seletores CSS corresponde quando um elemento `F` é precedido por um elemento `E` (**não necessariamente de imediato**, como no caso de `E > F`).

**Exemplo CSS:** `h1 ~ p { color: grey; }`

**Exemplo HTML:**

```html
<h1>Título</h1>
<span>Recentemente publicado</span>
<p>Parágrafo cinza.</p>
```

## Seletor irmão adjacente

**Padrão:** `E + F`

O seletor corresponde se `E` e `F` compartilham o mesmo pai e `E` **precede imediatamente** `F`.

Significa que seleciona todos os elementos `F` que são colocados imediatamente após os elementos `E`.

**Nota**: A r_egra de estilo é aplicada a um elemento que é correspondido pelo seletor `F`._ 

**Exemplo CSS:** `h1 + h2 { opacity: 0.8; }`

**Exemplo HTML:** 

```html
<h1>Título</h1>
<h2>Subtítulo com pouca opacidade.</h2>
<p>Paragraph</p>
```

Exemplo **onde não corresponde:**

```html
<h1>Título</h1>
<p>Paragraph</p>
<h2>Subtítulo com opacidade normal.</h2>
```

_Isso é porque `<h2>` **não é seguido imediatamente** após um elemento `<h1>`._

Muito útil, mas raramente usado.

## Composto de vários seletores de classe ou ID

**Padrão:** `.class1.class2(.classN)` / `#id.class1(.classN)` / `.class1(.classN)#id`

**Exemplo CSS:** `.modal.modal-red { border-color: red; }`

**Exemplo HTML:** 

```html
<div class="modal modal-red">
    Modal com borda vermelha
</div>
```

**Exemplo NÃO funcionando**:

```html
<div class="modal">
    <p class="modal-red">
        Sem borda vermelha
    </p>
</div>
```

_Isso é porque um elemento que é correspondido por `.modal-red` é um filho de `.modal` e não um elemento com 2 classes compostas._

Isso é complicado, mas muito útil se você seguir essas recomendações [SMACSS (Scalable and Modular Architecture for CSS)](http://smacss.com/) Você pode ter:

- várias classes;
- seletor de ID e várias classes;
- várias classes mais seletor de ID;
- várias classes mais o seletor de ID e várias classes.

(O último caso é um pouco bobo, mas funciona)

Em [Seletores CSS Nível 3](http://www.w3.org/TR/css3-selectors/) não havia muita novidade em relação à combinação de seletores, apenas o seletor de irmão adjacente.

## Seletor de contexto ("seletor ascendente")

**Padrão:** `E:has(F)`

Corresponde a um elemento `E` que é pai de um elemento `F`.

A correspondência do seletor pode ser identificada explicitamente ao colocar  `:has()` em um dos seletores. Também pode ser explicado como um "**seletor ascendente**".

**Exemplo CSS:**

`a:has(> img) { border: 1px solid green; }` faz com que links que tenham imagens dentro rrecebam uma borda verde.

`dt:has(+ dt) { border: 1px solid red; }` faz com que elementos `<dt>` imediatamente seguidos por outro `<dt>` recebam borda vermelha.

## Conclusão sobre combinação de seletores CSS

Saber quais os **tipos de combinação de seletores CSS** e como usá-los é bastante importante para formar uma boa base de conhecimentos em CSS. Escrever este tipo de código é parte do dia-a-dia de quem trabalha com CSS e, para trabalhar bem, é preciso ter uma boa base.

Com certeza uma boa base sobre combinação de seletores CSS dá um _match_ com ser um bom codificador de folhas de estilos.  ;-)

---

Fonte: [dpw - desenvolvimento para web](https://dpw.dev/) (pt-BR).
Guia para agentes: https://dpw.dev/llms.txt
Índice completo: https://dpw.dev/sitemap-index.xml
Feed: https://dpw.dev/rss.xml
