当前位置: 首页 > article >正文

html TAB、table生成

1. 代码

<!DOCTYPE html>  
<head>  
<meta charset="UTF-8">  
<title>Dynamic Tabs with Table Data</title>  
<style>  
  /* 简单的样式 */  
  .tab-content {  
    display: none;  
    border: 10px solid #ccc;  
    padding: 30px;  
    margin-top: 30px;  
  }  
  .tab-content.active {  
    display: block;  
  }  
  table {  
    width: 100%;  
    border-collapse: collapse;  
  }  
  th, td {  
    border: 10px solid #ddd;  
    padding: 30px;  
    text-align: left;  
  }  
  th {  
    background-color: #f2f2f2;  
  }  
</style>  
</head>  
<body>  
<div id="tabs">  
  <!-- 选项卡头部将在这里动态生成 -->  
</div>  
<div id="tab-contents">  
  <!-- 选项卡内容(表格)将在这里动态生成 -->  
</div>  
  
<script>  
// 假设这是从后端获取的数据  
const data = {  
  "fenceNum": 2,  
  "datasets": [  
    {  
      "name": "Dataset 1",  
      "data": [  
        { "num1": 1234, "num2": 5678, "status1": "on", "status2": "active" },  
        // 更多数据...  
      ]  
    },  
    {  
      "name": "Dataset 2",  
      "data": [  
        { "num1": 3456, "num2": 7890, "status1": "off", "status2": "inactive" },  
        // 更多数据...  
      ]  
    }  
  ]  
};  
  
// 动态生成选项卡头部和内容  
const tabsDiv = document.getElementById('tabs');  
const tabContentsDiv = document.getElementById('tab-contents');  
  
data.datasets.forEach((dataset, index) => {  
  const tabButton = document.createElement('button');  
  tabButton.textContent = `Tab ${index + 1} (${dataset.name})`;  
  tabButton.onclick = () => showTabContent(index);  
  tabsDiv.appendChild(tabButton);  
  
  const tabContent = document.createElement('div');  
  tabContent.className = 'tab-content';  
    
  // 创建表格  
  const table = document.createElement('table');  
  const thead = table.createTHead();  
  const headerRow = thead.insertRow();  
  ['Num1', 'Num2', 'Status1', 'Status2'].forEach(text => {  
    let th = document.createElement('th');  
    th.textContent = text;  
    headerRow.appendChild(th);  
  });  
  
  const tbody = table.createTBody();  
  dataset.data.forEach(item => {  
    let row = tbody.insertRow();  
    ['num1', 'num2', 'status1', 'status2'].forEach(key => {  
      let cell = row.insertCell();  
      cell.textContent = item[key];  
    });  
  });  
  
  tabContent.appendChild(table);  
  if (index === 0) tabContent.classList.add('active'); // 默认显示第一个选项卡的内容  
  tabContentsDiv.appendChild(tabContent);  
});  
  
function showTabContent(index) {  
  const tabContents = document.querySelectorAll('.tab-content');  
  tabContents.forEach(tabContent => tabContent.classList.remove('active'));  
  tabContents[index].classList.add('active');  
}  
</script>  
</body>  
</html>

2.解释

1213
L结构

:这个div用于存放动态生成的选项卡头部(即按钮)。
:这个div用于存放动态生成的选项卡内容(即表格)。 CSS样式 .tab-content:定义了选项卡内容的默认样式,包括隐藏内容(display: none;)、边框、内边距和上边距。 .tab-content.active:当.tab-content元素具有.active类时,它会被显示(display: block;)。 table、th、td:定义了表格及其单元格的样式,包括宽度、边框合并、边框样式、内边距和文本对齐方式。 JavaScript逻辑

数据定义:data对象包含两个数据集(datasets),每个数据集都有一个名称(name)和一个包含多个数据项(data)的数组。每个数据项都有四个属性:num1、num2、status1、status2。

动态生成选项卡头部:遍历data.datasets数组,为每个数据集创建一个按钮(button),按钮的文本内容包含选项卡的编号和数据集的名称。每个按钮都绑定了一个点击事件监听器,当按钮被点击时,会调用showTabContent函数并传入当前选项卡的索引。

动态生成选项卡内容:对于每个数据集,创建一个div元素作为选项卡的内容容器,并为其添加.tab-content类。然后,在这个div内部创建一个表格(table),并动态生成表头和表体。表头(th)根据数据项的属性名(Num1、Num2、Status1、Status2)来设置,表体(td)则根据数据项的实际值来填充。

默认显示第一个选项卡的内容:通过检查索引(index),如果它是第一个数据集(index === 0),则给对应的.tab-content元素添加.active类,使其内容被显示。

显示/隐藏选项卡内容:showTabContent函数负责根据传入的索引来显示对应的选项卡内容,并隐藏其他所有选项卡的内容。它通过查询所有.tab-content元素,移除它们的.active类,然后只给目标索引对应的.tab-content元素添加.active类来实现。

注意事项
在这个例子中,数据是硬编码在JavaScript中的,但在实际应用中,这些数据可能会通过AJAX请求从后端API获取。
表格的列标题(th)使用了大写的属性名(Num1、Num2等),而数据项(item)的键是小写的(num1、num2等)。虽然JavaScript是大小写敏感的,但在这个例子中,由于我们直接通过字符串字面量来访问对象的属性,所以不会出现问题。然而,为了保持一致性,最好确保列标题和数据项键的大小写一致。
默认情况下,只有第一个选项卡的内容是可见的,其他选项卡的内容都是隐藏的。当用户点击不同的选项卡时,相应的内容会被显示,而其他内容会被隐藏。

3. 效果

在这里插入图片描述


http://www.kler.cn/news/318980.html

相关文章:

  • netfilter和iptables--netfilter源码篇
  • 说说明计算机视觉(CV)技术的优势和挑战。
  • harmonyos面试题
  • 基于vue框架的宠物托管系统设计与实现is203(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • AI推介-大语言模型LLMs论文速览(arXiv方向):2024.08.25-2024.08.31
  • 52 文本预处理_by《李沐:动手学深度学习v2》pytorch版
  • PHP 递归遍历目录
  • C++20 模块化(Modules)
  • 物理学基础精解【17】
  • 等保测评新趋势:企业如何领跑网络安全赛道
  • 5--SpringBoot项目中菜品管理 详解(一)
  • Matlab进阶绘图第68期—带分组折线段的分区柱状图
  • 基于STM32的电压检测WIFI模拟
  • 常见服务器大全----都是什么?又有何作用?区别联系是什么?---web,应用,数据库,文件,消息队列服务器,Tomat,Nginx,vite.....
  • python 实现PPT转化为长图,代码如下
  • 面经 | webpack
  • langchain 提示词(一) 字符提示词和聊天提示词
  • 类似QQ聊天功能的Java程序
  • Linux —— Socket编程(一)
  • 叉车防撞报警系统解决方案:提高仓库、保障员工的安全性
  • 零基础学Axios
  • 每天学习一个技术栈 ——【Celery】篇(1)
  • C++20-协程
  • 短视频矩阵管理系统贴牌 源码开发
  • 数据库某字段要保存中文时,怎样确定长度(以Oracle为例)
  • 神经网络(四):UNet语义分割网络
  • 走向管理岗,必须懂这13个人才管理铁律
  • 详解机器学习经典模型(原理及应用)——岭回归
  • 一场大模型面试,三个小时,被撞飞了
  • MODELS 2024震撼续章:科技与可持续性的未来交响曲