如何为 Treeview 菜单添加展开/收起动画与加载状态效果

13次阅读

如何为 Treeview 菜单添加展开/收起动画与加载状态效果

本文详解如何使用 jquery 为自定义 treeview 组件添加平滑的展开/收起过渡动画(如 `slidetoggle`),并在点击时显示延迟加载提示(含旋转图标与文字),提升用户交互体验。

在构建可折叠树形菜单(Treeview)时,原生的 toggle() 方法虽能控制子菜单显隐,但缺乏视觉反馈与过渡感。通过引入 jquery 的 slideToggle() 方法配合定时器(setTimeout),我们可轻松实现带延时的滑动动画模拟加载状态,显著增强用户体验。

✅ 核心改进点

  1. 替换 toggle() 为 slideToggle(300)
    提供自然的上下滑动动画,持续 300 毫秒,比瞬间切换更符合直觉。

  2. 动态插入加载提示(Loading Indicator)
    点击节点后立即追加

    元素,内含 Font Awesome 的 fa-spinner 图标与文字,营造“正在加载”反馈。

  3. 统一延迟逻辑:300ms 后移除加载态并触发动画
    使用 setTimeout 实现「先显示加载、再执行动画」的流程,避免视觉跳跃,且开/关操作均复用同一逻辑。

  4. ? 修改后的关键代码段(精简版)

    branch.on('click', function (e) {   if (this === e.target) {     var icon = $(this).children('i:first');     var $childrenul = $(this).children('ul'); // 更精准地定位子 ul(推荐)      // 切换图标状态     icon.toggleclass(openedClass + " " + closedClass);      // 插入加载提示     $(this).append('
    Loading...
    '); // 延迟执行:移除 loading 并滑动切换 setTimeout(() => { $(this).find('.loading').remove(); $childrenUl.slideToggle(300); }, 300); } });

    ? 提示:建议将 $(this).children().children().slideToggle(…) 改为 $(this).children(‘ul’).slideToggle(…),避免误操作非 子元素(如文本节点或 标签),提升健壮性。

    ? 补充 css(增强加载样式)

    .loading {   font-style: italic;   color: #666;   font-size: 0.85em;   padding: 4px 0 0 20px; } .loading .fa-spinner {   margin-right: 6px;   animation: spin 1s linear infinite; /* 确保旋转动画生效 */ } @keyframes spin {   from { transform: rotate(0deg); }   to { transform: rotate(360deg); } }

    ⚠️ 注意事项与最佳实践

    • 避免重复插入 loading 元素:实际项目中应检查 .loading 是否已存在,防止多次点击叠加多个提示:
      if (!$(this).find('.loading').length) {   $(this).append('
      ...
      '); }
    • 动画中断处理:若用户快速连续点击,slideToggle 可能因队列积导致异常。可调用 .stop(true, true) 清除动画队列:
      $childrenUl.stop(true, true).slideToggle(300);
    • 可访问性(A11y)考虑:为加载状态添加 aria-live=”polite”,屏幕阅读器可播报;图标建议包裹
    • 性能优化:大量嵌套节点时,可启用 CSS will-change: transform 提升动画流畅度。

    ✅ 总结

    通过三步轻量改造——替换切换方法、注入加载 ui封装延迟逻辑,即可让静态 Treeview 具备专业级交互动效。该方案兼容现有 html 结构与插件初始化方式,无需重写核心逻辑,开箱即用。后续还可扩展为异步加载真实数据(如 ajax 请求),此时 loading 状态将真正反映后端响应,进一步提升实用性与用户体验。

text=ZqhQzanResources