我有一个项目网格,在某些项目之后会有一个间隔符。我尝试使用:nth-of-type
将样式应用于我不想应用于右侧的第一列项目。但是,当我有分隔符时,CSS似乎感到困惑。
https://jsfiddle.net/yquw291h/2/
正如你所看到的那样,每增加一个div后计数就会消失,但CSS肯定只考虑每个.box
?
有没有办法可以让它只影响每个项目?我只希望第一列有某些样式,我也很高兴使用JS解决方案。
HTML
<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>
CSS
.box {
width: 48%;
float: left;
height: 30px;
background: #ccc;
}
.box:nth-of-type(odd){
margin-right: 4%;
background-color: red;
}
.splitter {
width: 100%;
float: left;
}
答案 0 :(得分:7)
这是对:nth-of-type()
的误解。它正在寻找元素(div)的类型,也是(奇数),并且只将样式应用于同样为class="box"
的那些。
你的第5个div是一个分割器,即使它没有class="box"
,它仍然被计算在内。它没有应用样式,因为您的选择器指定 .box
nth-of-type。你的下一个奇怪的是分裂者之间的<div class="box">2</div>
。
如果您还没有抓住,它会计算您容器中的所有div。只是因为.box
div中的文本是偶数,所以不会在&#34;列表&#34;中对它们进行均匀编号的条目。 divs。
由于您在评论中说您无法编辑标记,因此这是一个jQuery实现(感谢BoltClock的帮助):
var container = document.getElementById("search-results");
var descendants = container.getElementsByTagName("div");
var x, i = 0;
for (x = 0; x < descendants.length; x++) {
var nth = $(descendants).eq(x);
if (nth.hasClass("splitter")) {
i = 0;
continue;
}
if (nth.hasClass("box")) {
if (i % 2 == 0) {
nth.addClass("odd");
}
i++;
}
};
&#13;
.box {
width: 48%;
float: left;
height: 30px;
background: #ccc;
}
.odd {
margin-right: 4%;
background-color: red;
}
.splitter {
width: 100%;
float: left;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="search-results">
<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>
&#13;
您可以修改您的标记,因为Tim的回答建议您在不使用JavaScript的情况下实现您正在寻找的内容。或者您可以使用一组不同的元素来进行修改。但是只有在分隔符之间的每个部分中有一个甚至数量的div时,这才有效:(我已经评论了每个元素的编号状态,关于选择器你是什么?重新使用)。
.box {
width: 48%;
float: left;
height: 30px;
background: #ccc;
}
.box:nth-of-type(odd){
margin-right: 4%;
background-color: red;
}
.splitter {
width: 100%;
float: left;
}
&#13;
<div>
<div class="box">1</div> <!-- odd -->
<div class="box">2</div> <!-- even -->
<div class="box">3</div> <!-- odd -->
<div class="box">4</div> <!-- even -->
<hr class="splitter"/> <!-- N/A -->
<div class="box">1</div> <!-- odd -->
<div class="box">2</div> <!-- even -->
<div class="box">3</div> <!-- odd -->
<div class="box">3</div> <!-- even -->
<hr class="splitter"/> <!-- N/A -->
<div class="box">1</div> <!-- even -->
<div class="box">2</div> <!-- odd -->
<div class="box">3</div> <!-- even -->
<div class="box">4</div> <!-- odd -->
<div class="box">5</div> <!-- even -->
<div class="box">6</div> <!-- odd -->
<div class="box">7</div> <!-- even -->
<div class="box">8</div> <!-- odd -->
</div>
&#13;
此时需要问一个问题,为什么需要列?如果您有某种表格数据,则应使用<table>
s。如果你只想要两个并排的列,为什么不把一组div放在&#34; left&#34;容器和其他人在&#34;权利&#34;容器?这样,您就可以通过.left div {}
和.right div {}
选择器整体设置它们。
答案 1 :(得分:5)
实际上它的工作方式应该如此。 :nth-of-type
转换为父元素的此类型(div)的数量。因此,您可以通过将框包装在分隔符之间的简单父元素中来轻松解决问题:
.box {
width: 48%;
float: left;
height: 30px;
background: #ccc;
}
.box:nth-of-type(odd){
margin-right: 4%;
background-color: red;
}
.splitter {
width: 100%;
float: left;
}
<div>
<div>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
<div class="box">4</div>
</div>
<div class="splitter">splitter</div>
<div>
<div class="box">1</div>
<div class="box">2</div>
<div class="box">3</div>
</div>
<div class="splitter">splitter</div>
<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>
</div>
答案 2 :(得分:2)
我认为这是对:nth-of-type
选择器如何工作的误解。 .box
选择器不会限制:nth-of-type
选择器。它充当额外的子过滤器。在这种情况下,选择所有奇数div,然后选择那些具有box
类的奇数div的样式。
在您的示例中,这种情况下的奇数div是:
<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>
但是,在上面列出的那些奇怪的divs
中,只有这些:
<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>
匹配其他过滤器要求,因为它们还必须包含类box
。
示例:强>
下面是一个示例,说明如何使用多个:nth-child
选择器来创建css范围。如果您无法像其他一些答案那样改变您的HTML结构,这将非常有用:
.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>
注意:上述标记比您问题中提供的标记稍微广泛一些。它基于您的完整jsfiddle标记,而不是您问题中包含的缩短版本。
Here是您的小提琴更新,以包含上面显示的更改。