Podcast do CSS - 002: seletores
Se você tem um texto que só quer que seja maior e vermelho se for o primeiro parágrafo de um artigo, como se faz isso?
<article>
<p>I want to be red and larger than the other text.</p>
<p>I want to be normal sized and the default color.</p>
</article>
Você usa um seletor de CSS para encontrar esse elemento específico e aplicar uma regra CSS, assim.
article p:first-of-type {
color: red;
font-size: 1.5em;
}
O CSS oferece várias opções para selecionar elementos e aplicar regras a eles, que variam de muito simples a muito complexas, para ajudar a resolver situações como essa.
As partes de uma regra CSS
Para entender como os seletores funcionam e o papel deles no CSS, é importante conhecer as partes de uma regra CSS. Uma regra CSS é um bloco de código, contendo um ou mais seletores e uma ou mais declarações.
Nesta regra CSS, o seletor é .my-css-rule
.
que encontra todos os elementos com uma classe my-css-rule
na página.
Há três declarações entre chaves.
Uma declaração é um par de propriedades e valores que aplica estilos aos elementos correspondidos pelos seletores.
Uma regra CSS pode ter quantas declarações e seletores você quiser.
Seletores simples
O grupo mais simples de seletores tem como alvo elementos HTML e classes, IDs e outros atributos que podem ser adicionados a uma tag HTML.
Seletor universal
Um seletor universal, também conhecido como caractere curinga, corresponde a qualquer elemento.
* {
color: hotpink;
}
Essa regra faz com que todos os elementos HTML na página tenham texto hotpink.
Seletor de tipo
Um seletor de tipo corresponde diretamente a um elemento HTML.
section {
padding: 2em;
}
Essa regra faz com que cada elemento <section>
tenha 2em
de padding
em todos os lados.
Seletor de classe
Um elemento HTML pode ter um ou mais itens definidos no atributo class
.
A
seletor de classe
corresponde a qualquer elemento que tenha essa classe aplicada a ele.
<div class="my-class"></div>
<button class="my-class"></button>
<p class="my-class"></p>
Qualquer elemento que tenha a classe aplicada a ele ficará vermelho:
.my-class {
color: red;
}
Observe como .
está presente apenas no CSS, e não no HTML.
Isso ocorre porque o caractere .
instrui a linguagem CSS a corresponder aos membros do atributo de classe.
Esse é um padrão comum em CSS, em que um caractere especial,
ou conjunto de caracteres, é usado para definir tipos de seletores.
Um elemento HTML que tenha uma classe de .my-class
ainda corresponderá à regra CSS acima.
mesmo que tenham várias outras classes, como esta:
<div class="my-class another-class some-other-class"></div>
Isso ocorre porque o CSS procura um atributo class
que contenha a classe definida,
em vez de fazer a correspondência exata com essa classe.
Seletor de ID
Um elemento HTML com um atributo id
precisa ser o único em uma página com esse valor de ID.
Você seleciona elementos com uma
Seletor de ID da seguinte forma:
#rad {
border: 1px solid blue;
}
Esse CSS aplicaria uma borda azul ao elemento HTML que tem um id
de rad
, desta forma:
<div id="rad"></div>
Assim como no seletor de classe .
,
use um caractere #
para instruir o CSS a procurar um elemento que corresponda ao id
que o segue.
Seletor de atributos
Você pode procurar elementos com um determinado atributo HTML,
ou têm um determinado valor para um atributo HTML,
usando o seletor de atributos.
Instrua o CSS a procurar atributos envolvendo o seletor com colchetes ([ ]
).
[data-type='primary'] {
color: red;
}
Esse CSS procura todos os elementos que tenham um atributo data-type
com um valor primary
, desta forma:
<div data-type="primary"></div>
Em vez de procurar um valor específico de data-type
,
você também pode procurar elementos com o atributo presente, independentemente do seu valor.
[data-type] {
color: red;
}
<div data-type="primary"></div>
<div data-type="secondary"></div>
Esses dois elementos <div>
terão texto vermelho.
É possível usar seletores de atributo que diferenciam maiúsculas de minúsculas
adicionando um operador s
ao seletor de atributos.
[data-type='primary' s] {
color: red;
}
Isso significa que, se um elemento HTML tiver um data-type
de Primary
,
em vez de primary
, ele não receberia texto em vermelho.
É possível fazer o contrário (não diferenciar maiúsculas de minúsculas) usando um operador i
.
Junto com os operadores de caso, você tem acesso a operadores que correspondem a partes de strings dentro de valores de atributos.
/* A href that contains "example.com" */
[href*='example.com'] {
color: red;
}
/* A href that starts with https */
[href^='https'] {
color: green;
}
/* A href that ends with .com */
[href$='.com'] {
color: blue;
}
Seletores de agrupamento
Um seletor não precisa corresponder a apenas um elemento. Você pode agrupar vários seletores separando-os por vírgulas:
strong,
em,
.my-class,
[lang] {
color: red;
}
Este exemplo estende a mudança de cor para os elementos <strong>
e <em>
.
Ele também é estendido para uma classe chamada .my-class
e um elemento que tem um atributo lang
.
Teste seu conhecimento
Teste seus conhecimentos sobre seletores simples
* {}
Que tipo de seletor simples é usado no snippet acima?
div {}
Que tipo de seletor simples é usado no snippet acima?
Pseudoclasses e pseudoelementos
O CSS fornece tipos de seletores úteis que se concentram em um estado específico da plataforma, por exemplo, quando o usuário passa o cursor sobre um elemento, estruturas dentro dele ou partes dele.
Pseudoclasses
Os elementos HTML se encontram em vários estados, seja porque há uma interação, ou se um dos elementos filhos estiver em um determinado estado.
Por exemplo, um usuário pode passar o cursor sobre um elemento HTML com o ponteiro do mouse
ou o usuário também passar o cursor sobre um elemento filho.
Para essas situações, use a pseudoclasse :hover
.
/* Our link is hovered */
a:hover {
outline: 1px dotted green;
}
/* Sets all even paragraphs to have a different background */
p:nth-child(even) {
background: floralwhite;
}
Saiba mais no módulo pseudoclasses.
Pseudoelemento
Os pseudoelementos diferem das pseudoclasses porque, em vez de responder ao estado da plataforma,
atuam como se estivessem inserindo um novo elemento com CSS.
Os pseudoelementos também são sintaticamente diferentes das pseudoclasses,
porque, em vez de dois-pontos (:
), usamos dois-pontos (::
).
.my-element::before {
content: 'Prefix - ';
}
Como na demonstração acima, em que você prefixou o marcador de um link com o tipo de arquivo,
você pode usar o pseudoelemento ::before
para inserir conteúdo no início de um elemento,
ou o pseudoelemento ::after
para inserir conteúdo no fim de um elemento.
No entanto, os pseudoelementos não se limitam à inserção de conteúdo.
Também é possível usá-los para segmentar partes específicas de um elemento.
Por exemplo, suponha que você tenha uma lista.
Use ::marker
para definir o estilo de cada marcador (ou número) da lista.
/* Your list will now either have red dots, or red numbers */
li::marker {
color: red;
}
Também é possível usar ::selection
para estilizar o conteúdo destacado por um usuário.
::selection {
background: black;
color: white;
}
Saiba mais no módulo sobre pseudoelementos.
Teste seu conhecimento
Teste seu conhecimento sobre pseudosseletores
Quantos dois pontos são usados nos seletores de pseudoelemento?
p:hover { background: white; color: black; }
Que tipo de pseudoseletor é usado no snippet acima?
Seletores complexos
Você já viu uma grande variedade de seletores, mas, às vezes, você precisará de um controle mais detalhado com o CSS. É aqui que os seletores complexos entram para ajudar.
Vale lembrar que, embora os seguintes seletores nos deem mais poder, só podemos fazer a cascata para baixo, selecionando elementos filhos. Não é possível segmentar para cima e selecionar um elemento pai. Vamos explicar o que é a cascata e como ela funciona em outra aula.
Combinadores
Um combinador é o que fica entre dois seletores.
Por exemplo, se o seletor for p > strong
, o combinador será o caractere >
.
Os seletores que usam esses combinadores ajudam a selecionar itens com base na posição deles no documento.
Combinador descendente
Para entender os combinadores descendentes, primeiro é preciso entender os elementos pai e filho.
<p>A paragraph of text with some <strong>bold text for emphasis</strong>.</p>
O elemento pai é o <p>
, que contém texto.
Dentro desse elemento <p>
há um elemento <strong>
, que deixa seu conteúdo em negrito.
Como ele está dentro do <p>
, é um elemento filho.
Um combinador descendente nos permite segmentar um elemento filho.
Esse código usa um espaço () para instruir o navegador a procurar elementos filhos:
p strong {
color: blue;
}
Este snippet seleciona todos os <strong>
elementos
que são elementos filhos apenas de elementos <p>
, tornando-os azuis recursivamente.
Esse efeito é mais bem visualizado no exemplo acima,
usando o seletor do combinador, .top div
.
Essa regra CSS adiciona padding esquerdo a esses elementos <div>
.
Como o combinador é recursivo,
todos os elementos <div>
que estão em .top
terão o mesmo padding aplicado a eles.
Confira o painel HTML nesta demonstração
para conferir como o elemento .top
tem vários elementos filhos <div>
que, por si só,
ter <div>
elementos filhos.
Próximo combinador irmão
Você pode procurar um elemento que aparece logo depois de outro
usando um caractere +
no seletor.
Para adicionar espaço entre elementos empilhados,
use o próximo combinador irmão para adicionar espaço
somente se um elemento for um próximo irmão de um elemento filho de .top
.
Você pode adicionar margem a todos os elementos filhos de .top
.
usando o seguinte seletor:
.top * {
margin-top: 1em;
}
O problema é que, como você seleciona todos os elementos filhos de .top
,
essa regra pode criar espaço extra e desnecessário.
O próximo combinador irmão,
Com um seletor universal, você não só controla quais elementos recebem espaço, como também
mas também aplicar espaço a qualquer elemento.
Isso oferece flexibilidade a longo prazo,
independentemente dos elementos HTML que aparecem no .top
.
Combinador irmão subsequente
Um combinador subsequente é muito semelhante a um seletor próximo irmão.
No entanto, em vez de um caractere +
,
use um caractere ~
.
A diferença é que um elemento precisa seguir outro elemento com o mesmo pai,
em vez de ser o próximo elemento com o mesmo pai.
Esse combinador subsequente oferece um pouco menos de rigidez,
o que é útil em contextos como o exemplo acima,
em que mudamos a cor de um interruptor personalizado quando a caixa de seleção associada tem o estado :checked
.
Combinador filho
Um combinador filho (também conhecido como descendente direto).
oferece mais controle sobre a recursão que acompanha os seletores combinadores.
Ao usar o caractere >
, você limita o seletor do combinador a ser aplicado apenas a filhos diretos.
Considere o exemplo anterior, próximo de seletor irmão. O espaço é adicionado a cada próximo irmão, mas se um desses elementos também tiver próximos elementos irmãos como filhos, isso pode resultar em um espaço extra indesejável.
Para aliviar esse problema,
mude o próximo seletor irmão para incorporar um combinador filho: > * + *
.
A regra agora será aplicada apenas a filhos diretos de .top
.
Seletores compostos
Você pode combinar seletores para aumentar a especificidade e a legibilidade.
Por exemplo, para segmentar elementos <a>
,
que também tenham uma classe de .my-class
, escreva o seguinte:
a.my-class {
color: red;
}
A cor vermelha não será aplicada a todos os links
e também só aplicaria a cor vermelha à .my-class
se ela estivesse em um elemento <a>
.
Para mais informações, consulte o módulo de especificidade (link em inglês).
Teste seu conhecimento
Teste seu conhecimento sobre seletores complexos
Qual dos símbolos a seguir não é um combinador de seletor?
section.awesome { border: 1px solid hotpink; }
O seletor acima é um exemplo de...