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

用JavaScript实现待办清单活跃、已完成、全部任务筛选及动效

待办清单任务筛选及动画效果实现方案

功能需求

  • 待办任务对象包含id、content、completed、date四个核心属性
  • 点击下拉菜单选项后,按规则筛选任务:全部/未完成/已完成
  • 不符合筛选条件的任务需要实现平滑淡出的交互效果

实现步骤

1. 新增CSS动画样式

在你的small.css样式文件中新增以下代码,用于实现淡出收缩动画:

/* 任务项基础过渡配置 */
#parentList li {
  transition: all 0.3s ease;
  opacity: 1;
  overflow: hidden;
}
/* 筛选隐藏类,触发淡出收缩效果 */
#parentList li.filter-hide {
  opacity: 0;
  height: 0;
  margin: 0 !important;
  padding: 0 !important;
}

2. 新增全局变量存储当前筛选状态

在JavaScript代码顶部新增全局变量,用于记录用户当前选中的筛选规则:

// 新增在所有变量声明的最前面,默认选中「全部」
let currentFilter = 'select1';

3. 替换下拉菜单点击事件逻辑

找到原代码中//Drop down Events对应的代码块,替换为以下逻辑:

//Drop down Events
document.getElementById("myDropdown").addEventListener('click',function(event){
    if(event.target.localName === 'span'){
        // 获取选中的选项id和文本
        const selectId = event.target.id;
        const selectText = event.target.textContent;
        // 存储当前筛选类型
        currentFilter = selectId;
        let filteredList = [];
        // 按选中规则过滤任务列表
        switch(selectId) {
            case 'select1': 
                filteredList = [...toDoList];
                break;
            case 'select2': 
                filteredList = toDoList.filter(item => !item.completed);
                break;
            case 'select3': 
                filteredList = toDoList.filter(item => item.completed);
                break;
        }
        // 给不符合条件的任务加隐藏类,触发淡出动画
        const allTaskEls = document.querySelectorAll('#parentList li');
        allTaskEls.forEach(el => {
            const taskId = Number(el.id);
            const isMatched = filteredList.some(task => task.id === taskId);
            isMatched ? el.classList.remove('filter-hide') : el.classList.add('filter-hide');
        })
        // 动画结束后更新渲染列表,同步修改按钮显示文本
        setTimeout(() => {
            renderTodos(filteredList);
            document.querySelector('.dropbtn').firstChild.textContent = selectText + ' ';
        }, 300)
    }
});

4. 优化本地存储更新逻辑

修改原addToLocalStorage函数,保证新增/删除/切换任务状态时,适配当前的筛选规则:

function addToLocalStorage(toDoList){
    localStorage.setItem('toDoList',JSON.stringify(toDoList));
    // 按当前筛选规则过滤后再渲染
    let filteredList = [];
    switch(currentFilter) {
        case 'select1': 
            filteredList = [...toDoList];
            break;
        case 'select2': 
            filteredList = toDoList.filter(item => !item.completed);
            break;
        case 'select3': 
            filteredList = toDoList.filter(item => item.completed);
            break;
    }
    renderTodos(filteredList);
}

效果说明

  • 筛选切换时不符合条件的任务会在300ms内完成透明渐变、高度收缩的淡出效果,过渡自然
  • 操作任务(新增/删除/切换完成状态)后会自动保持当前筛选规则展示对应内容,无需重复选择
  • 顶部下拉按钮文字会同步显示当前筛选类型,降低用户理解成本

内容的提问来源于stack exchange,提问作者Carlos Alonzo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:09:02