WEB前端08-综合案例(动态表格)

使用 HTML、CSS 和 JavaScript 创建动态表格

在本教程中,我们将创建一个动态表格,允许用户添加行、选择项目,并执行批量操作,如全选或删除选中的行。我们将通过 HTML、CSS 和 JavaScript 来实现这一功能。让我们逐步了解每个部分是如何协同工作的。

image-20240720185405657

HTML 结构

我们的 HTML 文档设置了页面的基本结构:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>动态表格</title><style>/* CSS 样式在这里 */</style>
</head>
<body><div class="container"><!-- 输入字段和添加按钮 --><div class="div_1"><input type="text" name="id" id="id" placeholder="请输入编号"><input type="text" name="name" id="name" placeholder="请输入用户名"><input type="text" name="sex" id="sex" placeholder="请输入性别"><input type="button" value="添加" id="bn_add"></div><!-- 表格显示学生信息 --><div class="div_2"><table><caption>学生信息表</caption><!-- 表头 --><tr onmouseover="doOver(this);" onmouseout="doOut(this);"><th><input type="checkbox" id="doChoose"></th><th>编号</th><th>姓名</th><th>性别</th><th>操作</th></tr><!-- 示例数据行 --><tr onmouseover="doOver(this);" onmouseout="doOut(this);"><td><input type="checkbox" name="user"></td><td>1</td><td>张三</td><td></td><td><a href="javascript:void(0);" onclick="delTr(this);">删除</a></td></tr></table></div><!-- 操作按钮 --><div class="div_3"><input type="button" value="全选" id="chooseAll"><input type="button" value="全不选" id="chooseNull"><input type="button" value="反选" id="chooseFan"><input type="button" value="删除" id="deleteTable"></div></div><script>/* JavaScript 函数在这里 */</script>
</body>
</html>

HTML 元素说明

  1. 容器 Div:
    • .container 类将所有元素包裹在一起,为其添加了内边距和阴影效果,使页面看起来更像卡片。
  2. 输入字段和按钮:
    • .div_1 类包含 ID、姓名和性别的输入字段以及一个添加新行的按钮。
  3. 表格:
    • 表格显示学生信息,包含选择框、编号、姓名、性别和操作列。每一行都有一个删除选项。
  4. 操作按钮:
    • .div_3 类包含全选、全不选、反选和删除选中行的按钮。

CSS 样式

CSS 用于美化表格和输入字段。以下是 CSS 的简要说明:

body {font-family: Arial, sans-serif; /* 设置全局字体 */background-color: #f2f2f2; /* 设置背景颜色 */color: #333; /* 设置文本颜色 */margin: 0; /* 去除默认外边距 */padding: 20px; /* 设置页面内边距 */
}.container {width: 80%; /* 设置容器宽度 */margin: auto; /* 居中容器 */background: #fff; /* 背景颜色为白色 */padding: 20px; /* 添加内边距 */box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); /* 添加阴影效果 */
}.div_1 {text-align: center; /* 居中对齐内容 */margin-bottom: 20px; /* 添加下边距 */
}.div_1 input[type="text"] {padding: 10px; /* 添加内边距 */margin-right: 10px; /* 添加右边距 */border: 1px solid #ccc; /* 设置边框 */border-radius: 5px; /* 设置圆角边框 */
}.div_1 input[type="button"] {padding: 10px 20px; /* 添加内边距 */background-color: #007BFF; /* 背景颜色 */color: white; /* 文本颜色 */border: none; /* 去除边框 */border-radius: 5px; /* 设置圆角边框 */cursor: pointer; /* 设置鼠标样式 */
}.div_1 input[type="button"]:hover {background-color: #0056b3; /* 悬停时背景颜色变化 */
}table {width: 100%; /* 设置表格宽度 */border-collapse: collapse; /* 合并边框 */margin-bottom: 20px; /* 添加下边距 */
}table,
td,
th {border: 1px solid #ddd; /* 设置边框 */
}th,
td {padding: 12px; /* 添加内边距 */text-align: center; /* 居中对齐文本 */
}th {background-color: #007BFF; /* 表头背景颜色 */color: white; /* 表头文本颜色 */
}caption {font-size: 1.5em; /* 设置标题字体大小 */margin: 10px; /* 添加边距 */color: #007BFF; /* 设置标题颜色 */
}.div_3 {text-align: center; /* 居中对齐内容 */font-family: Arial, sans-serif; /* 设置字体 */color: #333; /* 设置文本颜色 */
}.div_3 input[type="button"] {padding: 10px 20px; /* 添加内边距 */margin: 5px; /* 添加边距 */background-color: #28a745; /* 背景颜色 */color: white; /* 文本颜色 */border: none; /* 去除边框 */border-radius: 5px; /* 设置圆角边框 */cursor: pointer; /* 设置鼠标样式 */
}.div_3 input[type="button"]:hover {background-color: #218838; /* 悬停时背景颜色变化 */
}tr:hover {background-color: #f1f1f1; /* 行悬停时背景颜色变化 */
}a {color: #007BFF; /* 链接颜色 */text-decoration: none; /* 去除下划线 */
}a:hover {text-decoration: underline; /* 悬停时添加下划线 */
}

关键 CSS 特性

  1. 容器样式:
    • .container 类将内容居中,并添加了内边距和阴影效果,使页面更具吸引力。
  2. 按钮样式:
    • 按钮具有内边距、背景色和悬停效果,提高了可用性。
  3. 表格样式:
    • 表格有清晰的边框、内边距,并且行在悬停时有背景色变化效果,提升了用户体验。
  4. 链接样式:
    • 链接样式与整体主题一致,并在悬停时显示下划线。

JavaScript 功能

JavaScript 代码处理表格的动态功能:

// 获取添加按钮元素
let add = document.getElementById("bn_add");// 点击添加按钮时触发的事件处理函数
add.onclick = function () {// 获取输入字段的值let id_text = document.getElementById("id").value;let name_text = document.getElementById("name").value;let sex_text = document.getElementById("sex").value;// 获取表格元素let table = document.getElementsByTagName("table")[0];// 插入新行let newRow = table.insertRow();newRow.innerHTML ="<td><input type='checkbox' name='user'></td>" +"<td>" + id_text + "</td>" +"<td>" + name_text + "</td>" +"<td>" + sex_text + "</td>" +"<td><a href='javascript:void(0);' οnclick='delTr(this);'>删除</a></td>";// 添加鼠标悬停效果newRow.onmouseover = function () {doOver(newRow);};newRow.onmouseout = function () {doOut(newRow);};
}// 主选择框的点击事件处理函数
document.getElementById("doChoose").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = this.checked; // 根据主选择框的状态设置复选框的状态}
};// 删除指定行的函数
function delTr(obj) {let table = obj.parentNode.parentNode.parentNode; // 获取表格let tr = obj.parentNode.parentNode; // 获取当前行table.removeChild(tr); // 删除当前行
}// 全选操作
document.getElementById("chooseAll").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = true; // 全部勾选}
}// 全不选操作
document.getElementById("chooseNull").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = false; // 全部取消勾选}
}// 反选操作
document.getElementById("chooseFan").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = !userArray[index].checked; // 反转每个复选框的状态}
}// 删除选中行操作
document.getElementById("deleteTable").onclick = function () {let userArray = document.getElementsByName("user");for (let index = userArray.length - 1; index >= 0; index--) {if (userArray[index].checked) {delTr(userArray[index]); // 删除选中的行}}
}// 行悬停效果函数
function doOver(row) {row.style.backgroundColor = "pink"; // 悬停时背景色变为粉色
}// 行悬停离开效果函数
function doOut(row) {row.style.backgroundColor = "white"; // 离开时背景色恢复为白色
}

JavaScript 功能说明

  1. 添加行:

    • add.onclick 处理输入字段的值,并在表格中添加新行,同时设置了悬停效果。
    在插入行时使用let newRow = table.insertRow();可以有效的插入表格,使得表格为一体
    或者使用childNode等属性插入
    直接table.innerHTML += 表格代码不会将其拼接为一个整体表格。调整了使用 innerHTML 方法添加新行的方式,确保将新行正确插入表格中,而不是简单地将其附加到表格的 innerHTML。
    
  2. 全选/全不选操作:

    • doChoose 处理全选和全不选操作,根据主选择框的状态更新复选框。
  3. 删除操作:

    • delTr 函数通过获取父元素删除特定行。
  4. 批量操作按钮:

    • chooseAllchooseNullchooseFan 分别实现全选、全不选和反选复选框。
    //批量删除
    document.getElementById("deleteTable").onclick = function () {let userArray = document.getElementsByName("user");for (let index = userArray.length - 1; index >= 0; index--) {if (userArray[index].checked) {delTr(userArray[index]); // 删除选中的行}}
    }
    如果我们正序删除时,userArray.length会不断变化这样会使我们每次只能删除一般,这时我们可以采取倒序删除的方法,原理如下:倒着删除不会出现上述错误的原因是,当你从后往前删除时,每次删除一行后,不会影响到尚未遍历到的元素索引。具体来说:当你正向删除时,如果删除的是索引较小的元素,后面的元素会向前移动一个位置,导致索引发生变化,从而跳过某些元素。
    倒着删除时,每次删除操作都影响已经遍历过的元素,不会影响到尚未遍历到的元素的索引,因此不会跳过任何元素。
    让我们详细看一下这两种删除方式的工作原理。正向删除
    假设你有一个数组 userArray,其长度为 5,其中元素分别为 A, B, C, D, E,并且你需要删除 BD。初始状态:[A, B, C, D, E]
    第一次删除 B 后:[A, C, D, E]
    CD 分别移动到原来 BC 的位置。
    第二次遍历到原来的索引 3 位置:E,跳过了 D。
    倒着删除
    初始状态:[A, B, C, D, E]
    第一次删除 D 后:[A, B, C, E]
    E 移动到原来 D 的位置。
    第二次删除 B 后:[A, C, E]
    此时,CE 的位置没有影响。
    从后往前删除时,每次删除操作都不会影响到未遍历到的元素的索引,因此不会出现跳过的问题。
    
  5. 行悬停效果:

    • doOverdoOut 函数在行悬停时更改背景颜色,提高用户体验。

image-20240720185454032

完整源码:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>动态表格</title><style>body {font-family: Arial, sans-serif;background-color: #f2f2f2;color: #333;margin: 0;padding: 20px;}.container {width: 80%;margin: auto;background: #fff;padding: 20px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}.div_1 {text-align: center;margin-bottom: 20px;}.div_1 input[type="text"] {padding: 10px;margin-right: 10px;border: 1px solid #ccc;border-radius: 5px;}.div_1 input[type="button"] {padding: 10px 20px;background-color: #007BFF;color: white;border: none;border-radius: 5px;cursor: pointer;}.div_1 input[type="button"]:hover {background-color: #0056b3;}table {width: 100%;border-collapse: collapse;margin-bottom: 20px;}table,td,th {border: 1px solid #ddd;}th,td {padding: 12px;text-align: center;}th {background-color: #007BFF;color: white;}caption {font-size: 1.5em;margin: 10px;color: #007BFF;}.div_3 {text-align: center;font-family: Arial, sans-serif;color: #333;}.div_3 input[type="button"] {padding: 10px 20px;margin: 5px;background-color: #28a745;color: white;border: none;border-radius: 5px;cursor: pointer;}.div_3 input[type="button"]:hover {background-color: #218838;}tr:hover {background-color: #f1f1f1;}a {color: #007BFF;text-decoration: none;}a:hover {text-decoration: underline;}</style>
</head><body><div class="container"><div class="div_1"><input type="text" name="id" id="id" placeholder="请输入编号"><input type="text" name="name" id="name" placeholder="请输入用户名"><input type="text" name="sex" id="sex" placeholder="请输入性别"><input type="button" value="添加" id="bn_add"></div><div class="div_2"><table><caption>学生信息表</caption><tr onmouseover="doOver(this);" onmouseout="doOut(this);"><th><input type="checkbox" id="doChoose"></th><th>编号</th><th>姓名</th><th>性别</th><th>操作</th></tr><tr onmouseover="doOver(this);" onmouseout="doOut(this);"><td><input type="checkbox" name="user"></td><td>1</td><td>张三</td><td></td><td><a href="javascript:void(0);" onclick="delTr(this);">删除</a></td></tr></table></div><div class="div_3"><input type="button" value="全选" id="chooseAll"><input type="button" value="全不选" id="chooseNull"><input type="button" value="反选" id="chooseFan"><input type="button" value="删除" id="deleteTable"></div></div><script>let add = document.getElementById("bn_add");add.onclick = function () {let id_text = document.getElementById("id").value;let name_text = document.getElementById("name").value;let sex_text = document.getElementById("sex").value;let table = document.getElementsByTagName("table")[0];let newRow = table.insertRow();newRow.innerHTML ="<td><input type='checkbox' name='user'></td>" +"<td>" + id_text + "</td>" +"<td>" + name_text + "</td>" +"<td>" + sex_text + "</td>" +"<td><a href='javascript:void(0);' οnclick='delTr(this);'>删除</a></td>";newRow.onmouseover = function () {doOver(newRow);};newRow.onmouseout = function () {doOut(newRow);};}document.getElementById("doChoose").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = this.checked;}};function delTr(obj) {let table = obj.parentNode.parentNode.parentNode;let tr = obj.parentNode.parentNode;table.removeChild(tr);}document.getElementById("chooseAll").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = true;}}document.getElementById("chooseNull").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = false;}}document.getElementById("chooseFan").onclick = function () {let userArray = document.getElementsByName("user");for (let index = 0; index < userArray.length; index++) {userArray[index].checked = !userArray[index].checked;}}document.getElementById("deleteTable").onclick = function () {let userArray = document.getElementsByName("user");for (let index = userArray.length - 1; index >= 0; index--) {if (userArray[index].checked) {delTr(userArray[index]);}}}//悬停在每一行上面变化颜色function doOver(row) {row.style.backgroundColor = "pink";}function doOut(row) {row.style.backgroundColor = "white";}</script>
</body></html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1486975.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue前端工程化 安装Vue-Cli与node.js 最详细步骤(带图展示)

一、安装NodeJS 1.官网下载 https://nodejs.org/zh-cn 2.直接从百度网盘中提取安装 链接&#xff1a;https://pan.baidu.com/s/1OKhHZUwPCLamvd_08Vxx0g 提取码&#xff1a;61rw 3.开始安装 二、验证NodeJS环境变量 1.Win R 输入cmd打开控制面板 2.输入 node -v 如果出…

NVIDIA 全面转向开源 GPU 内核模块

NVIDIA 全面转向开源 GPU 内核模块 文章目录 NVIDIA 全面转向开源 GPU 内核模块支持的 GPU安装程序更改使用带有 CUDA 元包的包管理器 使用运行文件使用安装帮助脚本包管理器详细信息dnf&#xff1a;Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypp…

程序员信息差,这个工具你必须知道

身为程序员&#xff0c;你是否也曾遇到过这样的情况&#xff1a;费尽心思搭建好服务器&#xff0c;开发好接口API&#xff0c;结果上线后却发现用户体验并不好&#xff0c;甚至还因为各种BUG忙得焦头烂额&#xff1f;别担心&#xff0c;你不是一个人。事实上&#xff0c;很多开…

用神经网络求解微分方程

微分方程是物理科学的主角之一&#xff0c;在工程、生物、经济甚至社会科学中都有广泛的应用。粗略地说&#xff0c;它们告诉我们一个量如何随时间变化&#xff08;或其他参数&#xff0c;但通常我们对时间变化感兴趣&#xff09;。我们可以了解人口、股票价格&#xff0c;甚至…

Python 使用TCP\UDP协议创建一个聊天室

server端代码&#xff1a; #encodingutf-8 # 服务端代码 import socketdef server():server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM)host socket.gethostname()port 12345server_socket.bind((host, port))server_socket.listen(5)print(等待客户端连接…

使用Gradle构建编译Spring boot 2.7.x

一、环境准备 JDK 1.8Spring boot 2.7.xGradle 7.5.1 (安装参考&#xff1a;win11安装Gradle)Idea 2023.1 二、源码导入gitee(可选) 按需导入。如果能科学上网&#xff0c;可跳过这一步。 为避免github访问不稳定问题&#xff0c;建议将对应的代码导入到gitee。然后通过git管…

内存泄漏详解

文章目录 什么是内存泄漏内存泄漏的原因排查及解决内存泄漏避免内存泄漏及时释放资源设置合理的变量作用域及时清理不需要的对象避免无限增长避免内部类持有外部类引用使用弱引用 什么是内存泄漏 内存泄漏是指不使用的对象持续占有内存使得内存得不到释放&#xff0c;从而造成…

【Java语法基础】1、变量、运算符、输入输出

1.变量、运算符、输入输出 跟C一样&#xff0c;先把必须写的框架写出来&#xff1a; package org.example; public class Main{public static void main(String[] args){//在里面写实际的代码} }变量 必须先定义&#xff0c;才能使用。与C、C差不多。 没有赋初值的变量无法…

windows网络应急排查

一、系统排查 msinfo32 #GUI显示的系统信息systeminfo #简单了解系统信息用户信息排查 排查恶意账号&#xff1a; 黑客喜欢建立相关账号用作远控: 1.建立新账号2.激活默认账号3.建立隐藏账号(windows中账号名$)cmd方法 net user #打印用户账号信息 ---看不到$结尾的隐藏账…

Linux - 进程的概念、状态、僵尸进程、孤儿进程及进程优先级

目录 进程基本概念 描述进程-PCB task_struct-PCB的一种 task_struct内容分类 查看进程 通过系统目录查看 通过ps命令查看 通过系统调用获取进程的PID和PPID 通过系统调用创建进程- fork初始 fork函数创建子进程 使用if进行分流 Linux进程状态 运行状态-R 浅度睡眠状态-S…

Apache Filnk----入门

文章目录 Flink 概述Flink 是什么有界流和无界流有状态流处理Flink 特点Flink vs SparkStreamingFlink 分层API Flink 快速上手WordCount 代码编写批处理流处理读取socket文本流 Flink 概述 Flink 是什么 有界流和无界流 无界数据流: 有定义流的开始&#xff0c;但没有定义流…

ts一些解决vscode飘红的方法

1、查看是否有些ts的数据类型定义问题&#xff0c;属性缺少或者属性类型不对 把对应属性加上即可 2、在飘红的代码前面设置// ts-ignore忽略此行校验&#xff08;不过一般不建议用这个方法&#xff09; 3、移除高版本不用的属性&#xff08;版本属性兼容问题&#xff09; 原因…

PP-Human行为识别(RTSP协议视频流实时检测)

基于PaddleDetection本地实现PP-Human行为识别模块&#xff08;RTSP协议视频流实时检测&#xff09; 项目介绍环境准备1. Anaconda 创建环境2. 获取 PaddleDetection3. 获取 [MediaMTX](https://github.com/bluenviron/mediamtx/releases/tag/v1.8.4)4. FFmpeg 获取5. VLC 获取…

.NET开源、简单、实用的数据库文档生成工具

前言 今天大姚给大家分享一款.NET开源&#xff08;MIT License&#xff09;、免费、简单、实用的数据库文档&#xff08;字典&#xff09;生成工具&#xff0c;该工具支持CHM、Word、Excel、PDF、Html、XML、Markdown等多文档格式的导出&#xff1a;DBCHM。 支持的数据库 Sq…

IEEE官方列表会议 | 第三届能源与环境工程国际会议(CFEEE 2024)

会议简介 Brief Introduction 2024年第三届能源与环境工程国际会议(CFEEE 2024) 会议时间&#xff1a;2024年12月2日-4日 召开地点&#xff1a;澳大利亚凯恩斯 大会官网&#xff1a;CFEEE 2024-2024 International Conference on Frontiers of Energy and Environment Engineer…

Android APP 音视频(01)MediaCodec解码H264码流

说明&#xff1a; 此MediaCodec解码H264实操主要针对Android12.0系统。通过读取sd卡上的H264码流Me获取视频数据&#xff0c;将数据通过mediacodec解码输出到surfaceview上。 1 H264码流和MediaCodec解码简介 1.1 H264码流简介 H.264&#xff0c;也被称为MPEG-4 AVC&#xff…

uni-app 影视类小程序开发从零到一 | 开源项目分享

引言 在数字娱乐时代&#xff0c;对于电影爱好者而言&#xff0c;随时随地享受精彩影片成为一种日常需求。分享一款基于 uni-app 开发的影视类小程序。它不仅提供了丰富的影视资源推荐&#xff0c;还融入了个性化知乎日报等内容&#xff0c;是不错的素材&#xff0c;同时对电影…

就业管理功能概述:构建智慧校园企业招聘平台

在智慧校园整体解决方案中&#xff0c;就业管理模块连接着学校与企业两端&#xff0c;更成为学生们步入社会、开启职业生涯梦想的关键门户。这一功能的核心价值&#xff0c;在于它如何巧妙地运用科技的力量&#xff0c;简化招聘流程&#xff0c;提升招聘效率&#xff0c;同时为…

5G赋能车联网,无人驾驶引领未来出行

无人驾驶车联网应用已成为智能交通领域的重要发展趋势。随着无人驾驶技术的不断进步和5G网络的广泛部署&#xff0c;5G工业路由器在无人驾驶车联网中的应用日益广泛&#xff0c;为无人驾驶车辆提供了稳定、高效、低时延的通信保障。 5G工业路由器的优势 低时延&#xff1a;5G网…

Python教程(一):环境搭建及PyCharm安装

目录 引言1. Python简介1.1 编译型语言 VS 解释型语言 2. Python的独特之处3. Python应用全览4. Python版本及区别5. 环境搭建5.1 安装Python&#xff1a; 6. 开发工具&#xff08;IDE&#xff09;6.1 PyCharm安装教程6.2 永久使用教程 7. 编写第一个Hello World结语 引言 在当…