Domine a arte da seleção! Aprenda seletores avançados, combinadores, pseudo-classes e desvende os mistérios da especificidade CSS.
Dominar seletores de atributo, pseudo-classes e pseudo-elementos
Usar descendente, filho, irmão adjacente e irmão geral
Entender como o CSS resolve conflitos entre regras
Escrever seletores performáticos e semânticos
Selecionam elementos baseados nos seus atributos:
/* Elementos com atributo específico */
[href] { color: blue; }
/* Valor exato do atributo */
[type="button"] { background: #007bff; }
/* Contém valor específico */
[class*="btn"] { padding: 10px; }
/* Começa com valor específico */
[href^="https"] { color: green; }
/* Termina com valor específico */
[href$=".pdf"] { color: red; }
Selecionam estados específicos dos elementos:
/* Estados de link */
a:link { color: blue; }
a:visited { color: purple; }
a:hover { color: red; }
a:active { color: orange; }
/* Estados de formulário */
input:focus { border: 2px solid #007bff; }
input:disabled { background: #f5f5f5; }
input:checked { transform: scale(1.1); }
/* Estruturais */
p:first-child { margin-top: 0; }
p:last-child { margin-bottom: 0; }
li:nth-child(odd) { background: #f9f9f9; }
Criam elementos virtuais para estilização:
/* Primeira linha e primeira letra */
p::first-line { font-weight: bold; }
p::first-letter {
font-size: 2em;
float: left;
}
/* Conteúdo antes e depois */
.icone::before {
content: "🎯 ";
color: #007bff;
}
.link-externo::after {
content: " ↗";
font-size: 0.8em;
}
/* Placeholder personalizado */
input::placeholder {
color: #999;
font-style: italic;
}
/* Todos os p dentro de div */
div p {
color: #333;
}
Seleciona todos os descendentes
/* Apenas p filhos diretos */
div > p {
font-weight: bold;
}
Seleciona apenas filhos diretos
/* p imediatamente após h2 */
h2 + p {
font-size: 1.1em;
}
Seleciona o próximo irmão
/* Todos os p após h2 */
h2 ~ p {
margin-left: 20px;
}
Seleciona todos os irmãos seguintes
<article>
<h1>Título do Artigo</h1>
<p>Primeiro parágrafo (introdução)</p>
<h2>Seção 1</h2>
<p>Primeiro parágrafo da seção</p>
<p>Segundo parágrafo da seção</p>
<h2>Seção 2</h2>
<p>Outro parágrafo</p>
</article>
/* Todos os parágrafos do artigo */
article p {
color: #555;
line-height: 1.6;
}
/* Apenas h1 filho direto do article */
article > h1 {
color: #2c3e50;
border-bottom: 3px solid #3498db;
}
/* Primeiro parágrafo após cada h2 */
h2 + p {
font-weight: 600;
color: #2c3e50;
}
/* Todos os parágrafos seguintes aos h2 */
h2 ~ p {
margin-left: 15px;
}
A especificidade determina qual regra CSS será aplicada quando múltiplas regras conflitantes afetam o mesmo elemento.
CSS usa um sistema de 4 dígitos (0,0,0,0) para calcular especificidade:
Seletor | Especificidade | Explicação |
---|---|---|
p |
0,0,0,1 | 1 elemento |
.classe |
0,0,1,0 | 1 classe |
#id |
0,1,0,0 | 1 ID |
div.classe |
0,0,1,1 | 1 classe + 1 elemento |
#id .classe p |
0,1,1,1 | 1 ID + 1 classe + 1 elemento |
style="" |
1,0,0,0 | CSS inline |
Força máxima prioridade (use com parcimônia!)
Especificidade 1,0,0,0
Especificidade 0,1,0,0
Especificidade 0,0,1,0
Especificidade 0,0,0,1
Especificidade 0,0,0,0
<div class="container">
<header id="cabecalho">
<h1 class="titulo">Meu Site</h1>
<nav>
<a href="#" class="link ativo">Home</a>
<a href="#" class="link">Sobre</a>
<a href="contato.html" class="link externo">Contato</a>
</nav>
</header>
<main>
<article>
<h2>Primeiro Artigo</h2>
<p class="introducao">Esta é a introdução...</p>
<p>Este é o conteúdo principal...</p>
<p>Mais conteúdo aqui...</p>
</article>
</main>
</div>
/* Reset básico */
* { margin: 0; padding: 0; box-sizing: border-box; }
/* Seletores de elemento */
body { font-family: Arial, sans-serif; }
h1, h2 { color: #2c3e50; }
/* Seletores de classe */
.container { max-width: 1200px; margin: 0 auto; }
.titulo { font-size: 2.5em; }
.link {
text-decoration: none;
padding: 10px 15px;
margin: 0 5px;
}
/* Seletores de ID */
#cabecalho {
background: #34495e;
color: white;
padding: 20px;
}
/* Pseudo-classes */
.link:hover { background: #3498db; }
.link.ativo {
background: #e74c3c;
font-weight: bold;
}
/* Seletores de atributo */
[href$=".html"] { color: #e67e22; }
/* Combinadores */
header nav { display: flex; }
h2 + p { font-weight: 600; }
article > p { margin-bottom: 15px; }
.introducao ~ p { color: #7f8c8d; }
/* Pseudo-elementos */
.externo::after {
content: " 🔗";
font-size: 0.8em;
}
Usando apenas seletores CSS, crie cards que:
<div class="cards-container">
<div class="card novo">
<h3>Card Novo</h3>
<p>Conteúdo do card...</p>
<a href="https://exemplo.com">Link Externo</a>
</div>
<!-- Mais cards... -->
</div>