当前位置:首页 > JavaScript

js 实现菜单下滑

2026-02-02 15:21:48JavaScript

实现菜单下滑效果

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

基础CSS过渡实现

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

js 实现菜单下滑

.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');
});

动态计算高度实现

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

js 实现菜单下滑

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);
  };
}

带缓动函数的实现

添加更复杂的缓动效果:

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
分享给朋友:

相关文章

用css制作下拉菜单

用css制作下拉菜单

使用纯CSS制作下拉菜单 HTML结构 基础的下拉菜单需要嵌套的HTML结构,通常使用<ul>和<li>标签实现层级关系: <div class="dropdown"&…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现列表

js实现列表

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

纯css制作tab菜单

纯css制作tab菜单

纯CSS制作Tab菜单的方法 使用radio input控制Tab切换 通过<input type="radio">和<label>元素配合:checked伪类实现Tab切换效…

js实现跑马灯

js实现跑马灯

实现跑马灯效果 使用HTML和JavaScript可以轻松实现跑马灯效果。以下是两种常见的实现方式: HTML结构 <div id="marquee"> <span>…