You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何制作点击无跳动、带箭头图标的可排序表格(基于ListJS)

搞定可排序表格:消除表头跳动+添加排序箭头图标

我来帮你解决这个问题,结合List.js实现点击表头不跳动、带上下箭头的可排序表格,咱们一步步来实现:

1. 先解决表头点击“跳动”的问题

表头点击时的跳动,大多是因为默认的文本选中、元素位移或者List.js的默认样式导致的,咱们用这两个小妙招搞定:

  • 给表头<th>加CSS,禁用选中、预留箭头空间,取消点击位移:
.sort {
  cursor: pointer; /* 提示可点击 */
  user-select: none; /* 禁止选中文本,避免点击时的选中文本跳动 */
  position: relative; /* 给后面的箭头定位用 */
  padding-right: 20px; /* 给箭头留位置,别让文字和箭头挤在一起 */
}
.sort:active {
  transform: none; /* 取消点击时的默认位移效果 */
}
  • 初始化List.js时,确保不要触发不必要的DOM变动(默认逻辑已经够用,若有特殊需求再调整):
const options = {
  valueNames: ['name', 'born'], // 对应表格tbody里的类名
};
const userList = new List('users', options);

2. 添加上下箭头表示排序方向

咱们用CSS伪元素来做箭头,不用额外加HTML元素,简洁又方便:

/* 默认状态:箭头隐藏 */
.sort:after {
  content: '';
  position: absolute;
  right: 5px;
  top: 50%;
  transform: translateY(-50%); /* 垂直居中 */
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  opacity: 0.7; /* 箭头稍微淡一点,不抢文字风头 */
}

/* 升序状态:显示向下箭头(比如数字从小到大) */
.sort.asc:after {
  border-bottom: 5px solid #333;
}

/* 降序状态:显示向上箭头(数字从大到小) */
.sort.desc:after {
  border-top: 5px solid #333;
}

然后结合List.js的排序事件,自动切换箭头的类:

// 监听排序完成事件,更新表头的箭头类
userList.on('sortComplete', () => {
  // 先把所有表头的箭头类清空
  document.querySelectorAll('.sort').forEach(th => {
    th.classList.remove('asc', 'desc');
  });
  // 获取当前排序的字段和方向,给对应表头加类
  const currentSortField = userList.sort;
  if (currentSortField) {
    const targetTh = document.querySelector(`.sort[data-sort="${currentSortField}"]`);
    targetTh.classList.add(userList.sortDirection);
  }
});

3. 整合后的完整代码示例

HTML

<div id="users">
  <table>
    <thead>
      <!-- 给表头加sort类和data-sort属性,对应tbody里的类名 -->
      <th class="sort" data-sort="name">Name</th>
      <th class="sort" data-sort="born">Born</th>
    </thead>
    <tbody class="list"> <!-- 必须加list类,List.js会识别这个容器 -->
      <tr>
        <td class="name">Jonny Stromberg</td>
        <td class="born">1986</td>
      </tr>
      <tr>
        <td class="name">Jonas Arnklint</td>
        <td class="born">1985</td>
      </tr>
      <tr>
        <td class="name">Martina Elm</td>
        <td class="born">1986</td>
      </tr>
    </tbody>
  </table>
</div>

CSS

/* 基础表格样式,让表格好看点 */
table {
  width: 100%;
  border-collapse: collapse;
  margin: 20px 0;
}
th, td {
  padding: 10px;
  text-align: left;
  border-bottom: 1px solid #eee;
}
th {
  background-color: #f8f8f8;
}

/* 可排序表头的样式 */
.sort {
  cursor: pointer;
  user-select: none;
  position: relative;
  padding-right: 20px;
}
.sort:active {
  transform: none;
}
.sort:after {
  content: '';
  position: absolute;
  right: 5px;
  top: 50%;
  transform: translateY(-50%);
  width: 0;
  height: 0;
  border-left: 5px solid transparent;
  border-right: 5px solid transparent;
  opacity: 0.7;
}
.sort.asc:after {
  border-bottom: 5px solid #222;
}
.sort.desc:after {
  border-top: 5px solid #222;
}

JavaScript

// 初始化List.js
const options = {
  valueNames: ['name', 'born']
};
const userList = new List('users', options);

// 监听排序完成,更新箭头状态
userList.on('sortComplete', () => {
  document.querySelectorAll('.sort').forEach(th => {
    th.classList.remove('asc', 'desc');
  });
  const currentSort = userList.sort;
  if (currentSort) {
    document.querySelector(`.sort[data-sort="${currentSort}"]`)
      .classList.add(userList.sortDirection);
  }
});

这样改完之后,你点击表头就不会有跳动的问题,而且当前排序的列会显示对应的上下箭头,完全符合你的需求!

内容的提问来源于stack exchange,提问作者Kurt Peek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:35:14