当前位置:首页 > JavaScript

js 实现菜单下滑

2026-04-07 08:59:33JavaScript

实现菜单下滑效果

使用 JavaScript 实现菜单下滑效果可以通过 CSS 过渡(transition)或动画(animation)结合事件监听完成。以下是几种常见方法:

使用 CSS Transition 和 JavaScript 控制

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

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

.menu.active {
  max-height: 500px; /* 根据实际内容调整 */
}
const toggleBtn = document.querySelector('.toggle-btn');
const menu = document.querySelector('.menu');

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

使用 JavaScript 动态计算高度

适合不确定菜单内容高度的情况:

const menu = document.querySelector('.menu');
menu.style.maxHeight = '0';

function toggleMenu() {
  if (menu.style.maxHeight === '0px') {
    menu.style.maxHeight = menu.scrollHeight + 'px';
  } else {
    menu.style.maxHeight = '0';
  }
}

使用 CSS Animation

纯 CSS 方案结合 JavaScript 触发:

@keyframes slideDown {
  from { max-height: 0; }
  to { max-height: 500px; }
}

.menu.animate {
  animation: slideDown 0.3s forwards;
}
document.querySelector('.toggle-btn').addEventListener('click', () => {
  const menu = document.querySelector('.menu');
  menu.classList.add('animate');
});

注意事项

  • 确保为菜单容器设置 overflow: hidden 属性
  • 使用 max-height 而非 height 可适应不同内容高度
  • 移动端考虑添加 transform: translateZ(0) 提升性能
  • 对于复杂动画,推荐使用 requestAnimationFrame

高级实现(带缓动函数)

使用自定义缓动函数实现更自然效果:

js 实现菜单下滑

function slideToggle(element, duration = 300) {
  const startHeight = element.offsetHeight;
  const startTime = performance.now();

  function animate(time) {
    const elapsed = time - startTime;
    const progress = Math.min(elapsed / duration, 1);
    const ease = easeOutQuad(progress);

    if (startHeight === 0) {
      element.style.height = `${ease * element.scrollHeight}px`;
    } else {
      element.style.height = `${(1 - ease) * startHeight}px`;
    }

    if (progress < 1) {
      requestAnimationFrame(animate);
    }
  }

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

  requestAnimationFrame(animate);
}

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

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现原理

js实现原理

JavaScript 实现原理 JavaScript 是一种解释型语言,其实现原理涉及多个核心组件和运行机制,包括引擎、运行时环境、事件循环等。 引擎与解释执行 现代 JavaScript 引擎(如…

vue实现联动菜单

vue实现联动菜单

实现联动菜单的基本思路 在Vue中实现联动菜单的核心在于数据绑定和事件监听。通过v-model绑定下拉菜单的值,利用watch或computed监听变化,动态更新下一级菜单的选项。 基础实现方法 创…