简体   繁体   English

循环遍历元素并为每个元素递增应用 CSS 规则

[英]Loop through elements and incrementally apply CSS rule for each one

I have a grid layout, with variable amounts of elements in each one.我有一个网格布局,每个布局都有不同数量的元素。 I would like to dynamically add inline grid-column CSS rules for each element that is present in a div by looping through each <ul> with a class of .list .我想通过循环遍历每个带有.list类的<ul>来为 div 中存在的每个元素动态添加内grid-column CSS 规则。 So the output of the code in HTML needs to be:所以HTML中代码的输出需要是:

<ul class="list" style="grid-column: 1;"></ul>
<ul class="list" style="grid-column: 2;"></ul>
<ul class="list" style="grid-column: 3;"></ul>

Below is the code sample:下面是代码示例:

 // iterate through each div named "list item" $(".list-item").each(function() { // get the amount of each ul within the div var listAmount = $(".list-item > .sub-list").size(); // I also tried: // var listAmount = $(".list-item > .sub-list").length; // for each one that is present within the div, for (var i = 0; i < listAmount.length; i++) { // apply the CSS "grid-column" of 1, 2, 3, 4 which is defined by i $(".sub-list").css("grid-column", i); } });
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div>

Unfortunately the inline styles aren't applying as expected.不幸的是,内联样式没有按预期应用。

My JS snippet is commented with my train of thought.我的 JS 片段是用我的思路评论的。 I don't understand why this doesn't work, what am I doing wrong?我不明白为什么这不起作用,我做错了什么?

Here is my solution:这是我的解决方案:

  1. Iterate over each .list-item迭代每个.list-item

  2. Search ul.list using each .list-item element as filter使用每个.list-item元素作为过滤器搜索ul.list

  3. apply the grid-column style to each ul.list .grid-column样式应用于每个ul.list Note how the each function arguments allows you reference the current index and object ( i and obj )请注意each函数参数如何允许您引用当前索引和对象( iobj

 // iterate through each div named "list item" $(".list-item").each(function(a, listItem) { var list = $(listItem); var sublist = $("ul.list", list); sublist.each(function(i, obj){ $(obj).css("grid-column", i+1); }); });
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div>

The way you are looping through you are not actually going through sub lists.你循环的方式实际上并不是通过子列表。 You have to loop though each sub-list within each list and add css to it.您必须遍历每个列表中的每个子列表并向其添加 css。

Here is a working example这是一个工作示例

 var listItems = jQuery('.list-item'); listItems.each(function(index, value) { $(value).find('.list').each(function(i, list) { //index will start from 0, adding 1 to make grid-column // start from 1 //adding empty string to convert it into a string var columnSize = i + 1 + ""; $(list).css('grid-column', columnSize); }); });
 .list-item { display: grid; }
 <!DOCTYPE html> <html> <head> </head> <body> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div> <div class="list-item"> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> <li><a href="#">Item</a></li> </ul> <ul class="list"> <li class="list__header"><a href="#">Main Item</a></li> </ul> </div> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> </body> </html>

Here is a plunker of the above snippet https://plnkr.co/edit/CVthyQ8mcYUFKpomfFar?p=preview这是上述代码段的 plunker https://plnkr.co/edit/CVthyQ8mcYUFKpomfFar?p=preview

You are applying the style to all sub-lists every iteration.您每次迭代都将样式应用于所有子列表。 I think you need to change this:我认为你需要改变这一点:

var subLists = $(".list-item > .sub-list");

for (var i = 0; i < subLists.length; i++) {
  subLists.get(i).css("grid-column", i);
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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