当前位置:首页 > JavaScript

js 实现收缩

2026-02-01 19:59:10JavaScript

使用 CSS 和 JavaScript 实现元素收缩

通过 JavaScript 动态修改元素的 heightmax-height 属性,结合 CSS 过渡效果实现平滑收缩动画。以下示例通过点击按钮控制内容区域的展开/收缩:

// 获取DOM元素
const toggleBtn = document.getElementById('toggle-btn');
const content = document.getElementById('content');

// 初始状态标记
let isExpanded = true;

// 点击事件处理
toggleBtn.addEventListener('click', () => {
  if (isExpanded) {
    content.style.maxHeight = '0';
    content.style.opacity = '0';
    toggleBtn.textContent = '展开';
  } else {
    content.style.maxHeight = '500px'; // 设置为足够大的值
    content.style.opacity = '1';
    toggleBtn.textContent = '收缩';
  }
  isExpanded = !isExpanded;
});

对应CSS样式:

#content {
  max-height: 500px;
  overflow: hidden;
  transition: max-height 0.3s ease, opacity 0.3s ease;
  opacity: 1;
}

使用 classList 切换实现收缩

通过添加/移除CSS类的方式控制元素状态,保持JavaScript与样式的分离:

js 实现收缩

const toggleBtn = document.querySelector('.toggle-button');
const panel = document.querySelector('.collapsible-panel');

toggleBtn.addEventListener('click', () => {
  panel.classList.toggle('collapsed');
});

CSS定义收缩状态:

.collapsible-panel {
  height: auto;
  transition: height 0.4s ease;
  overflow: hidden;
}

.collapsible-panel.collapsed {
  height: 0;
}

响应式内容高度的收缩

对于动态内容高度的情况,使用 scrollHeight 属性获取实际内容高度:

js 实现收缩

function toggleCollapse(element) {
  const target = document.querySelector(element.getAttribute('data-target'));
  if (target.style.height) {
    target.style.height = null;
  } else {
    target.style.height = target.scrollHeight + 'px';
  }
}

HTML结构示例:

<button onclick="toggleCollapse(this)" data-target="#panel">切换</button>
<div id="panel" style="overflow: hidden; transition: height 0.3s;">
  内容区域...
</div>

多级嵌套收缩实现

对于复杂结构的收缩面板(如树形菜单),使用事件委托处理动态元素:

document.addEventListener('click', (e) => {
  if (e.target.matches('.collapse-header')) {
    const panel = e.target.nextElementSibling;
    panel.style.height = panel.style.height ? null : panel.scrollHeight + 'px';
  }
});

配套CSS建议:

.collapse-panel {
  height: 0;
  overflow: hidden;
  transition: height 0.25s cubic-bezier(0.4, 0, 0.2, 1);
}

注意事项

  • 始终为收缩元素设置 overflow: hidden 防止内容溢出
  • 使用 max-height 替代 height 可以避免固定高度计算问题
  • 考虑添加 will-change: height 属性优化动画性能
  • 移动端设备可能需要添加 -webkit-overflow-scrolling: touch 增强滚动体验

以上方法均可根据实际需求组合使用,通过调整过渡时间和缓动函数可获得不同的视觉效果。对于复杂场景,建议使用现成的UI库如Bootstrap的Collapse组件或jQuery UI的Accordion组件。

标签: js
分享给朋友:

相关文章

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现打印

js实现打印

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

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…