[英]nth-of-type not working as needed
I am doing responsive website. 我正在做响应式网站。 My HTML code is as given below: 我的HTML代码如下所示:
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
CSS is like this: CSS是这样的:
.column-5{width:18.4%; margin-right:2%;}
.column-5:last-child{margin-right:0;}
and my JS like 和我的JS一样
$('.column_5:nth-of-type(5n+5)').addClass('last-child')
The output the above code currently produces is as follows: 上面的代码当前产生的输出如下:
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5 last-child">...</div>
<div class="column-5">...</div>
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5 last-child">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5 last-child">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
However, what I am expecting/need is the below. 但是,我期望/需要的是以下内容。 Effectively, I need the last-child
class to be added to every 5th consecutive element with the column-5
class. 实际上,我需要使用column-5
类将last-child
类添加到每第5个连续元素中。
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5 last-child">...</div>
<div class="column-5">...</div>
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5 last-child">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5 last-child">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
How can I achieve this? 我该如何实现?
As far as I know this cannot be done with pure CSS because nth-of-type
selector will not reset the counter when there is a different element in between. 据我所知,纯CSS无法做到这一点,因为当nth-of-type
选择器之间没有其他元素时,它不会重置计数器。 Also note that nth-of-type
works primarily on the element type and not on the class selector you have attached to it. 还要注意, nth-of-type
主要作用于元素类型,而不作用于附加到其上的类选择器。
Your current selector ( .column_5:nth-of-type(5n+5)
) would select the 5th element of every type which also happens to have the class='column_5'
). 您当前的选择器( .column_5:nth-of-type(5n+5)
)将选择每种类型的第5个元素,该元素也恰好具有class='column_5'
)。 It will work on all types of elements (that is, it will select all among the 5th h2
, 5th div
, 5th span
as long as they have the required class). 它将对所有类型的元素起作用(即,只要它们具有所需的类,它将在5th h2
div
和5th span
选择所有元素)。 There is also a mismatch between the selector and the class in the HTML but I think it is a typo. HTML中的选择器和类之间也存在不匹配,但我认为这是一个错字。
Your best bet would be to use JavaScript/jQuery to achieve this and below is a sample method using JavaScript (I assume you are Ok with a JS answer as it is tagged in question). 最好的选择是使用JavaScript / jQuery来实现这一目标,下面是使用JavaScript的示例方法(我认为您可以使用JS答案,因为它被标记了)。
The code is pretty much self explanatory but I have added some inline comments for better understanding. 该代码几乎可以自我解释,但是我添加了一些内联注释以更好地理解。 It applies the class to every 5th element which has the required class (irrespective of the element type). 它将类应用于具有所需类的第5个元素(与元素类型无关)。
window.onload = function() { var j = 0; var els = document.querySelectorAll('body *'); // Selecting all elements under parent but you can replace body with the required parent. for (i = 0; i < els.length; i++) { // loop through all elements if (els[i].className.indexOf('column-5') != -1) { // if element has class j = j + 1; // increment counter if (j % 5 == 0) // if counter = 5 or its multiple els[i].className += ' last-child'; //add class } else { // if element does not have class j = 0; // reset counter. } } }
.last-child { background: red; }
<h2>Title</h2> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <h2>Title</h2> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div> <div class="column-5">...</div>
Response to comment: 对评论的回应:
section
element which has the class also has a child img
element and so when we use a selector like #id *
(descendant selector), it selects and traverses through all elements that are under the parent (irrespective of whether they are children, grand-children etc). 在您的情况下,每个具有该类的section
元素也都有一个子img
元素,因此,当我们使用#id *
(后代选择器)之类的选择器时,它会选择并遍历父级下的所有元素(无论它们是否为子女,孙子女等)。 So when the img
tag is encountered, the counter j
is getting reset. 因此,当遇到img
标签时,计数器j
将重置。 To avoid this, select just the direct children elements by using the below line: 为了避免这种情况,请使用下面的行选择直接子元素: var els = document.querySelectorAll('.container > *');
script
tag just before the closing body tag ( </body>
) or if it is in a external script file, reference it at the same place (just before </body>
). 在您的真实代码中,您可以将这段代码放在结束body标记( </body>
)之前的script
标记中,或者将其放在外部脚本文件中,也可以在同一位置(在</body>
之前)引用它。 </body>
)。 Harry's answer is good. 哈利的答案很好。 I also have an idea where we can still use nth-child concept. 我也有一个想法,我们仍然可以使用nth-child概念。 Wrap the blocks with another element. 用另一个元素包裹块。 Like this: 像这样:
<div class="blocks">
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
</div>
<div class="blocks">
<h2>Title</h2>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
<div class="column-5">...</div>
</div>
Now you can use like ".blocks .column-5:nth-of-type(5n+5)').addClass('last-child')". 现在,您可以使用“ .blocks .column-5:nth-of-type(5n + 5)')。addClass('last-child')“。 Which means the children of .blocks will be counted and 5n+5 will work fine in every block. 这意味着.block的子代将被计数,并且5n + 5将在每个块中正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.