当前位置:首页 > JavaScript

js 实现菜单下滑

2026-02-02 15:21:48JavaScript

实现菜单下滑效果

使用JavaScript实现菜单下滑效果通常需要结合CSS过渡或动画。以下是几种常见实现方式:

基础CSS过渡实现

通过添加/移除类名触发CSS过渡效果:

.menu {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease-out;
}

.menu.open {
  max-height: 500px; /* 大于实际内容高度即可 */
}
const menu = document.querySelector('.menu');
const toggleBtn = document.querySelector('.toggle-btn');

toggleBtn.addEventListener('click', () => {
  menu.classList.toggle('open');
});

动态计算高度实现

精确计算内容高度实现平滑过渡:

function toggleMenu() {
  const menu = document.querySelector('.menu');
  if (menu.style.maxHeight) {
    menu.style.maxHeight = null;
  } else {
    menu.style.maxHeight = menu.scrollHeight + 'px';
  }
}

使用Web Animation API

现代浏览器支持的动画API:

const menu = document.querySelector('.menu');

function animateMenu() {
  const isOpen = menu.classList.contains('open');

  const animation = menu.animate([
    { maxHeight: '0px', opacity: 0 },
    { maxHeight: `${menu.scrollHeight}px`, opacity: 1 }
  ], {
    duration: 300,
    easing: 'ease-in-out'
  });

  animation.onfinish = () => {
    menu.classList.toggle('open', !isOpen);
  };
}

带缓动函数的实现

添加更复杂的缓动效果:

js 实现菜单下滑

function slideMenu(menu, duration = 300) {
  const start = performance.now();
  const startHeight = menu.offsetHeight;
  const endHeight = menu.classList.contains('open') ? 0 : menu.scrollHeight;

  function step(timestamp) {
    const progress = Math.min((timestamp - start) / duration, 1);
    const easeProgress = easeOutQuad(progress);
    menu.style.height = startHeight + (endHeight - startHeight) * easeProgress + 'px';

    if (progress < 1) {
      requestAnimationFrame(step);
    } else {
      menu.classList.toggle('open');
      menu.style.height = '';
    }
  }

  requestAnimationFrame(step);
}

function easeOutQuad(t) {
  return t * (2 - t);
}

注意事项

  1. 移动端兼容性需测试transform性能
  2. 内容动态变化时需要重新计算高度
  3. 过渡结束后移除内联样式保持CSS灵活性
  4. 考虑添加ARIA属性增强可访问性

以上方法可根据具体需求选择或组合使用,CSS过渡方案性能最佳,JavaScript方案控制更精细。

标签: 菜单js
分享给朋友:

相关文章

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单调用的方法 使用路由配置生成菜单 在 Vue 项目中,可以通过路由配置自动生成菜单结构。路由配置通常包含 path、name、meta 等信息,这些信息可用于构建菜单项。 //…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js计算器的实现

js计算器的实现

实现基础结构 HTML部分需要创建计算器的基本框架,包含显示区域和按钮。使用<div>容器包裹整个计算器,内部设置一个显示屏和多个按钮。 <div class="calculato…