【问题标题】:Excel like HTML table scrollable on x-axis (full table) and y-axis (header fixed)Excel 类似 HTML 表格,可在 x 轴(完整表格)和 y 轴(固定标题)上滚动
【发布时间】:2023-04-03 16:25:02
【问题描述】:

我想构建一个具有固定宽度列的表格。在大多数情况下,表格数据会水平和垂直溢出。

如果列的宽度大于视图宽度,则需要一个水平滚动条来滚动并查看所有表格列,同时滚动标题和数据。

如果数据的高度大于可用视图,则会出现一个垂直滚动框,但在滚动时保持标题固定,以便用户关注列。

这是一种类似于 Microsoft Excel 的行为(仅供阅读)。比如:

我看过几个帖子,但他们只解决了水平滚动或垂直滚动​​。我需要一个可以同时在两种条件下工作的解决方案。

Here is a FIDDLE 我正在努力工作,但即使是使用overflow-x: auto 的简单水平滚动也无法正常工作。我需要一个纯 HTML + CSS 来嵌入 ReactJS 组件。

【问题讨论】:

  • 我认为这对于纯 HTML + CSS(没有 JavaScript)是不可能的。如果我错了,我很乐意得到纠正。你能用 JavaScript 吗(因为你用的是 react)?
  • 纯 JS 好的。不支持 jQuery。

标签: html css


【解决方案1】:

显然,这需要一些调整才能使其完美,但我假设您不会留下所有那些鲜红色的边框等。我冒昧地将列放大(强制宽度为 400px)以更好地展示效果。

本质上,有一个position:absolute;,它的top 在滚动时被强制等于父 div 的 scrollTop。

http://jsfiddle.net/d13d2fab/3/

document.querySelector('.ux-data-table').onscroll = function (e) {
  // called when the window is scrolled.
  var topOfDiv = Math.max(document.querySelector(".ux-data-table").scrollTop - 2, 0);
  document.getElementsByTagName('thead')[0].style = "top:" + topOfDiv + "px;";
}
.ux-data-table {
  width: 100%;
  height: 200px;
  overflow: auto;
}

/* Prevents the header from overflowing the scrollbars */
.ux-data-table-inner {
  position: relative;
}

.ux-data-table table {
  width: 100%;
}

.ux-data-table table,
.ux-data-table th,
.ux-data-table td {
  background-color: red;
  color: white;
  border: 1px solid black;
  width: 400px;
  min-width: 400px;
}

.ux-data-table thead {
  position: absolute;
}
.ux-data-table tbody {
  margin-top: 20px;
  display:block;
}
.ux-data-table td {
  background-color: white;
  color: red;
  border: 1px solid black;
}
<div class='ux-data-table'>
  <div class='ux-data-table-inner'>
    <table>
      <thead>
        <tr>
          <th>#</th>
          <th>Col 1</th>
          <th>Col 2</th>
          <th>Col 3</th>
          <th>Col 4</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>1</td>
          <td>Item 1</td>
          <td>CD player</td>
          <td>Used</td>
          <td>Sony</td>
        </tr>
        <tr>
          <td>2</td>
          <td>Item 2</td>
          <td>Variscope</td>
          <td>Used</td>
          <td>General</td>
        </tr>
        <tr>
          <td>3</td>
          <td>Item 3</td>
          <td>Microphone</td>
          <td>New</td>
          <td>Mastersound</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
        <tr>
          <td>4</td>
          <td>Item 4</td>
          <td>Cable</td>
          <td>New</td>
          <td>Techable</td>
        </tr>
      </tbody>
    </table>
  </div>
</div>

【讨论】:

  • 我喜欢移动标题的技巧,但是如果整个表格内容水平适合屏幕,就会出现问题。尝试过的宽度:50pxmin-width: 50px,目前为 400px,垂直滚动保持在屏幕右侧,而不是桌面本身......
  • 只需添加一个float:left;。我还在单元格列中添加了max-widthjsfiddle.net/d13d2fab/4 如果需要,您可以添加divclear:both,这样后续的 DOM 就不会环绕它。
  • 感谢@Jonathan,但我仍然无法让它工作,因为我所有的列都有固定的宽度,每列不同。为了尊重我使用table-layout: fixed 的宽度,这会破坏一些东西......我在这里迷路了......感谢帮助。
  • 你有它在小提琴吗?
  • jsfiddle.net/k5k7vtwu。不包含表类的table-layout: fixed 属性。
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 2017-12-26
  • 2021-12-28
  • 2012-01-27
  • 2021-02-05
  • 2019-12-19
  • 2021-12-25
相关资源
最近更新 更多