贝利信息

JavaScript实现基于金额目标的表格动态样式更新教程

日期:2025-11-19 00:00 / 作者:DDD

本教程将详细介绍如何利用JavaScript和CSS,根据表格中设定的金额目标与当前总金额进行比较,动态更新表格行的背景颜色,并为已达成的目标添加视觉标记。通过清晰的HTML结构、模块化的CSS样式以及交互式的JavaScript逻辑,读者将学会如何构建一个响应式的数据展示表格,提升用户体验。

在数据可视化和用户界面设计中,根据数据的实时状态动态调整元素的样式是一种常见的需求。对于表格数据,尤其是涉及到进度或目标达成情况时,通过改变行背景色或添加图标可以直观地传达信息。本文将指导您如何使用纯前端技术(HTML、CSS、JavaScript)实现一个“金额目标”表格,使其能够根据当前总金额自动高亮已达成的目标行,并添加完成标记。

1. HTML结构设计

首先,我们需要一个清晰的HTML结构来承载表格数据和总金额显示。表格包含三列:序号(A/A)、金额目标($)和目标状态(GOAL)。总金额则显示在一个单独的元素中,以便JavaScript能够轻松获取其值。

A/A $ GOAL
1 100
2 200.25
3 500

Total $200.25

关键点:

2. CSS样式定义

为了实现动态样式,我们需要定义基础表格样式以及两种特殊状态的样式:

table {
  width: 75%;
  border-collapse: collapse; /* 确保边框合并 */
  margin-top: 20px;
}

th {
  background-color: purple;
  color: #f1f1f1;
  font-size: 15px;
  padding: 8px; /* 增加内边距 */
  text-align: center;
}

tbody tr {
  background-color: #376282; /* 默认行背景色 */
  transition: background-color 0.3s ease; /* 添加过渡效果 */
}

td {
  color: #fff;
  font-size: 15px;
  padding: 8px; /* 增加内边距 */
  text-align: center;
  border: 1px solid #2a4c63; /* 添加边框 */
}

#money {
  background-color: gold;
  color: blue;
  font-size: 15px;
  padding: 4px;
  text-align: center;
  display: inline-block; /* 使span能应用padding */
  min-width: 80px; /* 确保显示完整 */
}

/* 动态样式 */
.green {
  background-color: green;
}

.tick:after {
  content: '✓'; /* 使用伪元素添加勾选标记 */
  font-weight: bold;
  color: #fff;
}

关键点:

3. JavaScript逻辑实现

JavaScript是实现动态行为的核心。它将负责读取总金额,遍历表格中的每个目标,比较数值,并根据比较结果动态添加或移除CSS类。

// 辅助函数:从DOM元素的文本内容中提取数字
function getNumber(el) {
  // 使用parseFloat解析字符串,确保处理小数
  return parseFloat(el.textContent);
}

// 1. 获取所有表格行和总金额元素
const rows = document.querySelectorAll('tbody tr');
const totalElement = document.querySelector('#money');
// 2. 解析总金额,确保其为数值类型
const totalAmount = getNumber(totalElement);

// 3. 遍历每一行,进行比较和样式更新
rows.forEach(row => {
  // 获取当前行的金额目标单元格(第二列)
  const goalAmountCell = row.querySelector('td:nth-child(2)');
  // 获取当前行的目标状态单元格(第三列)
  const statusCell = row.querySelector('td:nth-child(3)');

  // 解析当前行的目标金额
  const currentGoal = getNumber(goalAmountCell);

  // 4. 判断目标是否达成
  if (currentGoal <= totalAmount) {
    // 如果目标金额小于或等于总金额,则认为目标达成
    // 给整个行添加 'green' 类,改变背景色
    row.classList.add('green');
    // 给目标状态单元格添加 'tick' 类,显示勾选标记
    statusCell.classList.add('tick');
  }
  // 如果未达成,则不进行任何操作,保持默认样式
});

关键点: