0

0

实现表格行数据的展开/折叠与箭头图标动态切换(右箭头↔下箭头)

碧海醫心

碧海醫心

发布时间:2026-03-19 12:04:01

|

279人浏览过

|

来源于php中文网

原创

实现表格行数据的展开/折叠与箭头图标动态切换(右箭头↔下箭头)

本文详解如何通过原生 javascript 和 css 实现表格中每行“详情展开”功能:点击右侧三角箭头可切换显示/隐藏对应内容行,同时箭头自动旋转 90°(▶ → ▼),再次点击则复原;支持单行独立控制及一键全局展开。代码轻量、无需框架,适合初学者快速集成。

本文详解如何通过原生 javascript 和 css 实现表格中每行“详情展开”功能:点击右侧三角箭头可切换显示/隐藏对应内容行,同时箭头自动旋转 90°(▶ → ▼),再次点击则复原;支持单行独立控制及一键全局展开。代码轻量、无需框架,适合初学者快速集成。

在构建新闻列表、任务摘要或数据看板等场景中,常需在紧凑表格中提供“按需展开详情”的交互体验。本教程将手把手带你用纯 HTML + CSS + 原生 JavaScript 实现:点击行首 ▶ 箭头,动态显示/隐藏紧随其后的详情行,并同步将箭头旋转为 ▼;再次点击则收起并复位箭头。整个方案不依赖 jQuery 或任何外部库,语义清晰、结构可控,且已适配 <tr> 元素的 display 行为特性。

✅ 核心实现原理

  • HTML 结构约定:每个可展开的标题行(<tr>)后紧跟一个 style="display: none;" 的详情行(<tr>),且该详情行必须是标题行的直接下一个兄弟节点(即 nextSibling);
  • 触发元素定位:使用 ▶(U+25B6)作为默认右向箭头,JavaScript 通过 textContent === '▶' 精准识别;
  • 样式控制分离
    • .arrow 类负责旋转动画(transform: rotate(90deg));
    • .display-none 类用于强制显示被隐藏的 <tr>(因 <tr> 默认 display 为 table-row,需 !important 覆盖内联 display: none);
  • DOM 遍历逻辑:利用 this.parentNode.parentNode.parentNode.nextSibling 向上穿透三层(<span> → <span> → <td> → <tr>),再取下一行 —— 这是适配原始 HTML 嵌套的关键路径。

? 完整可运行代码(精简优化版)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <title>Breaking News — 展开/折叠详情行</title>
  <style>
    /* 箭头旋转动画 */
    .arrow {
      display: inline-block;
      transform: rotate(90deg);
      transition: transform 0.2s ease;
    }
    /* 强制显示隐藏的 table-row */
    .detail-row {
      display: none;
    }
    .detail-row.show {
      display: table-row !important;
    }
  </style>
</head>
<body bgcolor="#EEEEEE" link="#0000FF" vlink="#0000FF" alink="#0000FF">
  <table width="400" cellspacing="1" cellpadding="5" align="center" bgcolor="#CCCCCC">
    <!-- 表头 -->
    <tr>
      <td align="center" bgcolor="#000000" colspan="2">
        <b><span style="color:#FFFFFF;font-family:Arial,sans-serif;">Breaking News</span></b>
      </td>
    </tr>
    <tr bgcolor="#CCCCCC">
      <td><b><span style="color:#333333;font-family:Arial,sans-serif;">Date</span></b></td>
      <td><b><span style="color:#333333;font-family:Arial,sans-serif;">Subject</span></b></td>
    </tr>

    <!-- 第一条新闻(可展开) -->
    <tr bgcolor="#FFFFFF">
      <td><span style="color:#333333;font-family:Arial,sans-serif;">Aug 22, 2023 / 10:00a</span></td>
      <td>
        <span style="color:#0000FF;font-family:Arial,sans-serif;">
          <span style="color:#000000;cursor:pointer;" class="toggle-btn">&#9654;</span>
          <a href="#" style="text-decoration:underline;">Article Name Here</a>
        </span>
      </td>
    </tr>
    <tr class="detail-row" bgcolor="#FFFFFF">
      <td colspan="2">
        <span style="color:#333333;font-family:Arial,sans-serif;">
          ? Content I'd like displayed when the arrow is clicked<br>
          This is the detailed description for the first article.
        </span>
      </td>
    </tr>

    <!-- 第二条新闻(可展开) -->
    <tr bgcolor="#FFFFFF">
      <td><span style="color:#333333;font-family:Arial,sans-serif;">Aug 22, 2023 / 9:00a</span></td>
      <td>
        <span style="color:#0000FF;font-family:Arial,sans-serif;">
          <span style="color:#000000;cursor:pointer;" class="toggle-btn">&#9654;</span>
          <a href="#" style="text-decoration:underline;">Another Article</a>
        </span>
      </td>
    </tr>
    <tr class="detail-row" bgcolor="#FFFFFF">
      <td colspan="2">
        <span style="color:#333333;font-family:Arial,sans-serif;">
          ? Additional context, sources, and related links.<br>
          Fully collapsible per row.
        </span>
      </td>
    </tr>

    <!-- 全局控制按钮(可选) -->
    <tr bgcolor="#FFFFFF">
      <td colspan="2" align="center">
        <span style="color:#0000FF;font-family:Arial,sans-serif;">
          <span style="color:#04f8f8;cursor:pointer;" class="toggle-btn all-open">&#9654;</span>
          <strong>All Open / Close</strong>
        </span>
      </td>
    </tr>
    <tr class="detail-row" bgcolor="#FFFFFF">
      <td colspan="2">
        <span style="color:#333333;font-family:Arial,sans-serif;">
          ⚙️ This row will be toggled together with others when "All Open" is clicked.
        </span>
      </td>
    </tr>
  </table>

  <script>
    // 获取所有触发按钮(含 All Open)
    const toggleButtons = document.querySelectorAll('.toggle-btn');

    // 单行展开/折叠逻辑
    toggleButtons.forEach(btn => {
      btn.addEventListener('click', function() {
        if (this.classList.contains('all-open')) {
          // 全局控制:遍历所有按钮并统一操作
          toggleButtons.forEach(b => {
            if (!b.classList.contains('all-open')) {
              b.classList.toggle('arrow');
              const detailRow = b.closest('tr').nextElementSibling;
              if (detailRow && detailRow.classList.contains('detail-row')) {
                detailRow.classList.toggle('show');
              }
            }
          });
        } else {
          // 单行控制
          this.classList.toggle('arrow');
          const detailRow = this.closest('tr').nextElementSibling;
          if (detailRow && detailRow.classList.contains('detail-row')) {
            detailRow.classList.toggle('show');
          }
        }
      });
    });
  </script>
</body>
</html>

⚠️ 注意事项与最佳实践

  • DOM 结构强约束:detail-row 必须紧跟在对应标题行之后,且为同级 <tr> 元素。若插入其他 <tr>(如分隔线),需调整 JS 中的 nextElementSibling 查找逻辑;
  • 避免内联 style="display:none":推荐统一用 CSS 类(如 .detail-row { display: none; })管理隐藏状态,更易维护和调试;
  • 可访问性增强(进阶):为 .toggle-btn 添加 role="button" 和 aria-expanded="false" 属性,并在 JS 中同步更新 aria-expanded 值,提升屏幕阅读器兼容性;
  • 性能提示:对于超长列表(>100 行),建议改用事件委托(监听 <table> 的 click 事件并判断 event.target.classList.contains('toggle-btn')),避免大量事件绑定;
  • 样式兼容性:transform: rotate() 在 IE10+ 完全支持;若需兼容 IE9,可改用 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);(不推荐,仅作了解)。

通过本方案,你不仅获得了一个即插即用的展开组件,更掌握了基于 DOM 关系的原生交互开发思路——简洁、可靠、易于扩展。后续可轻松接入动画库(如 Animate.css)、添加加载状态,或与后端 API 动态加载详情内容。

WisPaper
WisPaper

复旦大学研发的AI学术搜索工具,5分钟内筛选1000篇论文

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

565

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

443

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

803

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

494

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

678

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

1140

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

674

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

562

2023.09.20

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

22

2026.03.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号