简体   繁体   English

类型n不能按需工作

[英]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: 对评论的回应:

  1. In your case each 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 > *'); 
  2. In the fiddle, I have selected the onDomReady option in Frameworks & Extensions (sidebar). 在小提琴中,我在Frameworks&Extensions(侧栏)中选择了onDomReady选项。 In your real code, you could either put this piece of code in a 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> )。

Updated Fiddle 更新小提琴

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM