Eu tenho vários elementos com um nome de classe red
, mas não consigo selecionar o primeiro elemento class="red"
usando a seguinte regra CSS:
.red:first-child {
border: 5px solid red;
}
<p class="red"></p>
<div class="red"></div>
O que há de errado nesse seletor e como corrigi-lo?
Graças aos comentários, descobri que o elemento precisa ser o primeiro filho de seu pai para ser selecionado, o que não é o caso que tenho. Eu tenho a seguinte estrutura e esta regra falha conforme mencionado nos comentários:
.home .red:first-child {
border: 1px solid red;
}
<div class="home">
<span>blah</span>
<p class="red">first</p>
<p class="red">second</p>
<p class="red">third</p>
<p class="red">fourth</p>
</div>
Como posso segmentar o primeiro filho da turma red
?
css
css-selectors
Rajat
fonte
fonte
:first-of-type
que funciona.Respostas:
Este é um dos exemplos mais conhecidos de autores que não entendem como
:first-child
funciona. Introduzida no CSS2 , a:first-child
pseudo-classe representa o primeiro filho de seu pai . É isso aí. Há um equívoco muito comum de que ele seleciona o elemento filho o primeiro a corresponder às condições especificadas pelo restante do seletor composto. Devido à maneira como os seletores funcionam (veja aqui uma explicação), isso simplesmente não é verdade.Os seletores de nível 3 introduzem uma
:first-of-type
pseudo-classe , que representa o primeiro elemento entre irmãos de seu tipo de elemento. Esta resposta explica, com ilustrações, a diferença entre:first-child
e:first-of-type
. No entanto, assim como:first-child
acontece, ele não analisa outras condições ou atributos. Em HTML, o tipo de elemento é representado pelo nome da marca. Na pergunta, esse tipo ép
.Infelizmente, não há
:first-of-class
pseudo-classe semelhante para corresponder ao primeiro elemento filho de uma determinada classe. Uma solução alternativa que Lea Verou e eu propusemos para isso (embora de forma totalmente independente) é primeiro aplicar os estilos desejados a todos os seus elementos com essa classe:... então "desfaça" os estilos dos elementos da classe que se seguem ao primeiro , usando o combinador geral de irmãos
~
em uma regra primordial:Agora, apenas o primeiro elemento com
class="red"
terá uma borda.Aqui está uma ilustração de como as regras são aplicadas:
Nenhuma regra é aplicada; nenhuma borda é renderizada.
Este elemento não possui a classe
red
, por isso é ignorado.Somente a primeira regra é aplicada; uma borda vermelha é renderizada.
Este elemento tem a classe
red
, mas não é precedido por nenhum elemento com a classered
em seu pai. Assim, a segunda regra não é aplicada, apenas a primeira, e o elemento mantém sua borda.Ambas as regras são aplicadas; nenhuma borda é renderizada.
Este elemento tem a classe
red
. Também é precedida por, pelo menos, um outro elemento com a classered
. Assim, ambas as regras são aplicadas e a segundaborder
declaração substitui a primeira, "desfazendo-a", por assim dizer.Como um bônus, embora tenha sido introduzido nos Seletores 3, o combinador geral de irmãos é realmente muito bem suportado pelo IE7 e mais recente, ao contrário
:first-of-type
e:nth-of-type()
que são suportados apenas pelo IE9 em diante. Se você precisar de um bom suporte ao navegador, está com sorte.De fato, o fato de o combinador de irmãos ser o único componente importante nessa técnica, e ter um suporte incrível ao navegador, torna essa técnica muito versátil - você pode adaptá-lo para filtrar elementos por outras coisas, além dos seletores de classe:
Você pode usar isso para contornar o
:first-of-type
IE7 e o IE8, simplesmente fornecendo um seletor de tipo em vez de um seletor de classe (novamente, mais sobre o uso incorreto aqui em uma seção posterior):Você pode filtrar por seletores de atributos ou quaisquer outros seletores simples em vez de classes.
Você também pode combinar essa técnica de substituição com pseudoelementos, mesmo que tecnicamente os pseudoelementos não sejam seletores simples.
Observe que, para que isso funcione, você precisará saber com antecedência quais serão os estilos padrão para os outros elementos irmãos, para que você possa substituir a primeira regra. Além disso, como isso envolve a substituição de regras no CSS, você não pode conseguir a mesma coisa com um único seletor para usar com a API Selectors ou com os localizadores CSS do Selenium .
Vale ressaltar que os Seletores 4 introduzem uma extensão da
:nth-child()
notação (originalmente uma pseudo classe totalmente nova chamada:nth-match()
), que permitirá que você use algo como um:nth-child(1 of .red)
substituto hipotético.red:first-of-class
. Sendo uma proposta relativamente recente, ainda não há implementações interoperáveis suficientes para que possam ser utilizadas em locais de produção. Espero que isso mude em breve. Enquanto isso, a solução que sugeri deve funcionar na maioria dos casos.Lembre-se de que esta resposta pressupõe que a pergunta esteja procurando por todos os elementos do primeiro filho que tenham uma determinada classe. Não existe uma pseudo-classe nem mesmo uma solução CSS genérica para a enésima correspondência de um seletor complexo em todo o documento - se uma solução existe depende muito da estrutura do documento. jQuery fornece
:eq()
,:first
,:last
e mais para o efeito, mas nota mais uma vez que eles funcionam de forma muito diferente de:nth-child()
et al . Usando a API Selectors, você pode usardocument.querySelector()
para obter a primeira correspondência:Ou use
document.querySelectorAll()
com um indexador para escolher qualquer correspondência específica:Embora a
.red:nth-of-type(1)
solução na resposta original aceita por Philip Daubmeier funcione (que foi originalmente escrita por Martyn, mas excluída desde então), ela não se comporta da maneira que você esperaria.Por exemplo, se você deseja apenas selecionar a
p
marcação original:... então você não pode usar
.red:first-of-type
(equivalente a.red:nth-of-type(1)
), porque cada elemento é o primeiro (e somente) um de seu tipo (p
ediv
respectivamente), para que ambos sejam correspondidos pelo seletor.Quando o primeiro elemento de uma determinada classe também é o primeiro de seu tipo , a pseudo-classe funciona, mas isso acontece apenas por coincidência . Esse comportamento é demonstrado na resposta de Philip. No momento em que você colar um elemento do mesmo tipo antes desse elemento, o seletor falhará. Tomando a marcação atualizada:
A aplicação de uma regra com
.red:first-of-type
funcionará, mas depois de adicionar outrap
sem a classe:... o seletor falhará imediatamente, porque o primeiro
.red
elemento agora é o segundop
.fonte
:last-of-class
? Selecione o último elemento de uma classe.general sibling selector ~
funciona como a:not(:first-of-*)
para um tipo específico, presumo que ela deva aplicar a regra a cada elemento correspondente, mas é aplicada apenas para a primeira correspondência, mesmo quando houver três ou mais correspondências possíveis.:nth-child(1 of .foo)
extensão já foi implementada no Safari 9.1+. (Eu não tenho verificado embora)O
:first-child
seletor deve, como o nome diz, selecionar o primeiro filho de uma tag pai. Os filhos precisam ser incorporados na mesma tag pai. Seu exemplo exato funcionará (tentei aqui ):Talvez você tenha aninhado suas tags em diferentes tags principais? Suas tags de classe são
red
realmente as primeiras sob o pai?Observe também que isso não se aplica apenas à primeira marca desse documento em todo o documento, mas sempre que um novo pai é envolvido, como:
first
ethird
será vermelho então.Atualizar:
Não sei por que o martyn excluiu sua resposta, mas ele tinha a solução, o
:nth-of-type
seletor:Créditos a Martyn . Mais informações, por exemplo, aqui . Esteja ciente de que este é um seletor CSS 3, portanto, nem todos os navegadores o reconhecerão (por exemplo, IE8 ou mais antigo).
fonte
:nth-of-type
sofre o pequeno problema de não funcionar em nenhuma versão atual do IE..red:nth-of-type(1)
selecionará qualquer elemento que (a) seja o primeiro filho do seu tipo de elemento e (b) tenha a classe "vermelho". Portanto, se, no exemplo, o primeiro <p> não tivesse a classe "vermelho", ele não seria selecionado. Como alternativa, se a <span> e a primeira <p> tivessem a classe "vermelho", elas seriam selecionadas. jsfiddle.net/fvAxn:first-of-type
é equivalente a:nth-of-type(1)
, então é claro que também funciona. Também pode falhar, da mesma maneira, pela mesma razão indicada na minha resposta.:nth-of-type
significa "elemento / tag" quando diz "type". Portanto, ele considera apenas o elemento, não coisas como classes.A resposta correta é:
Parte I: Se o elemento for o primeiro de seu pai e tiver a classe "red", ele deverá obter uma borda.
Parte II: Se o elemento ".red" não for o primeiro a seu pai, mas seguir imediatamente um elemento sem a classe ".red", ele também merecerá a honra da referida borda.
Fiddle ou não aconteceu.
A resposta de Philip Daubmeier, embora aceita, não está correta - veja o violino em anexo.
A resposta do BoltClock funcionaria, mas desnecessariamente define e substitui estilos
(particularmente um problema em que ela herdaria uma borda diferente - você não deseja declarar outra borda: none)
EDIT: No caso de você ter "vermelho" depois de não vermelho várias vezes, cada "primeiro" vermelho receberá a borda. Para evitar isso, seria necessário usar a resposta de BoltClock. Veja violino
fonte
.red
segue um:not(.red)
nem sempre o torna o primeiro.red
entre seus irmãos. E se a borda precisar ser herdada, é simplesmente uma questão de declarar, eborder: inherit
nãoborder: none
na regra de substituição.first-child
paralast-child
, mas vejo após o teste que isso nem sempre funciona.você poderia usar
first-of-type
ounth-of-type(1)
fonte
<p></p>
entre ospan
e seu primeirop
elemento comred
classe. Veja este JSFiddle .As respostas acima são muito complexas.
Isso selecionará o primeiro tipo de classe. Origem MDN
fonte
first-type
foi renomeado parafirst-of-type
<span>
, e alguns têm a classehighlight
. O.highlight:first-of-type
seletor selecionará a primeira instância do "tipo" com a classe selecionada, neste exemplo a primeira<span>
e não a primeira instância da classehighlight
. Somente se a primeira instância do span também tiver o destaque da classe, o estilo será implementado. ( codepen.io/andrewRmillar/pen/poJKJdJ )Para corresponder ao seu seletor, o elemento deve ter um nome de classe
red
e deve ser o primeiro filho de seu pai.fonte
Como as outras respostas cobrem o que há de errado , tentarei a outra metade, como corrigi-lo. Infelizmente, não sei se você tem uma solução somente CSS aqui, pelo menos não que eu possa pensar . Existem algumas outras opções embora ....
Atribua uma
first
classe ao elemento ao gerá-lo, assim:CSS:
Este CSS corresponde apenas aos elementos com as classes
first
ered
.Como alternativa, faça o mesmo em JavaScript, por exemplo, aqui está o jQuery que você usaria para fazer isso, usando o mesmo CSS acima:
fonte
:first-of-class
, eu também sugeriria adicionar uma classe extra ao primeiro elemento. Parece a solução mais fácil por enquanto.Eu tenho esse aqui no meu projeto.
fonte
De acordo com o seu problema atualizado
e quanto a
Isso selecionará a home da classe e , em seguida, o elemento span e, finalmente, todos os elementos .red que são colocados imediatamente após os elementos span.
Referência: http://www.w3schools.com/cssref/css_selectors.asp
fonte
Você pode usar o enésimo tipo (1), mas certifique-se de que o site não precise oferecer suporte ao IE7, etc. no enésimo filho-estilo.
fonte
Você pode alterar seu código para algo assim para fazê-lo funcionar
Isso faz o trabalho para você
Aqui está uma referência CSS do SnoopCode sobre isso.
fonte
Estou usando o CSS abaixo para ter uma imagem de plano de fundo para a lista ul li
fonte
Tente o seguinte:
fonte
Por alguma razão, nenhuma das respostas acima parecia abordar o caso do primeiro e único filho real dos pais.
Todas as respostas acima falharão se você deseja aplicar o estilo somente ao filho de primeira classe desse código.
fonte
:first-child
pseudo-classe é enganoso, uma vez que a adição.class_name
antes não altera a forma como funciona e apenas a faz agir como um filtro. Se você tiver um div antes<div class="class_name">First content that need to be styled</div>
, seu seletor não corresponderá, pois não é o primeiro filho real.Experimente isto simples e eficaz
fonte
Acredito que o uso do seletor relativo
+
para selecionar elementos colocados imediatamente depois funcione aqui da melhor maneira (como poucos sugeriram antes).Também é possível, neste caso, usar esse seletor
mas esse é o seletor de elementos, não a classe um.
Aqui você tem uma boa lista de seletores de CSS: https://kolosek.com/css-selectors/
fonte
Experimente esta solução:
Link CodePen
fonte