当前位置:首页 > 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);
  };
}

带缓动函数的实现

添加更复杂的缓动效果:

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 实现菜单下滑

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

相关文章

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单用于导航,右侧区域根据菜单选择动态展示内容。 创建左侧菜单组件 左侧菜单通常是一个列表,…

用css制作下拉菜单

用css制作下拉菜单

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

js实现vue

js实现vue

Vue.js 简介 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。其核心库专注于视图层,易于与其他库或现有项目整合。 实现 Vue.js 的基本步骤 安装 Vue.j…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现图片轮播

js实现图片轮播

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

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…