使用 Isotope.js 实现多维度组合过滤(AND 关系)

小涛姑娘_4273

小涛姑娘_4273

2026-05-01

800人浏览

原创

本文详解如何利用 Isotope.js 构建支持 type 与 tag 多选联动的过滤系统,实现跨分类组的「与」逻辑(AND),即同时满足所选类型和任一标签的元素才被显示。

本文详解如何利用 isotope.js 构建支持 `type` 与 `tag` 多选联动的过滤系统,实现跨分类组的「与」逻辑(and),即同时满足所选类型和任一标签的元素才被显示。

在使用 Isotope.js 进行多维内容过滤时,一个常见痛点是:默认的单维度过滤无法自然表达「既属于某类(type),又带有某标签(tag)」这类组合条件。原生 filter 选项仅接受 CSS 选择器字符串,而开发者常误用拼接方式(如 .type .tag)或简单取并集(OR 逻辑),导致结果不符合业务预期——例如选中 “Blog & News” 和 “Ansible” 后,却仍显示所有 ansible 卡片(含 Video 类型),而非仅 Blog 类型下的 Ansible 内容。

正确解法在于:将不同 filter group 视为笛卡尔积维度,构建全组合 CSS 类选择器,并用逗号分隔实现 OR 语义,整体达成跨组 AND 效果。其数学本质是:

{type: ['blogs-and-news'], tag: ['ansible', 'automation']}  
→ 生成选择器:'.blogs-and-news.ansible, .blogs-and-news.automation'

该选择器含义明确:仅匹配同时拥有 blogs-and-news 和 ansible 类,或同时拥有 blogs-and-news 和 automation 类的元素——完美对应“指定类型下任一标签”的业务需求。

以下是推荐的结构化实现方案(基于 ES6 Class 封装):

Feishu calendar sync, local ics to json data for AI agent
Feishu calendar sync, local ics to json data for AI agent

将ICS日历文件转为JSON格式,用于飞书日历导入导出及数据集成。

下载
class Filter {
  groups = {
    type: [],
    tag: []
  };

  // 更新指定分组的选中状态
  updateGroup(group, value, isSelected) {
    if (isSelected && !this.groups[group].includes(value)) {
      this.groups[group].push(value);
    } else if (!isSelected && this.groups[group].includes(value)) {
      this.groups[group] = this.groups[group].filter(v => v !== value);
    }
  }

  // 核心:生成笛卡尔积式 CSS 选择器(支持多组多值)
  buildSelector() {
    return Object.values(this.groups)
      .reduce((selectors, groupValues) => {
        if (groupValues.length === 0) return selectors;
        return groupValues.flatMap(v => 
          selectors.map(s => `${s}.${v}`)
        );
      }, [''])
      .join(', ');
  }

  // 便捷方法:更新 + 生成
  updateSelector(group, value, isSelected) {
    this.updateGroup(group, value, isSelected);
    return this.buildSelector();
  }
}

在初始化 Isotope 后,将其与事件绑定:

document.addEventListener('DOMContentLoaded', () => {
  const iso = new Isotope('.grid', {
    itemSelector: '.resourceCard',
    layoutMode: 'fitRows',
    transitionDuration: '0.5s'
  });

  const filter = new Filter();

  document.querySelectorAll('.rSidebar__options-li').forEach(el => {
    el.addEventListener('click', function(e) {
      e.preventDefault();
      this.classList.toggle('selected');
      const group = this.closest('[data-filter-group]').dataset.filterGroup;
      const value = this.dataset.filter;
      const isSelected = this.classList.contains('selected');

      const selector = filter.updateSelector(group, value, isSelected);
      iso.arrange({ filter: selector });
    });
  });
});

✅ 关键优势说明:

  • 逻辑清晰:buildSelector() 使用 reduce + flatMap 实现维度正交组合,天然支持任意数量的 group 和值;
  • 健壮性高:空数组自动跳过,避免生成无效选择器(如 ..ansible);
  • 可维护性强:DOM 操作(点击、class 切换)与数据逻辑(filter 状态管理、selector 生成)完全解耦;
  • 扩展友好:新增 filter group(如 status, region)只需在 groups 对象中添加字段,无需修改核心逻辑。

⚠️ 注意事项:

  • 所有 .resourceCard 元素的 class 必须严格反映其所属维度,例如
    表示“属于 Blog 类型且打有 Ansible 标签”,缺一不可;
  • 若存在“无类型”或“无标签”卡片,建议统一添加 no-type 或 untagged 类,并在 filter 中预留对应选项;
  • 调试时可通过 console.log(selector) 实时验证生成的选择器是否符合预期(如 .blogs-and-news.ansible, .blogs-and-news.automation)。

通过该方案,你将获得一个真正符合产品需求的多维联动过滤器:单选精准、多选包容、跨组严谨,且代码具备工业级可读性与可演进性。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

js

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
html版权符号
html版权符号

html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

5595

7

html在线编辑器
html在线编辑器

html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

3192

4

html网页制作
html网页制作

html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。

2023.07.31

2850

5

html空格
html空格

html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.01

2879

5

html是什么
html是什么

HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。

2023.08.11

4739

6

html字体大小怎么设置
html字体大小怎么设置

在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。

2023.08.11

2821

3

html转txt
html转txt

html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.31

2629

3

html文本框代码怎么写
html文本框代码怎么写

html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。

2023.09.01

2348

6

HTML嵌入CSS样式的方法
HTML嵌入CSS样式的方法

HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.20

2368

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 20.8万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.8万人学习