O sinal de mais ( +
) é para o próximo irmão.
Existe um equivalente para o irmão anterior?
css
css-selectors
Jourkey
fonte
fonte
Respostas:
Não, não há seletor "irmão anterior".
Em uma nota relacionada,
~
é para irmão sucessor geral (ou seja, o elemento vem após este, mas não necessariamente imediatamente após) e é um seletor CSS3.+
é para o próximo irmão e é CSS2.1.Consulte Combinador de irmão adjacente dos seletores de nível 3 e 5,7 Seletores de irmão adjacente da especificação de revisão 2 do Cascading Style Sheets Level 2 Revisão 1 (CSS 2.1) .
fonte
Encontrei uma maneira de estilizar todos os irmãos anteriores (opostos a
~
) que podem funcionar dependendo do que você precisa.Digamos que você tenha uma lista de links e, ao passar o mouse sobre um deles, todos os anteriores devem ficar vermelhos. Você pode fazer assim:
fonte
float:right
). Exigiu um colapso de espaço em branco entre unidades / palavras e preenchimento em vez de margens, mas funciona perfeitamente de outra maneira!O nível 4 dos seletores apresenta
:has()
(anteriormente o indicador de assunto!
) que permitirá que você selecione um irmão anterior com:… Mas, no momento da redação, está a uma certa distância do limite do suporte do navegador.
fonte
:has()
pseudo-classe.Considere a
order
propriedade dos layouts flex e grid.Vou me concentrar no flexbox nos exemplos abaixo, mas os mesmos conceitos se aplicam ao Grid.
Com o flexbox, um seletor de irmão anterior pode ser simulado.
Em particular, a
order
propriedade flex pode mover elementos pela tela.Aqui está um exemplo:
PASSOS
Faça
ul
um recipiente flexível.Inverta a ordem dos irmãos na marcação.
Use um seletor de irmão para direcionar o elemento A (
~
ou+
fará).Use a
order
propriedade flex para restaurar a ordem dos irmãos na exibição visual.... e pronto! Nasce um seletor de irmãos anterior (ou pelo menos simulado).
Aqui está o código completo:
Na especificação do flexbox:
O
order
valor inicial para todos os itens flexíveis é 0.Veja também
order
na especificação CSS Grid Layout .Exemplos de "seletores de irmãos anteriores" criados com a
order
propriedade flex .jsFiddle
Uma nota lateral - Duas crenças desatualizadas sobre CSS
O Flexbox está quebrando crenças antigas sobre CSS.
Uma dessas crenças é que um seletor de irmãos anterior não é possível no CSS .
Dizer que essa crença é generalizada seria um eufemismo. Aqui está uma amostra de perguntas relacionadas apenas no Stack Overflow:
Como descrito acima, essa crença não é totalmente verdadeira. Um seletor de irmão anterior pode ser simulado em CSS usando a
order
propriedade flex .O
z-index
MitoOutra crença de longa data tem sido que
z-index
funciona apenas em elementos posicionados.De fato, a versão mais atual da especificação - o Rascunho do Editor W3C - ainda afirma que isso é verdade:
Na realidade, porém, essas informações são obsoletas e imprecisas.
Elementos que são itens flexíveis ou itens de grade podem criar contextos de empilhamento mesmo quando
position
sãostatic
.Aqui está uma demonstração do
z-index
trabalho em itens flexíveis não posicionados: https://jsfiddle.net/m0wddwxs/fonte
order
propriedade não é uma solução, pois se destina exclusivamente a alterar a ordem visual , portanto, não restaura a ordem semântica original que você é forçado a alterar em HTML para que esta solução alternativa funcione.z-index
funcionará, mesmo quando "omg, não háposition
especificado!", A especificação menciona o conceito de contexto de empilhamento , o que é bem explicado por este artigo no MDNfloat: right
(ou qualquer outro meio de reverter a ordem, dos quaisflex/order
tem poucos (menos?) Efeitos colaterais). Incitou dois violinos: demonstrando afloat: right
abordagem , e demonstrandodirection: rtl
Eu tinha a mesma pergunta, mas depois tive um momento "duh". Em vez de escrever
Escreva
Obviamente, isso corresponde a "x" em vez de "y", mas responde a "existe uma correspondência?" pergunta, e uma simples passagem de DOM pode levá-lo ao elemento certo de forma mais eficiente do que fazer loop em javascript.
Sei que a pergunta original era CSS, portanto essa resposta provavelmente é completamente irrelevante, mas outros usuários de Javascript podem tropeçar na pergunta por meio de pesquisa, como eu fiz.
fonte
y ~ x
poderia resolver o meu problemay ~ x
não responde a "existe uma correspondência?" pergunta, porque os dois seletores dados aqui significam coisas completamente diferentes. Não há comoy ~ x
produzir uma correspondência, dada a subárvore,<root><x/><y/></root>
por exemplo. Se a pergunta é "você existe?" então o seletor é simplesmentey
. Se a pergunta é "y existe dado um irmão x em alguma posição arbitrária?" então você precisaria dos dois seletores. (Embora talvez eu esteja apenas procurando neste momento ...)Dois truques . Invertendo basicamente a ordem HTML dos elementos desejados em HTML e usando o operador
~
Next siblings :float-right
+ inverter a ordem dos elementos HTMLPai com
direction: rtl;
+ inversa da ordem dos elementos internosfonte
Você pode usar os dois seletores de machados :
!
e?
Existem 2 seletores de irmãos subsequentes no CSS convencional:
+
é o imediato seletor de irmão subsequente~
é o qualquer selector irmão subsequenteNo CSS convencional, não há seletor de irmãos anterior .
No entanto, na biblioteca pós-processador CSS de machado , existem 2 seletores de irmãos anteriores :
?
é o seletor de irmão anterior imediato (oposto a+
)!
é o seletor de qualquer irmão anterior (oposto a~
)Exemplo de trabalho:
No exemplo abaixo:
.any-subsequent:hover ~ div
seleciona qualquer subseqüentediv
.immediate-subsequent:hover + div
seleciona o subseqüente imediatodiv
.any-previous:hover ! div
seleciona qualquer anteriordiv
.immediate-previous:hover ? div
seleciona o anterior imediatodiv
fonte
Outra solução flexbox
Você pode usar a ordem inversa dos elementos em HTML. Além de usar
order
como na resposta de Michael_B, você pode usarflex-direction: row-reverse;
ouflex-direction: column-reverse;
dependendo do seu layout.Amostra de trabalho:
fonte
Não há uma maneira oficial de fazer isso no momento, mas você pode usar um pequeno truque para conseguir isso! Lembre-se de que é experimental e tem algumas limitações ... (verifique este link se estiver preocupado com a compatibilidade do navegador)
O que você pode fazer é usar um seletor CSS3: a pseudo classe chamada
nth-child()
Limitações
fonte
:nth-child(-n+4)
é uma pseudo classe que precisa ser aplicada a um seletor para funcionar corretamente. Se você não é convencido, tente experimentá-lo usando um garfo do meu violino e verá que ele não funciona*
seletor, mas é uma prática desagradável.li#someListItem
e eu queria o (s) nó (s) logo antes (que é como eu interpreto "anterior") - não vejo como as informações que você forneceu podem me ajudar a expressar isso por meio do CSS. Você está apenas selecionando os primeiros n irmãos e suponha que eu conheça o n. Com base nessa lógica, qualquer seletor pode fazer o truque e selecionar o (s) elemento (s) que eu preciso (como: not ()).Se você souber a posição exata, uma
:nth-child()
exclusão baseada em todos os irmãos a seguir funcionaria.O que selecionaria todos os
li
s antes do 3º (por exemplo, 1º e 2º). Mas, na minha opinião, isso parece feio e tem um caso de uso muito restrito.Você também pode selecionar o enésimo filho da direita para a esquerda:
O que faz o mesmo.
fonte
Não. Não é possível via CSS. Leva o "Cascade" ao coração ;-).
No entanto, se você conseguir adicionar JavaScript à sua página, um pouco de jQuery poderá levá-lo ao seu objetivo final.
Você pode usar o jQuery
find
para executar um "olhar em frente" em seu elemento / classe / ID de destino e depois voltar para selecionar seu destino.Então você usa o jQuery para reescrever o DOM (CSS) para seu elemento.
Com base nesta resposta de Mike Brant , o seguinte trecho de jQuery pode ajudar.
Isso primeiro seleciona todos os
<ul>
s que seguem imediatamente a<p>
.Em seguida, "recua" para selecionar todos os
<p>
s anteriores desse conjunto de<ul>
s.Efetivamente, "irmão anterior" foi selecionado via jQuery.
Agora, use a
.css
função para passar no seu CSS novos valores para esse elemento.No meu caso, eu estava procurando uma maneira de selecionar um DIV com o id
#full-width
, mas SOMENTE se ele tivesse um DIV descendente (indireto) com a classe de.companies
.Eu tinha o controle de todo o HTML abaixo
.companies
, mas não podia alterar nenhum do HTML acima dele.E a cascata segue apenas 1 direção: para baixo.
Assim, eu poderia selecionar ALL
#full-width
s.Ou eu poderia selecionar
.companies
que apenas seguisse a#full-width
.Mas eu poderia não selecionar apenas
#full-width
s que procedeu.companies
.E, novamente, não consegui adicionar
.companies
mais no HTML. Essa parte do HTML foi escrita externamente e envolveu nosso código.Porém, com o jQuery, posso selecionar os
#full-width
s necessários e atribuir o estilo apropriado:Isso encontra tudo
#full-width .companies
e seleciona apenas aqueles.companies
semelhantes à maneira como os seletores são usados para direcionar elementos específicos no padrão em CSS.Em seguida, ele usa
.parents
"backtrack" e seleciona TODOS os pais de.companies
,mas filtra esses resultados para manter apenas
#fill-width
elementos, para que, no final,selecione apenas um
#full-width
elemento se tiver um.companies
descendente de classe.Por fim, atribui um novo
width
valor CSS ( ) ao elemento resultante.Documentos de referência do jQuery:
$ () ou jQuery () : elemento DOM.
. find : obtenha os descendentes de cada elemento no conjunto atual de elementos correspondentes, filtrados por um seletor, objeto jQuery ou elemento.
. pais : obtenha o irmão imediatamente anterior de cada elemento no conjunto de elementos correspondentes. Se um seletor for fornecido, ele recuperará o irmão anterior apenas se corresponder a esse seletor (filtra os resultados para incluir apenas os elementos / seletores listados).
. css : defina uma ou mais propriedades CSS para o conjunto de elementos correspondentes.
fonte
previousElementSibling
).previousElementSibling()
para aqueles que estão mais familiarizados com as funções JS DOM nativas, pode fornecer outro caminho não CSS.+
seletor (inexistente) solicitado pelo OP. Considere esta resposta como um "hack" em JS. Está aqui para poupar o tempo que passei para encontrar uma solução.Infelizmente, não há seletor de irmãos "anterior", mas é possível ainda obter o mesmo efeito usando posicionamento (por exemplo flutuador direita). Depende do que você está tentando fazer.
No meu caso, eu queria um sistema de classificação CSS de 5 estrelas. Eu precisaria colorir (ou trocar o ícone) das estrelas anteriores. Ao flutuar cada elemento corretamente, estou obtendo essencialmente o mesmo efeito (o html para as estrelas deve ser escrito "para trás").
Estou usando FontAwesome neste exemplo e trocando entre os unicodes de fa-star-o e fa-star http://fortawesome.github.io/Font-Awesome/
CSS:
HTML: (40)
JSFiddle: http://jsfiddle.net/andrewleyva/88j0105g/
fonte
+
ou~
seletores me parece o trabalho mais limpo.Dependendo do seu objetivo exato, existe uma maneira de obter a utilidade de um seletor pai sem usar um (mesmo que exista) ...
Digamos que temos:
O que podemos fazer para que o bloco Meias (incluindo cores) se destaque visualmente usando espaçamento?
O que seria legal, mas não existe:
O que existe:
Isso define todos os links de âncora para ter uma margem de 15px na parte superior e redefine para 0 para aqueles sem elementos UL (ou outras tags) dentro das LIs.
fonte
Eu precisava de uma solução para selecionar o irmão anterior tr. Eu vim com essa solução usando componentes React e Styled. Esta não é a minha solução exata (isso é da memória, horas depois). Eu sei que há uma falha na função setHighlighterRow.
OnMouseOver uma linha definirá o índice da linha para estado e renderizará a linha anterior com uma nova cor de plano de fundo
fonte
Não existe, e existe .
Se você deve colocar o rótulo antes da entrada, em vez disso, mantenha o rótulo e a entrada dentro de uma div e denomine a div da seguinte maneira:
Agora você pode aplicar as opções de estilo padrão para o próximo irmão disponíveis em css, e elas aparecerão como se você estivesse usando um estilo anterior para o irmão.
fonte
Eu tive um problema semelhante e descobri que todos os problemas dessa natureza podem ser resolvidos da seguinte maneira:
Dessa forma, você poderá estilizar seus itens atuais e anteriores (todos os itens substituídos pelos itens atuais e seguintes) e seus próximos itens.
exemplo:
Espero que ajude alguém.
fonte