I believe this is a misunderstanding of how the :nth-of-type
selector works. The .box
selector doesn't restrict the :nth-of-type
selector. It acts as an additional sub filter. In this case all odd divs are selected and then of those odd divs, ones with the box
class are styled.
In your example, the odd divs in this case are:
<div>
<div class="box">1</div> <!-- Odd -->
<div class="box">2</div>
<div class="box">3</div> <!-- Odd -->
<div class="box">4</div>
<div class="splitter">splitter</div> <!-- Odd -->
<div class="box">1</div>
<div class="box">2</div> <!-- Odd -->
<div class="box">3</div>
<div class="splitter">splitter</div> <!-- Odd -->
<div class="box">1</div>
<div class="box">2</div> <!-- Odd -->
<div class="box">3</div>
<div class="box">4</div> <!-- Odd -->
<div class="box">5</div>
<div class="box">6</div> <!-- Odd -->
<div class="box">7</div>
<div class="box">8</div> <!-- Odd -->
</div>
However, of those odd divs
listed above, only these:
<div>
<div class="box">1</div> <!-- Odd w/ class box -->
<div class="box">2</div>
<div class="box">3</div> <!-- Odd w/ class box -->
<div class="box">4</div>
<div class="splitter">splitter</div>
<div class="box">1</div>
<div class="box">2</div> <!-- Odd w/ class box -->
<div class="box">3</div>
<div class="splitter">splitter</div>
<div class="box">1</div>
<div class="box">2</div> <!-- Odd w/ class box-->
<div class="box">3</div>
<div class="box">4</div> <!-- Odd w/ class box -->
<div class="box">5</div>
<div class="box">6</div> <!-- Odd w/ class box -->
<div class="box">7</div>
<div class="box">8</div> <!-- Odd w/ class box-->
</div>
Match the additional filter requirements being that they must also contain the class box
.
Example:
Below is an example of how you can accomplish this using several :nth-child
selectors to create css ranges. This is helpful if you're not able to alter your HTML structure as some of the other answers suggest:
.box {
width: 48%;
float: left;
height: 30px;
background: #ccc;
}
.box:nth-child(n+1):nth-child(odd):nth-child(-n+4),
.box:nth-child(n+6):nth-child(even):nth-child(-n+8),
.box:nth-child(n+10):nth-child(even):nth-child(-n+17),
.box:nth-child(n+19):nth-child(odd):nth-child(-n+21){
margin-right: 4%;
background-color: red;
}
.splitter {
width: 100%;
float: left;
}
<div>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="splitter">splitter</div>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="splitter">splitter</div>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
<div class="box">5</div>
<div class="box">6</div>
<div class="box">7</div>
<div class="box">8</div>
<div class="splitter">splitter</div>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
</div>
Note: The above markup is slightly more extensive than that provided in your question. It's based off of your full jsfiddle markup instead of the shortened version contained in your question.
Here is your fiddle updated to contain the changes shown above.