当前位置:首页 > 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实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js实现吸色

js实现吸色

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

js验证码的实现

js验证码的实现

验证码的基本实现原理 验证码(CAPTCHA)的核心目标是区分人类用户和自动化程序。JavaScript可用于生成或验证客户端验证码,但需注意纯前端验证可能被绕过,通常需结合后端验证。 纯前端验证码…

js 实现日历

js 实现日历

实现日历的基本思路 日历的核心功能是展示日期,并允许用户进行日期选择或导航。JavaScript 可以动态生成日历的 HTML 结构,并处理用户交互逻辑。 基础日历结构 日历通常包含头部(显示月份和…

js实现排序

js实现排序

数组排序方法 JavaScript提供了内置的sort()方法用于数组排序。默认情况下,sort()将元素转换为字符串并按照Unicode码点排序。对于数字排序,需传入比较函数。 const num…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…