当前位置:首页 > JavaScript

js实现层叠展开

2026-03-16 08:08:52JavaScript

层叠展开的实现方法

层叠展开(Accordion)是一种常见的UI交互模式,允许用户点击标题展开或折叠内容区域。以下是几种JavaScript实现方式:

DOM操作结合CSS过渡

document.querySelectorAll('.accordion-header').forEach(header => {
  header.addEventListener('click', () => {
    const content = header.nextElementSibling;
    content.style.maxHeight = content.style.maxHeight ? null : `${content.scrollHeight}px`;
  });
});

对应CSS:

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

classList切换实现

const items = document.querySelectorAll('.accordion-item');
items.forEach(item => {
  const header = item.querySelector('.accordion-header');
  header.addEventListener('click', () => {
    item.classList.toggle('active');
  });
});

CSS部分:

.accordion-content {
  display: none;
}
.accordion-item.active .accordion-content {
  display: block;
}

动态高度动画版本

function toggleAccordion(element) {
  const content = element.nextElementSibling;
  const isOpen = element.getAttribute('aria-expanded') === 'true';

  element.setAttribute('aria-expanded', !isOpen);
  content.style.height = isOpen ? '0' : `${content.scrollHeight}px`;

  content.addEventListener('transitionend', () => {
    if (!isOpen) content.style.height = 'auto';
  }, { once: true });
}

注意事项

  • 添加适当的ARIA属性提升可访问性:

    <div class="accordion-header" aria-expanded="false" aria-controls="content1">
  • 多级嵌套时需要事件委托:

    document.addEventListener('click', (e) => {
    if (e.target.matches('.accordion-header')) {
      // 处理逻辑
    }
    });
  • 性能优化建议:

    js实现层叠展开

    1. 使用requestAnimationFrame处理动画
    2. 避免在滚动事件中频繁操作DOM
    3. 对动态加载的内容使用事件委托

完整组件示例

<div class="accordion">
  <div class="accordion-item">
    <button class="accordion-header">Section 1</button>
    <div class="accordion-content">
      <p>Content for section 1</p>
    </div>
  </div>
  <!-- 更多条目 -->
</div>

<style>
.accordion-content {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.25s ease;
}
</style>

<script>
document.querySelectorAll('.accordion-header').forEach(header => {
  header.addEventListener('click', () => {
    const item = header.parentNode;
    const isOpen = item.classList.contains('active');

    // 关闭其他打开的项目
    document.querySelectorAll('.accordion-item.active').forEach(openItem => {
      if (openItem !== item) {
        openItem.classList.remove('active');
        openItem.querySelector('.accordion-content').style.maxHeight = '0';
      }
    });

    // 切换当前项目
    item.classList.toggle('active');
    const content = header.nextElementSibling;
    content.style.maxHeight = isOpen ? '0' : `${content.scrollHeight}px`;
  });
});
</script>

以上实现方案可根据具体需求选择,现代浏览器都支持这些基本交互效果。如需支持旧版浏览器,可能需要添加polyfill或使用jQuery等库的fallback方案。

标签: js
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,用于简化 HTML 文档遍历、事件处理、动画设计和 Ajax 交互。它的设计宗旨是“Write Less, Do Mor…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似:…

js实现文字滚动

js实现文字滚动

实现文字滚动的几种方法 使用CSS动画实现滚动 通过CSS的@keyframes和transform属性可以实现平滑的文字滚动效果。 <style> .scroll-text { w…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…