![](/img/trans.png)
[英]SVG element in list, when I hide the first parent, all of next SVG in each section will be hidden too, but not the container
[英]Hide a list item if the next siblings are all hidden
我有以下清单:
<ul>
<li class="title">A</li>
<li class="item" style="display: none">a1</li>
<li class="item" style="display: none">a2</li>
<li class="title">B</li>
<li class="item" style="display: none">b1</li>
<li class="item">b2</li>
</ul>
我想创建一个JavaScript函数,该函数检查A之后的两个列表项是否都设置为显示:无。 如果它们都设置为显示:无,则将其标题“ A”设置为显示:无。
我希望脚本也对B进行检查,但不要隐藏“ B”,因为不是所有在其后的兄弟都设置为显示:无。
我正在考虑如何继续几个小时,但不知道。 您能给我一些想法吗,我不一定要编码,而只是想法。 谢谢!
你可以通过所有循环li.title
和走各的所有兄弟姐妹旁边li.title
被实例.item
使用Element.matches()
和存储阵列。
然后检查所有是否隐藏的同级项数组,并使用该决定处理li.title
当前实例的li.title
const titles = document.querySelectorAll('li.title'); Array.from(titles).forEach(li => { const items = []; let next = li.nextElementSibling; while (next && next.matches('.item')) { items.push(next); next = next.nextElementSibling; } const hide = items.every(n => n.style.display === 'none') if (hide) { li.style.display = 'none'; } else { li.style.removeProperty('display') } })
<ul> <li class="title">A</li><!-- should get hidden--> <li class="item" style="display: none">a1</li> <li class="item" style="display: none">a2</li> <li class="title" style="display: none">B</li><!-- should get shown --> <li class="item" style="display: none">b1</li> <li class="item">b2</li> </ul>
@charlietfl的答案是一个很好的答案。 但是,如果您使用jQuery没问题,我发现以下代码会更简单。
您可以在此处了解有关nextAll()的更多信息。
const titles = $('.title');
titles.each(function() {
const siblings = $(this).nextAll().slice(0, 2);
const siblingsWithDisplayNone = siblings.filter(function() {
return $(this).css('display') == 'none'
});
if (siblings.length === siblingsWithDisplayNone.length) {
$(this).css('display', 'none')
}
});
看到它在这里行动
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.