当前位置:首页 > JavaScript

js 实现 slidetoggle

2026-03-15 05:26:29JavaScript

js 实现 slidetoggle

js 实现 slidetoggle

实现 SlideToggle 效果

使用原生 JavaScript 实现类似 jQuery 的 slideToggle 效果可以通过操作元素的 height 和 transition 属性来完成。以下是两种常见的实现方式:

使用 CSS Transition 实现

function slideToggle(element, duration = 300) {
  // 如果元素是隐藏的
  if (window.getComputedStyle(element).display === 'none') {
    element.style.display = 'block';
    const height = element.offsetHeight;
    element.style.height = '0';
    element.style.overflow = 'hidden';
    element.style.transition = `height ${duration}ms ease`;

    // 触发重绘
    void element.offsetHeight;

    element.style.height = `${height}px`;

    // 过渡结束后清除内联样式
    setTimeout(() => {
      element.style.height = '';
      element.style.overflow = '';
      element.style.transition = '';
    }, duration);
  } else {
    // 如果元素是显示的
    const height = element.offsetHeight;
    element.style.height = `${height}px`;
    element.style.overflow = 'hidden';
    element.style.transition = `height ${duration}ms ease`;

    // 触发重绘
    void element.offsetHeight;

    element.style.height = '0';

    // 过渡结束后隐藏元素
    setTimeout(() => {
      element.style.display = 'none';
      element.style.height = '';
      element.style.overflow = '';
      element.style.transition = '';
    }, duration);
  }
}

使用 requestAnimationFrame 实现

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

  if (window.getComputedStyle(element).display === 'none') {
    element.style.display = 'block';
    const endHeight = element.offsetHeight;
    element.style.height = '0';
    element.style.overflow = 'hidden';

    function animate(time) {
      const elapsed = time - startTime;
      const progress = Math.min(elapsed / duration, 1);
      const height = progress * endHeight;
      element.style.height = `${height}px`;

      if (progress < 1) {
        requestAnimationFrame(animate);
      } else {
        element.style.height = '';
        element.style.overflow = '';
      }
    }

    requestAnimationFrame(animate);
  } else {
    const endHeight = 0;
    element.style.overflow = 'hidden';

    function animate(time) {
      const elapsed = time - startTime;
      const progress = Math.min(elapsed / duration, 1);
      const height = startHeight - (progress * startHeight);
      element.style.height = `${height}px`;

      if (progress < 1) {
        requestAnimationFrame(animate);
      } else {
        element.style.display = 'none';
        element.style.height = '';
        element.style.overflow = '';
      }
    }

    requestAnimationFrame(animate);
  }
}

使用方法

const btn = document.getElementById('toggleBtn');
const content = document.getElementById('content');

btn.addEventListener('click', () => {
  slideToggle(content);
});

注意事项

  • 确保元素初始状态正确(display: none 或 display: block)
  • 过渡效果依赖于 CSS 的 transition 属性
  • 使用 requestAnimationFrame 可以获得更流畅的动画效果
  • 动画持续时间可以根据需要调整
  • 元素需要有明确的高度,不能设置为 height: auto

标签: jsslidetoggle
分享给朋友:

相关文章

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js分页实现

js分页实现

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

js验证码实现

js验证码实现

验证码的基本原理 验证码(CAPTCHA)用于区分人类用户和自动化程序。常见类型包括图形验证码、滑动验证码、短信验证码等。JavaScript 可用于前端验证码的生成和验证逻辑。 图形验证码实现 使…

js实现复制功能实现

js实现复制功能实现

使用document.execCommand方法(传统方式,已逐渐被弃用) 传统方式通过document.execCommand('copy')实现复制功能,需先选中文本。以下是一个完整示例: fu…