2017-10-03 2 views
2

Je veux définir css qui ne s'applique à .b mais pas .a .bComment utiliser correctement le: not selector pour résoudre .b mais pas .a .b?

Pas hacks acceptées de la manière de

.a .b { 
    background-color: cornflowerblue; 
} 

De plus, le code HTML peut être dans un contenant arbitraire. body > .b est aussi bien ne fonctionne pas pour mon cas

Je veux utiliser le sélecteur :not ou une solution alternative qui ne fait pas me changer la définition de .a .b

div { 
 
    width: 50px; 
 
    height: 50px; 
 
    background-color: cornflowerblue; 
 
    margin: 10px; 
 
    border: 1px solid salmon; 
 
} 
 

 
.b { 
 
    background-color: green; 
 
}
<div class="a"> 
 
    <div class="b"></div> 
 
</div> 
 

 
<div class="b"></div>

voir codepen ici

https://codepen.io/anon/pen/OxOLZE

+0

vie pirater https://codepen.io/anon/pen/PJOYgd – soft87

+0

juste une note de côté, vous ne voulez pas faire cela depuis son très lent (Css ne le supporter pour cette raison), seulement si vous savez que .b est toujours directement dans un .a il y a une réponse avec un css pur déjà posté – Elentriel

Répondre

5

Ceci sélectionnera tous les éléments .b qui ne sont pas des enfants de .a.

div { 
 
    width: 50px; 
 
    height: 50px; 
 
    background-color: cornflowerblue; 
 
    margin: 10px; 
 
    border: 1px solid salmon; 
 
} 
 

 
*:not(.a) > .b { 
 
    background-color: green; 
 
}
<div class="a"> 
 
    <div class="b"></div> 
 
</div> 
 

 
<div class="b"></div>

+0

Non, il ne sélectionnera pas .a> .b. CSS est lu par les navigateurs de droite à gauche, donc cette règle est traduite en gros: *: not (.a)> .b s'il y a un objet avec une classe b, et directement au-dessus est un objet avec classe ce n'est pas un, les règles s'appliquent *: not (.a) .b cela se traduirait par: s'il y a un objet avec une classe b, et au dessus c'est n'importe quel objet avec la classe pas a, les règles s'appliquent, qui s'appliqueraient si même un objet au-dessus de .b n'avait pas .a comme classe – Elentriel

+0

La question ne demande pas '.a .b'. La réponse devrait-elle être '*: not (.a) .b', au cas où' .b' serait imbriqué plus profondément dans '.a'? – Hans

+1

Le combinateur descendant ne fonctionnera pas dans cette instance car '*: not (.a)' sera au moins égal à l'élément html (sauf s'il a la classe "a") donc '*: not (.a) .b 'fera correspondre tous les éléments avec la classe" b "même s'il y a un élément avec la classe" a "qui est un ancêtre de l'élément avec la classe" b ". Pour que '*: not (.a) .b' fonctionne, * tous les ancêtres de l'élément avec la classe" b "devraient avoir la classe" a ". – Alohci