Introdução
Olá galera, como prometido no post do menu toggle sem javascript, hoje irei falar sobre os seletores avançados do CSS. Pretendo fazer outro post somente com as pseudo-classes e pseudo-elementos.
A principio você pode me perguntar "por que eu vou querer saber sobre seletores avançados?*, mas acredite em mim, após você conhecê-los nunca mais irá querer parar de usá-los !
Sem mais delongas, mãos a obra !
Seletores CSS
Os seletores CSS são exatamente todas as keywords e métodos do CSS, inclusive '.' (ponto), '#' (hashtag) e a própria ',' (vírgula), sendo assim vou tentar "corrigir" um pouco o título, nós vamos falar somente dos seletores que não são nem pseudo-classes e nem pseudo-elementos.
Aqui segue uma listinha dos seletores que iremos abordar.
- ~
- >
- +
- [atributo]
- [atributo=valor]
- [atributo~=valor]
- [atributo|=valor]
- [atributo^=valor]
- [atributo$=valor]
- [atributo*=valor]
elemento1 ~ elemento2
O seletor til, irá selecionar todos os próximos elementos no mesmo nível hierarquico do elemento1("origem").
<!-- código CSS do snippet abaixo -->
<style>
ul li {
padding: 10px 10px;
}
/* elemento que aplica til tem cor cinza claro*/
ul li.til{
background: #666;
color: #fff;
}
/* ~ irá selecionar todos os elementos no mesmo nível
hierarquico que tiverem a classe foo */
ul li.til ~ .foo {
background: #333;
color: #fff;
}
</style>
...
...
<!-- código html do snippet abaixo -->
<ul>
<li class="til">elemento que aplica o til</li>
<li>elemento não afetado</li>
<li class="foo">elemento que sofre efeito do til</li>
<li class="foo">elemento que sofre efeito do til</li>
<li>elemento não afetado</li>
<li>elemento não afetado</li>
<li class="foo">elemento que sofre efeito do til</li>
<ul>
<li>elemento em outro nivel não afetado</li>
<li class="foo">elemento em outro nivel com classe foo não alterado</li>
</ul>
</ul>
See the Pen seletor til by Matheus Mesquita (@mathmesquita) on CodePen.
elemento1 > elemento2
O seletor >, irá selecionar somente os elementos filhos de primeiro grau do elemento1("origem").
<!-- código CSS do snippet abaixo -->
<style>
*{font-family: Verdana;}
ul li {
padding: 10px 10px;
}
/* > irá selecionar todos os elementos filhos de
primeiro grau que tenham a classe .foo */
ul.maiorque > li.foo{
background: #666;
color: #fff;
}
</style>
...
...
<!-- código html do snippet abaixo -->
<ul class="maiorque">
<li class="foo">filho de primeiro grau</li>
<li>filho de primeiro grau sem classe .foo</li>
<li class="foo">filho de primeiro grau</li>
<li>filho de primeiro grau sem classe .foo</li>
<li class="foo">filho de primeiro grau</li>
<ul>
<li class="foo">filho de segundo grau</li>
<li class="foo">filho de segundo grau</li>
<ul>
<li class="foo">filho de terceiro grau</li>
<li class="foo">filho de terceiro grau</li>
</ul>
</ul>
</ul>
See the Pen seletor maior que by Matheus Mesquita (@mathmesquita) on CodePen.
elemento1 + elemento2
O seletor +, é parecido com o ~, a diferença é que ele selecionará somente o elemento2 que esteja IMEDIATAMENTE após o elemento1("origem") no mesmo nível hierarquico.
<!-- código CSS do snippet abaixo -->
<style>
*{font-family: Verdana;}
ul li {
padding: 10px 10px;
margin: 5px 0;
}
ul li.mais{
background: #666;
color: #fff;
}
ul li.foo{
background: #eee;
color: #777;
}
/* + irá selecionar o elemento imediatamente após
o elemento .mais e que tenha a classe .foo */
ul li.mais + .foo {
background: #333;
color: #fff;
}
</style>
...
...
<!-- código html do snippet abaixo -->
<ul>
<li class="mais">elemento que aplica o mais</li>
<li class="foo">elemento que sofre efeito do mais</li>
<li class="foo">elemento não afetado, mesmo com classe foo</li>
<li class="foo">elemento não afetado, mesmo com classe foo</li>
<li>elemento sem classe foo</li>
<li class="mais">elemento que aplica o mais</li>
<li>elemento sem classe foo(imediatamente após)</li>
<li class="foo">elemento não afetado, mesmo com classe foo</li>
<ul>
<li>elemento sem classe foo em outro nivel</li>
<li class="foo">elemento não afetado, mesmo com classe foo</li>
</ul>
</ul>
See the Pen seletor mais by Matheus Mesquita (@mathmesquita) on CodePen.
Seletores de atributos
Para ficar mais facil a visualização, eu primeiro separei todas variedades do seletor de atributos e por fim terá o exemplo de todos pelo codepen !
[atributo]
O seletor [atributo], irá selecionar todos os elementos que possuam aquele atributo, independente de ter conteúdo.
img[alt]{
/* estilo */
}
[atributo=valor]
O seletor [atributo=valor], irá selecionar todos os elementos que tenham aquele atributo exatamente igual ao valor passado.
input[type="checkbox"]{
/* estilo */
}
[atributo~=valor]
O seletor [atributo~=valor], irá selecionar todos os elementos que o atributo tenha a palavra passada como valor, tem que ser a palavra passada sozinha, não pega os caracteres, mas sim a palavra.
a[title~="mathmesquita"]{
/* estilo */
}
[atributo|=valor]
O seletor [atributo|=valor], irá selecionar todos os elementos que o valor do atributo comece com a palavra passada, separada da próxima palavra por hífen.
a[href|="https//"]{
/* estilo */
}
[atributo^=valor]
O seletor [atributo^=valor], irá funcionar da mesma forma que [atributo|=valor], selecionando todos os elementos que o atributo comece com o valor passado.
[class^="gallery"]{
/* estilo */
}
[atributo$=valor]
O seletor [atributo$=valor], irá selecionar todos os elementos que o atributo termine com o valor passado.
a[href$=".pdf"]{
/* estilo */
}
[atributo*=valor]
O seletor [atributo*=valor], irá funcionar da mesma forma que [atributo~=valor], selecionando todos os elementos que o atributo possua a string passada em valor
img[alt*="montanhas"]{
/* estilo */
}
Exemplos
<!-- código CSS do snippet abaixo -->
<style>
*{font-family: Verdana;}
/* seleciona todas as imagems com atributo alt e bota borda azul */
img[alt]{
border: 4px solid blue;
}
/* seleciona todos os inputs com type checkbox e os aumenta*/
input[type="checkbox"]{
width: 100px;
height: 100px;
}
/* seleciona todos os links que tenham a palavra mathmesquita no atributo title e deixa a cor da letra vermelha */
a[title~='mathmesquita']{
color: red;
}
/* seleciona todos os links que comecem com a palavra 'https', separada da próxima palavra por hífen, no atributo title e deixa com o fundo preto */
a[title|="https"]{
background: #000;
color: #fff;
}
/* seleciona todos os elementos do DOM que possuem a classe começando com a string 'gallery' e adiciona uma borda verde*/
[class^="gallery"]{
border: 3px solid green;
}
/* seleciona todos os links que o atributo href termina com .pdf e deixa a cor vermelha com fundo preto */
a[href$=".pdf"]{
color: red;
background: #000;
}
/* seleciona todas as imagems que possuem a palavra montanhas no seu atributo alt e deixa a cor da borda amarela*/
img[alt*="montanhas"]{
border-color: yellow;
}
</style>
...
...
<!-- código html do snippet abaixo -->
<img src="https://image.freepik.com/icones-gratis/facebook_318-136394.jpg" alt="Logo do facebook" />
<br /><br />
<input type="checkbox" />
<br /><br />
<a href="http://mathmesquita.me/" title="link para o site do mathmesquita">link para meu blog com title contendo mathmesquita</a>
<br /><br />
<a href="https://mathmesquita.me/" title="https-é indicado para o meu blog">link para meu blog com title começando com https</a>
<br /><br />
<div class="galleryBig">
div começando com classe gallery
</div>
<img class="galleryItem" src="http://www.mrpatel.net/IMAGES/JavaScript.png" />
<div>
imagem com classe galleryItem e sem atributo alt
</div>
<br /><br />
<a href="http://www.yugioh-card.com/ygo_cms/ygo/all/uploads/Rulebook_v9_pt.pdf" target="_blank">link para um arquivo .pdf</a>
<br /><br />
<img src="https://image.freepik.com/icones-gratis/paisagem-das-montanhas-no-dia-ensolarado_318-74296.jpg" alt="icone com montanhas e um sol" />
See the Pen seletores [atributo [=valor]] by Matheus Mesquita (@mathmesquita) on CodePen.
Conclusão
Seletores avançados são muito úteis quando queremos fazer as coisas da maneira mais simples e rápida, sem pensar em muitas classes ou qualquer padrão de escrita de CSS como BEM, ITCSS etc.
Existem outros seletores que chamamos de pseudo-classes e pseudo-elementos que não foram abordados nesse post e que também são muito úteis para truques de CSS, desenhos e muito mais coisa, esperem o próximo post que irei falar de todos eles !
Espero que tenham gostado, e obrigado por quem leu até aqui, dúvidas, críticas e sugestões, os comentários estão sempre abertos! Por hoje é só isso e até a próxima galera. :D