É possível definir um estilo CSS para um elemento, que será aplicado apenas se o elemento correspondente contiver um elemento específico (como o item filho direto)?
Eu acho que isso é melhor explicado usando um exemplo.
Nota : Estou tentando estilizar o elemento pai , dependendo de quais elementos filho ele contém.
<style>
/* note this is invalid syntax. I'm using the non-existing
":containing" pseudo-class to show what I want to achieve. */
div:containing div.a { border: solid 3px red; }
div:containing div.b { border: solid 3px blue; }
</style>
<!-- the following div should have a red border because
if contains a div with class="a" -->
<div>
<div class="a"></div>
</div>
<!-- the following div should have a blue border -->
<div>
<div class="b"></div>
</div>
Nota 2 : Eu sei que posso conseguir isso usando javascript, mas me perguntei se isso seria possível usando alguns recursos CSS desconhecidos (para mim).
ol < li:nth-child(n+10) { margin-left: 2rem; } ol < li:nth-child(n+100) { margin-left: 3rem; } ol < li:nth-child(n+1000) { margin-left: 4rem; }
em um mundo ideal, isso aumentaria a margem dool
dependente do número deli
filhos contidos, de modo que a margem à esquerda fosse tão larga quanto precisava ser.Respostas:
Tanto quanto sei, o estilo de um elemento pai com base no elemento filho não é um recurso disponível do CSS. Você provavelmente precisará de scripts para isso.
Seria maravilhoso se você pudesse fazer algo como
div[div.a]
oudiv:containing[div.a]
como você disse, mas isso não é possível.Você pode considerar considerar o jQuery . Seus seletores funcionam muito bem com tipos 'contendo'. Você pode selecionar a div, com base no conteúdo filho e, em seguida, aplicar uma classe CSS ao pai, tudo em uma linha.
Se você usa jQuery, algo nesse sentido pode funcionar (não testado, mas a teoria existe):
ou
combinado com uma classe CSS:
Aqui está a documentação para o seletor jQuery "has" .
fonte
:has
seletor aconselha o uso do.has()
método ( api.jquery.com/has ) => aplicado à pergunta atual que daria, por exemplo,$('div').has('div.a').css('border', '1px solid red');
:has
seletor pode funcionar, mas está na versão de rascunho e nenhum navegador suporta.Basicamente, não. A seguir, seria o que você procurava em teoria:
Infelizmente não existe.
Existem algumas descrições na linha de "por que diabos não". Um bem elaborado por Shaun Inman é muito bom:
http://www.shauninman.com/archive/2008/05/05/css_qualified_selectors
fonte
:has()
pseudo-classe, mas só o usaremos no CSS4. A partir de agora (final de 2019), o JS ainda é a única maneira de obter essa funcionalidade.Além da resposta da @ kp:
Estou lidando com isso e, no meu caso, tenho que mostrar um elemento filho e corrigir a altura do objeto pai de acordo (o dimensionamento automático não está funcionando no cabeçalho de bootstrap por algum motivo, não tenho tempo para depurar) .
Mas, em vez de usar o javascript para modificar o pai, acho que vou adicionar dinamicamente uma classe CSS ao pai e mostrar seletivamente o CSS aos filhos de acordo. Isso manterá as decisões na lógica e não com base em um estado CSS.
tl; dr; aplique os estilos
a
eb
ao pai<div>
, não ao filho (é claro, nem todos serão capazes de fazer isso. Por exemplo, componentes angulares que tomam decisões por conta própria).fonte
No meu caso, tive que alterar o preenchimento de célula de um elemento que continha uma caixa de seleção de entrada para uma tabela que está sendo renderizada dinamicamente com DataTables:
Após implementar o seguinte código de linha na função initComplete, consegui produzir o preenchimento correto, que impedia que as linhas fossem exibidas com uma altura anormalmente grande
Agora, você pode ver que os estilos corretos estão sendo aplicados ao elemento pai:
Essencialmente, esta resposta é uma extensão da resposta da @ KP, mas quanto mais colaboração for implementada, melhor. Em suma, espero que isso ajude outra pessoa, porque funciona! Por fim, muito obrigado @KP por me levar na direção certa!
fonte