本文共 3362 字,大约阅读时间需要 11 分钟。
本文介绍了一个基于 JavaScript 和 CSS 的表格排序组件,能够实现将原始 HTML 表格按照用户选择的列进行升序或降序排序,同时保留表格干净的外观和一致的样式表达。
点击任一表头单元格,该单元格下方所有行数据将根据该单元格内容进行升序排列。如果再次点击相同单元格,排序方向将翻转,变为降序。
点击其他表头单元格,会触发重新排序,排序依据变为所选单元格的内容。
排序期间,体系会自动修复表格的样式状态,确保奇偶行的背景色呈现一致要求(奇数行白色,偶数行浅灰色)。
模块化设计
getAllTables()
:获取页面中所有表格元素。makeSort()
:判断并处理可排序表格。changeStyle()
:根据排序状态切换表头样式。sortByTh()
:执行具体的排序逻辑。不依赖类库
事件处理机制
样式设计
.ascend
和 .descend
类控制相应的样式态。// sorter.js"use strict";window.onload = function () { var tables = getAllTables(); makeAllTablesSortable(tables);};function getAllTables() { return document.getElementsByTagName("table");}function makeAllTablesSortable(tables) { for (var i = 0; i < tables.length; i++) { makeSortable(tables[i]); }}function makeSortable(table) { var th = table.getElementsByTagName("th"); for (var i = 0; i < th.length; i++) { th[i].onclick = function () { var index = 0; changeStyle(th, this); for (var j = 0; j < th.length; j++) { if (this === th[j]) { index = j; } } sortByTh(table, index, this.className); }; }}function changeStyle(th, t) { for (var i = 0; i < th.length; i++) { if (th[i] == t) { th[i].className = (th[i].className.indexOf("descend") > -1) ? th[i].className.replace("descend", "ascend") : (th[i].className.indexOf("ascend") > -1) ? th[i].className.replace("ascend", "descend") : th[i].className += " descend"; } else { th[i].className = th[i].className.replace("descend", "").replace("ascend", ""); } }}function sortByTh(table, index, className) { var action = className.indexOf("descend") > -1 ? "descend" : "ascend"; var rows = table.getElementsByTagName("tr"); var tbody = table.getElementsByTagName("tbody")[0]; var sortedRows = []; for (var i = 1; i < rows.length; i++) { sortedRows.push(rows[i]); } sortedRows.sort(function (a, b) { return action === "descend" ? a.cells[index].innerHTML > b.cells[index].innerHTML : a.cells[index].innerHTML < b.cells[index].innerHTML; }); for (var i = 0; i < sortedRows.length; i++) { tbody.appendChild(sortedRows[i]); }}
表格基础样式:
table { border: 1px solid gray; margin: 0; padding: 3px; border-collapse: collapse;}
线条与背景:
tr:nth-child(even), tr:hover { background-color: #DEDEDE;}
表头样式:
th { text-align: left; background-color: #041A7F; color: white; font-weight: bold; padding-right: 16px;}
排序状态可视化:
.ascend, .descend { background-color: #A4B0FC; background-position: right; background-repeat: no-repeat;}.ascend { background-image: url("ascend.png");}.descend { background-image: url("descend.png");}
测试环境准备
index.html
文件。sorter.js
和 sorter.css
。功能测试
样式验证
此系统设计既保证了丰富的功能性,又维持了良好的可维护性,适用于多种表格排序场景。
转载地址:http://skhcz.baihongyu.com/