Issue
I have some nested elements like this:
<div class="foo">
<div class="select-inside-this">
<div class="not-inside-this">
<div class="one select-this"></div>
</div>
</div>
</div>
<div class="select-inside-this">
<div class="two select-this"></div>
</div>
<div class="three select-this"></div>
I want to select all .select-this
which are inside .select-inside-this
but not those which are wrapped in .not-inside-this
. So in the end, i should be able to select only two.select-this
from the above code.
The CSS I've tried but did not work:
.select-inside-this :not(.not-inside-this) .select-this {
/* style here /*
}
or:
.select-inside-this *:not(.not-inside-this) .select-this {
/* style here /*
}
Any workaround here?
I don't want to use JavaScript here. I need pure CSS3 solution.
EDIT: I don't want to use direct child (>
) selector. As I've asked, I want to select all those element from any level just without the exception wrapper.
Solution
:not(.not-inside-this)
and *:not(.not-inside-this)
with the *
are equivalent; in the case of the former, the universal selector is implied. See the spec.
It is currently not possible to construct a CSS selector that matches elements that are not descendants of specific elements for the reasons given in the following questions:
- CSS negation pseudo-class :not() for parent/ancestor elements
- Is the CSS :not() selector supposed to work with distant descendants?
The selector
.select-inside-this :not(.not-inside-this) .select-this
matches .select-this
elements that are descendants of some element that is not .not-inside-this
, which in turn is a descendant of .select-inside-this
. It does not match .select-this
elements that are not descendants of .not-inside-this
within .select-inside-this
.
This means, first off, that your selector will incorrectly match the following:
<div class="select-inside-this">
<div class="bar">
<div class="not-inside-this">
<div class="select-this"></div>
</div>
</div>
</div>
... because one of the ancestors of .select-this
, .bar
, is :not(.not-inside-this)
.
Additionally, this implies at least three levels of nesting (though it could be more). In your example, there are no other elements between .two.select-this
and its containing .select-inside-this
, so it will never match that element. This is why James Donnelly suggests adding .select-inside-this > .select-this
to account for that particular case.
However it is still not possible to write a single complex selector using descendant combinators to match elements without a specific ancestor. The only way is to repeat the child combinator method with as many :not(.not-inside-this)
as necessary, but this requires that you account for all possible cases. If you can't do that, then you're out of luck with CSS selectors.
Answered By - BoltClock
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.