当前位置:首页 > JavaScript

js 实现 slidetoggle

2026-03-15 05:26:29JavaScript

实现 SlideToggle 效果

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

js 实现 slidetoggle

使用 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实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…