如何在过滤列表中使用第n子节点
How to use nth-child on a filtered list?
我正在从数据库中提取图像/项目列表,并根据类别过滤它们。
设计要求是平铺/马赛克布局,第7项上有一个大正方形,第8项上有一个更大的矩形,在所有过滤器上。这意味着较大的方块不能以不同的顺序排列。
目前我的方法是使用第n个子选择器从项目列表中选择第7和第8个:
/* create big item block */
.grid-item:nth-child(7n) {
height: 24em;
width: 50%;
}
/* create rectangle item block */
.grid-item:nth-child(8n) { width: 50%; }
这是一个问题,因为它只影响整个列表。在选择按钮/类别后,我如何定位过滤列表中的第7和第8项?
这是一个我试图为所有视图过滤器实现的正确布局的代码依赖。我试图实现这种相同的布局,但基于过滤器不同的项目。如果你选择"thank you"类别,你可以看到大方块被拉到列表的第三位,由于第n个子选择器,它仍然是一个大方块。
http://codepen.io/H0BB5/pen/BLNLWy问题是双重的:
- 同位素不会去除过滤掉的物质,而是用
display:none
隐藏它们。因此,项目在CSS中仍然可以被nth-child()
选择器选择。 - 项目的大小调整需要在网格重新排列之前执行,因此在
grid.isotope({filter: ...})
被调用之前。
因此,CSS不能自己完成这项工作。需要更多的javascript。
一种方法是:
- 设置一个'arrangeComplete'事件处理程序来调整网格项目的大小,并调用
grid.isotope()
来重新排列它们, - 调用
grid.isotope({ filter: ... })
并允许事件处理程序在过滤器被应用后触发。
这还可以,但是用户会看到双重排列。
// bind filter button click
$('#filters').on('click', 'button', function() {
var filterValue = $(this).attr('data-filter');
grid.one('arrangeComplete', function(event, laidOutItems) {
// Triggered after a layout and all positioning transitions have completed.
$('.grid .grid-item').filter(':visible').removeClass('big rectangle')
.eq(6).addClass('big') // the 7th item
.end()
.eq(7).addClass('rectangle'); // the 8th item
grid.isotope(); // re-trigger isotope
});
grid.isotope({ filter: filterFns[filterValue] || filterValue });
}).find('button').eq(0).trigger('click');// trigger click on default button to initialize everything.
为了更好的视觉效果,你可以聪明一点:
- 手动"预应用"过滤器,不应用同位素的过滤器,通过过滤包含网格中所有项目的jQuery集合,
- 仍然在jQuery集合中,选择第7/8个项目(从那些将可见)并调整它们的大小,
- 最后,再次使用相同的过滤器,调用
grid.isotope({filter: ...})
来重新排列网格。
因此,网格只重新排列一次,视觉效果会更令人愉悦。
幸运的是,jQuery链接使得代码相当简单:
// bind filter button click
$('#filters').on('click', 'button', function() {
var filterValue = $(this).attr('data-filter');
grid.find('.grid-item')
.removeClass('big rectangle')
.filter(filterFns[filterValue] || filterValue)
.eq(6).addClass('big') // the 7th item
.end()
.eq(7).addClass('rectangle') // the 8th item
grid.isotope({ filter: filterFns[filterValue] || filterValue });
}).find('button').eq(0).trigger('click');// trigger click on default button to initialize everything.
在这两种方法中,替换两个'。样式表中的Grid-item:n -child'指令,使用:
.grid-item.big {
height: 24em;
width: 50%;
}
.grid-item.rectangle { width: 50%; }
注意:如果要只设置第7/8项的样式,而不是第15/16、23/24项等,不要使用n -child。
相关文章:
- 选择<李>使用普通JavaScript的子节点,而不是孙节点
- js循环遍历单击的元素子节点
- 如何将数据添加到json的子节点
- 删除HTML节点而不删除其子节点
- 如何在javascript DOM api中获取具有给定条件的子节点
- 仅使用某些子节点访问xml中父节点的子节点
- 检测单击子节点并发送槽事件处理程序
- 从 d3.js 中的树中选择节点的子节点
- 访问所选剑道树视图节点的子节点
- 为什么正文标记后的脚本标记在子节点中计数
- 难以获取使用属性选择的节点的子节点
- 使用Javascript设置带有子节点的父节点的类's文本等于.
- 如何确定父节点是否有子节点
- 在没有 jquery 的情况下更改子节点(父节点具有 ID)中的链接文本
- Javascript - 子节点计数
- 在子节点上重复
- 如何在D3.js基于力的标签布局图中获取公共子节点
- 如何访问React中的子节点
- js初学者-如何在比网页中的DOM节点低一个级别上立即解析所有子节点
- 如何在过滤列表中使用第n子节点