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

移动端菜单子项点击可展开但无法实现滑下动画效果求助

移动端子菜单滑下动画问题解决方案

问题根源

你原来的代码里用了display: none和display: block切换子菜单显示状态,而display属性的变化是即时生效的,会直接打断CSS过渡动画,所以看不到滑下效果。


方案一:纯CSS修复(最简单)

移除display相关设置,改用overflow: hidden配合max-height实现过渡:

.menu-item-has-children {
  position: relative;
}

.sub-menu {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
  /* 可添加你需要的其他样式,比如padding、背景色等 */
}

.sub-menu.open {
  max-height: 999px; /* 设置一个足够大的值,确保覆盖所有子菜单的实际高度 */
}

这样修改后,子菜单会通过max-height的渐变实现滑下/收起的动画效果,overflow: hidden用来隐藏max-height为0时的内容。


方案二:JS精确控制(适合高度不确定的场景)

如果子菜单的高度不固定,想要更精准的动画,可以通过JS获取子菜单的真实高度后再设置过渡:

假设你的HTML结构如下:

<li class="menu-item-has-children">
  <a href="#">父菜单</a>
  <ul class="sub-menu">
    <li>子菜单1</li>
    <li>子菜单2</li>
  </ul>
</li>

对应的JS代码:

// 获取所有包含子菜单的菜单项
const parentMenuItems = document.querySelectorAll('.menu-item-has-children');

parentMenuItems.forEach(item => {
  const subMenu = item.querySelector('.sub-menu');
  // 提前获取子菜单的真实内容高度
  const actualHeight = subMenu.scrollHeight;
  
  // 初始化子菜单样式
  subMenu.style.maxHeight = '0';
  subMenu.style.overflow = 'hidden';
  subMenu.style.transition = 'max-height 0.3s ease';

  // 绑定点击事件
  item.addEventListener('click', () => {
    item.classList.toggle('open');
    // 根据open类切换高度
    subMenu.style.maxHeight = item.classList.contains('open') ? `${actualHeight}px` : '0';
  });
});

这里用scrollHeight获取子菜单的真实内容高度,确保动画时的高度完全匹配子菜单大小,避免出现多余的空白或内容截断。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 19:46:08