You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现筛选选中项在指定区域的动态展示与状态重置

实现筛选按钮联动更新指定区域内容

需求说明

  • 页面加载完成后,<div id="choice">区域显示全部选项
  • 点击带有data-control属性的筛选按钮选中特定分类时,<div id="choice">仅展示对应选中项
  • 取消筛选选择后,该区域恢复显示全部选项

现有代码

HTML

<div>
  <ul>
    <li>
      <button class="_active" data-control=".all">all</button>
    </li>
    <li>
      <button data-control=".a">a</button>
    </li>
    <li>
      <button data-control=".b">b</button>
    </li>
    <li>
      <button data-control=".c">c</button>
    </li>
  </ul>
  <div class="show-choice">
    <div id="choice">
      <span>a 1, b 2, a b 3, b 4, a 5, c 6</span>
    </div>
  </div>
</div>
<div class="list">
  <div class="all a">a 1</div>
  <div class="all b">b 2</div>
  <div class="all a b">a b 3</div>
  <div class="all b">b 4</div>
  <div class="all a">a 5</div>
  <div class="all c">c 6</div>
</div>

CSS

ul,
li {
  list-style: none;
  display: inline-block;
}

button {
  padding: 10px;
}

button:hover {
  color: green;
}

button._active {
  color: tomato;
}

.list>div {
  background: grey;
  margin-bottom: 10px;
  color: #fff;
  padding: 10px;
}

._hidden {
  display: none;
}

.show-choice {
  width: max-content;
  border: 1px solid red;
  padding: 10px;
  margin: 0 0 20px;
}

JavaScript

document.querySelectorAll('[data-control]').forEach(item => {
  item.addEventListener('click', event => {
    event.preventDefault();
    handleFilterItems(item);
  });
});

function handleFilterItems(filterItem) {
  if (filterItem.getAttribute('data-control') === '' || filterItem.getAttribute('data-control') === '.all') {
    document.querySelectorAll('[data-control]').forEach(item => {
      item.classList.remove('_active');
    });
  } else {
    document.querySelector('[data-control=".all"]').classList.remove('_active');
  }
  if (filterItem.classList.contains('_active')) {
    filterItem.classList.remove('_active');
    // 检查是否没有其他激活的筛选按钮
    if (!document.querySelectorAll('[data-control]._active').length) {
      document.querySelector('[data-control=".all"]').classList.add('_active');
    }
  } else {
    filterItem.classList.add('_active');
  }
  handleFilterTeaser();
}

function handleFilterTeaser() {
  document.querySelectorAll('.all').forEach(item => {
    item.classList.add('_hidden');
  });
  if (document.querySelectorAll('[data-control]._active').length === 0) {
    document.querySelectorAll('.all').forEach(item => {
      item.classList.remove('_hidden');
    });
  } else {
    document.querySelectorAll('[data-control]._active').forEach(item => {
      let filterTag = item.getAttribute('data-control');
      document.querySelectorAll(filterTag).forEach(tag => {
        tag.classList.remove('_hidden');
      });
    });
  }
}

修改方案

要实现<div id="choice">区域的联动筛选,需要对代码做以下调整:

1. 拆分HTML结构

将#choice内的文本拆分为单个可控制的元素,给每个选项添加与下方列表对应的类名:

<div class="show-choice">
  <div id="choice">
    <span class="choice-item all a">a 1</span>, 
    <span class="choice-item all b">b 2</span>, 
    <span class="choice-item all a b">a b 3</span>, 
    <span class="choice-item all b">b 4</span>, 
    <span class="choice-item all a">a 5</span>, 
    <span class="choice-item all c">c 6</span>
  </div>
</div>

2. 补充CSS样式

添加.choice-item的基础样式,确保隐藏类生效:

.choice-item {
  display: inline;
}

3. 更新筛选逻辑

修改handleFilterTeaser函数,同时处理列表区域和#choice区域的显示/隐藏:

function handleFilterTeaser() {
  // 初始化隐藏所有列表项和choice项
  document.querySelectorAll('.all').forEach(item => {
    item.classList.add('_hidden');
  });
  document.querySelectorAll('.choice-item').forEach(item => {
    item.classList.add('_hidden');
  });

  if (document.querySelectorAll('[data-control]._active').length === 0) {
    // 无激活筛选时,显示全部内容
    document.querySelectorAll('.all').forEach(item => {
      item.classList.remove('_hidden');
    });
    document.querySelectorAll('.choice-item').forEach(item => {
      item.classList.remove('_hidden');
    });
  } else {
    // 根据激活的筛选标签,显示对应内容
    document.querySelectorAll('[data-control]._active').forEach(item => {
      let filterTag = item.getAttribute('data-control');
      // 显示列表对应项
      document.querySelectorAll(filterTag).forEach(tag => {
        tag.classList.remove('_hidden');
      });
      // 显示choice对应项
      document.querySelectorAll(`.choice-item${filterTag}`).forEach(tag => {
        tag.classList.remove('_hidden');
      });
    });
  }
}

内容的提问来源于stack exchange,提问作者Слава Грачев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 02:20:50