Pete
Pete

Reputation: 7579

Excluding an element from nth-child pattern

Let's say I have these elements:

<li class="class1">content</li>
<li class="class1">content</li>
<li class="class1 class2">content</li>
<li class="class1">content</li>
<li class="class1">content</li> <!-- I want nth-child(4n) to select this-->
<li class="class1">content</li>
<li class="class1">content</li>
<li class="class1">content</li>

I want to use a .class1:nth-child(4n) to select every 4th element, but if an element has BOTH class1 and class2 I don't want it to be included in the "every 4th" counting--I just want it to be ignored.

I've tried .class1:not(.class2):nth-child(4n), but it doesn't seem to work. Any ideas?

Here's a JSFiddle for experimentation: http://jsfiddle.net/jWxb6/2/

Upvotes: 9

Views: 13521

Answers (5)

lsblsb
lsblsb

Reputation: 1352

another approach is - add the elements as hidden elements you additionally need. Referring to your jsfiddle, that means you could solve the problem like this:

.hide{
  display:none;
}

.class2 {
    background-color: blue;
    color: white;
}

.class1:nth-child(4n):not(.class2) {
border: 1px solid red;
}

<ul>
    <li class="class1">content</li>
    <li class="class1">content</li>
      <li class="hide">helper</li>
      <li class="hide">helper</li>
      <li class="hide">helper</li>
    <li class="class1 class2">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
</ul>

Upvotes: 0

Ilya Streltsyn
Ilya Streltsyn

Reputation: 13536

nth-child selector just counts any child nodes, so .class1:nth-child(4) means 'element that is the 4th child of the container and has class1 class', not 'the 4th element with that class in the container'. The nth-of-type selector can select only elements of the specific type (tag name), so you can, e.g., count dt elements separately from dd elements in a dl list. There is nth-child(4 of .class1) syntax in CSS Selectors 4 draft, but it's currently supported only in the latest versions of Safari.

With the CSS supported by most browsers, you can 'reset the counter' after the element you want to exclude from counting and 'start the new counter' for the remaining part of the list:

.class1:nth-child(4n) {
    list-style-type: circle;
}

.class1.class2, .class2 ~ .class1:nth-child(4n) {
    list-style-type: disc;
}
.class2 ~ .class1:nth-child(4n + 1) {
    list-style-type: circle;
}

and so on (see updated fiddle).

Alternatively, you can change the markup and use different tags instead of classes and nth-of-type.

Upvotes: 10

Satwik Nadkarny
Satwik Nadkarny

Reputation: 5135

Based on what I have understood, you want to select(and style) every fourth element in this listing. BUT if any of these selected elements have an additional class (named 'class2' or for that matter, whatever class name) attached to it, then you don't want to apply any styling onto it.

You can do this with pure CSS. Instead of using the following CSS selector:

.class1:not(.class2):nth-child(4n) {
    color: Blue;
}

you could use:

li[class="class1"]:nth-child(4n) {
    color:Orange;
}

See this fiddle: http://jsfiddle.net/kLpb5/

I hope this solves your problem.

Upvotes: -1

Phil LaNasa
Phil LaNasa

Reputation: 3035

Not a direct answer, but would it work if you just overrode the previous CSS styling, i.e. ?

.class1:nth-child(4n) { color: red; }
.class2 { color: inherit !important; }

Upvotes: -1

Adnan Topal
Adnan Topal

Reputation: 236

What you want to accomplish is not possible with pure css in my knowledge. (I'd be happy if I'd be proven wrong.). However, you can accomplish what you want simply with jQuery. Here's a working example:

http://jsbin.com/fumeq/2/

Upvotes: 2

Related Questions