HTML表格,宽度为100%,在tbody内部有垂直滚动。

7 浏览
0 Comments

HTML表格,宽度为100%,在tbody内部有垂直滚动。

如何设置

的宽度为100%,并且只在

内部设置垂直滚动条的高度?

vertical scroll inside tbody

table {
    width: 100%;
    display:block;
}
thead {
    display: inline-block;
    width: 100%;
    height: 20px;
}
tbody {
    height: 200px;
    display: inline-block;
    width: 100%;
    overflow: auto;
}
  

标题1 标题2 标题3 标题4 标题5
内容1 内容2 内容3 内容4 内容5

我不想添加额外的div,我只想要这样简单的表格,当我尝试改变显示方式、table-layoutposition以及其他很多CSS表格属性时,只有固定宽度的px值才能正常工作,对于100%宽度则不行。

0
0 Comments

问题出现的原因是希望在一个占满整个宽度的HTML表格中,对tbody部分进行垂直滚动。解决方法是使用纯CSS实现,通过将th元素的position设置为sticky并设置top为0来实现表头固定。此外,还可以添加一些样式来修复在滚动时默认边框无法正确绘制的问题。

具体的解决方案如下:

1. 首先,在css中添加以下样式:

/* 修复表头 */
.tableFixHead    { overflow: auto; height: 100px; }
.tableFixHead th { position: sticky; top: 0; }
/* 常见的表格样式 */
table  { border-collapse: collapse; width: 100%; }
th, td { padding: 8px 16px; }
th     { background:#eee; }

2. 然后,在html中添加以下代码:

TH 1TH 2
A1A2
B1B2
C1C2
D1D2
E1E2

3. 如果需要对th元素添加边框,可以使用以下代码来修复边框在滚动时无法正确绘制的问题:

th {box-shadow: 1px 1px 0 #000; border-top: 0;}

4. 如果还需要兼容IE11,可以参考这个答案中使用少量JS的解决方案。

5. 注意,如果对th元素添加了边框,并且使用了"border-collapse: collapse"样式,边框将会附着在tbody而不是表头上。为了避免这个问题,应该使用"border-collapse: separate"样式。具体可以参考这个回答

以上就是关于在HTML表格中实现百分之百宽度,并在tbody部分内部进行垂直滚动的问题的原因和解决方法的整理。通过使用CSS的position: sticky属性和一些样式的调整,可以轻松实现这个效果。

0
0 Comments

在这个问题中,我们想要实现一个具有100%宽度的HTML表格,并且在tbody中有垂直滚动条。为了实现tbody的滚动功能,我们需要改变它在页面中的显示方式,即使用"display: block;"将其显示为块级元素。由于我们改变了tbody的display属性,我们也应该为thead元素改变该属性,以防止破坏表格布局。因此,我们有以下CSS代码:

thead, tbody { display: block; }
tbody {
    height: 100px;       /* Just for the demo          */
    overflow-y: auto;    /* Trigger vertical scroll    */
    overflow-x: hidden;  /* Hide the horizontal scroll */
}

Web浏览器默认将thead和tbody元素显示为行组(table-header-group和table-row-group)。一旦我们改变了这个设置,里面的tr元素就不会填满其容器的整个空间。为了解决这个问题,我们需要计算tbody列的宽度,并通过JavaScript将相应的值应用于thead列。

以下是上述逻辑的jQuery版本:

// Change the selector if needed
var $table = $('table'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;
// Get the tbody columns width array
colWidth = $bodyCells.map(function() {
    return $(this).width();
}).get();
// Set the width of thead columns
$table.find('thead tr').children().each(function(i, v) {
    $(v).width(colWidth[i]);
});

解决方法中的输出结果如下(在Windows 7 Chrome 32中):

[![Vertical scroll inside tbody](https://i.stack.imgur.com/WIbZe.jpg)](http://jsfiddle.net/hashem/CrSpu/555/)

如果你想要一个具有100%宽度的表格,并且每列的宽度是相对的(以百分比表示),可以使用以下CSS代码:

table {
    width: 100%; /* Optional */
}
tbody td, thead th {
    width: 20%;  /* Optional */
}

由于表格具有流式布局,我们应该在容器调整大小时调整thead列的宽度。因此,我们应该在窗口调整大小时设置列的宽度:

// Adjust the width of thead cells when *window* resizes
$(window).resize(function() {
    /* Same as before */
}).resize(); // Trigger the resize handler once the script runs

输出结果如下:

[![Fluid Table with vertical scroll inside tbody](https://i.stack.imgur.com/In9jH.jpg)](http://jsfiddle.net/hashem/CrSpu/554/)

上述方法在Windows 7上的主要Web浏览器的新版本中进行了测试,并且可以正常工作。但是,在IE9及以下版本上可能无法正常工作。这是因为在表格布局中,所有元素都应遵循相同的结构属性。通过为thead和tbody元素使用"display: block;",我们破坏了表格结构。

解决方法之一是重新设计整个表格布局。使用JavaScript动态创建新布局,并动态处理和/或调整单元格的宽度/高度。例如,可以使用以下插件或示例来实现这种方法:

- jQuery .floatThead()插件(一个浮动/锁定/粘性表头插件)

- jQuery Scrollable Table插件

- jQuery .FixedHeaderTable()插件

- DataTables垂直滚动示例

另一种方法是使用嵌套表格。这种方法使用两个嵌套的表格和一个包含的div元素。第一个表格只有一个单元格,其中包含一个div元素,第二个表格放置在该div元素内。这种方法适用于大多数Web浏览器,也可以通过JavaScript动态执行上述逻辑。

还有一种方法是将thead元素的位置固定在屏幕顶部,而不是在tbody中添加垂直滚动条。这种方法的一个示例可以在这里找到。

上述方法中的纯CSS解决方案如下:

对于具有固定宽度的表格,可以使用以下CSS代码:

table {
    width: 716px; /* 140px * 5 column + 16px scrollbar width */
    border-spacing: 0;
}
tbody, thead tr { display: block; }
tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}
tbody td, thead th {
    width: 140px;
}
thead th:last-child {
    width: 156px; /* 140px + 16px scrollbar width */
}

输出结果如下:

[![Table with Fixed Width](https://i.stack.imgur.com/jZfgJ.jpg)](http://jsfiddle.net/hashem/CrSpu/557/)

对于具有100%宽度的表格,可以使用以下CSS代码:

table {
    width: 100%;
    border-spacing: 0;
}
thead, tbody, tr, th, td { display: block; }
thead tr {
    /* fallback */
    width: 97%;
    /* minus scroll bar width */
    width: -webkit-calc(100% - 16px);
    width:    -moz-calc(100% - 16px);
    width:         calc(100% - 16px);
}
tr:after {  /* clearing float */
    content: ' ';
    display: block;
    visibility: hidden;
    clear: both;
}
tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}
tbody td, thead th {
    width: 19%;  /* 19% is less than (100% / 5 cols) = 20% */
    float: left;
}

这种方法的在线演示可以在这里找到。

需要注意的是,如果每列的内容会换行,这种方法将无法正常工作。每个单元格的内容应足够短。

在文章的后面,还提供了其他一些纯CSS解决方案和一些实例链接,以及一个关于使用JavaScript重新设计布局的方法。

总结起来,解决这个问题的原因是通过改变tbody和thead元素的display属性,我们破坏了表格的结构和布局。解决方法是通过改变CSS样式或使用JavaScript重新设计布局,以实现所需的效果。

0
0 Comments

HTML表格宽度为100%,tbody内部有垂直滚动条的原因是,使用了纯CSS的flex布局。下面是解决方法:

可能的缺点:

1. 无论是否需要,垂直滚动条始终可见;

2. 表格布局是固定的,列不会根据内容宽度自动调整大小(仍然可以显式设置列宽度);

3. 存在一个绝对尺寸,即滚动条的宽度,根据我所测试的浏览器,大约为0.9em。

HTML代码简写:

...
head1 head2 head3 head4
content1 content2 content3 content4
content1 content2 content3 content4

CSS代码(为了清晰起见,省略了一些装饰):

.table-container {
    height: 10em;
}
table {
    display: flex;
    flex-flow: column;
    height: 100%;
    width: 100%;
}
table thead {
    flex: 0 0 auto;
    width: calc(100% - 0.9em);
}
table tbody {
    flex: 1 1 auto;
    display: block;
    overflow-y: scroll;
}
table tbody tr {
    width: 100%;
}
table thead, table tbody tr {
    display: table;
    table-layout: fixed;
}

LESS代码(可以混合进去):

.table-scrollable() {
  -width: 0.9em;
  display: flex;
  flex-flow: column;
  thead,
  tbody tr {
    display: table;
    table-layout: fixed;
  }
  thead {
    flex: 0 0 auto;
    width: ~"calc(100% - @{scrollbar-width})";
  }
  tbody {
    display: block;
    flex: 1 1 auto;
    overflow-y: scroll;
    tr {
      width: 100%;
    }
  }
}

感谢这个解决方案!有一个小问题...你为thead设置了两次宽度,我发现从宽度中减去1.05em效果更好:

[jsfiddle.net/xuvsncr2/170](https://jsfiddle.net/xuvsncr2/170)

对于内容字符数量的问题,当在行单元格中添加更多字符或单词时会出现混乱。我认为在td上设置适当的换行策略应该会有所帮助。

如果不想让表格占据父容器的100%宽度,可以尝试在表格和父容器之间添加另一个容器,并将其宽度设置为所需的宽度。

喜欢这个解决方案,谢谢!我不希望表格占据100%的高度(因为表格边框样式),这样它会根据所需高度高度,并在填充其容器后开始滚动:

.table-container {
    display: flex;
    flex-direction: column;
    justify-content: flex-start;
}

如何防止窗口调整大小时表格变形和重叠?

由于不同浏览器的滚动条宽度不同,我使用了隐藏的::after伪元素,在头部行的末尾呈现一个带有打开滚动条的间隔器。为了使其正常工作,我还使用了flexbox,确保td/th单元格扩展以填充其余行(表格布局引擎无法实现此功能)。

thead tr::after {
    visibility: hidden;
    overflow-y: scroll;
    content: '';
}
tr {
    display: flex;
}
th, td {
    flex: 1 0 0;
}

一次尝试即可解决问题,但如果你使用自定义滚动条,可能需要调整尺寸:

tbody {
    width: 99%;
}

0