如何在HTML5 / css3中创建一个水平换行的“表”?

时间:2017-05-12 22:26:29

标签: javascript css html5

我有下表使用html table,tr,td标签。 enter image description here

这一切都很棒,但我使用的是角度,问题是如果我有更多行,我没有垂直空间。相反,我想“溢出”到它的右侧,使它看起来像:

enter image description here

使用HTML5 / CSS的最佳方式是什么,以便我可以使内容溢出,如果超出表格?请注意,在某些情况下,我可能有2或3个条目,所以我希望我不必在开始时使宽度加倍于正常大小,而是根据我拥有的条目数量来确定表的大小在表中。没有滚动条。

我觉得HTML中的表格标签是限制性的,可能不允许我这样做。做这个的最好方式是什么?使用div?

<table style="background:green;">
<tr><td>Name</td><td>Sport</td><td>Score</td></tr>
<tr><td>Jordan</td><td>Soccer</td><td>50</td></tr>
<tr><td>Jordan</td><td>Soccer</td><td>50</td></tr>
<tr><td>Jordan</td><td>Soccer</td><td>50</td></tr>
</table>

尝试使用flexbox方法,虽然看起来如果我将flexbox放在div中,但是当条目超出第一列时,背景似乎不会正确填充:

https://jsfiddle.net/t0h7w2hw/

5 个答案:

答案 0 :(得分:8)

请按照以下代码示例

这将在移动设备中以列表样式包装行。 您需要为每个内容td添加数据标签属性,以便它知道它是哪个列。在移动设备中,您可以使用css内容在“td”之前显示标签:“”属性。

body {
  font-family: "Arial", sans-serif;
  line-height: 1.25;
}
table {
  border: 1px solid #ccc;
  border-collapse: collapse;
  margin: 0;
  padding: 0;
  width: 100%;
  table-layout: fixed;
}
table caption {
  font-size: 1.5em;
  margin: .5em 0 .75em;
}
table tr {
  background: #f8f8f8;
  border: 1px solid #ddd;
  padding: .35em;
}
table th,
table td {
  padding: .625em;
  text-align: center;
}
table th {
  font-size: .85em;
  letter-spacing: .1em;
  text-transform: uppercase;
}
@media screen and (max-width: 600px) {
  table {
    border: 0;
  }
  table caption {
    font-size: 1.3em;
  }
  table thead {
    border: none;
    clip: rect(0 0 0 0);
    height: 1px;
    margin: -1px;
    overflow: hidden;
    padding: 0;
    position: absolute;
    width: 1px;
  }
  table tr {
    border-bottom: 3px solid #ddd;
    display: block;
    margin-bottom: .625em;
  }
  table td {
    border-bottom: 1px solid #ddd;
    display: block;
    font-size: .8em;
    text-align: right;
  }
  table td:before {
    /*
    * aria-label has no advantage, it won't be read inside a table
    content: attr(aria-label);
    */
    content: attr(data-label);
    float: left;
    font-weight: bold;
    text-transform: uppercase;
  }
  table td:last-child {
    border-bottom: 0;
  }
}
<table>
  <caption>Statement Summary</caption>
  <thead>
    <tr>
      <th scope="col">Card</th>
      <th scope="col">Due Date</th>
      <th scope="col">Amount</th>
      <th scope="col">Period</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td data-label="Card">Visa - 3412</td>
      <td data-label="Due Date">04/01/2016</td>
      <td data-label="Amount">$1,190</td>
      <td data-label="Period">03/01/2016 - 03/31/2016</td>
    </tr>
    <tr>
      <td scope="row" data-label="Card">Visa - 6076</td>
      <td data-label="Due Date">03/01/2016</td>
      <td data-label="Amount">$2,443</td>
      <td data-label="Period">02/01/2016 - 02/29/2016</td>
    </tr>
    <tr>
      <td scope="row" data-label="Card">Corporate AMEX</td>
      <td data-label="Due Date">03/01/2016</td>
      <td data-label="Amount">$1,181</td>
      <td data-label="Period">02/01/2016 - 02/29/2016</td>
    </tr>
    <tr>
      <td scope="row" data-label="Card">Visa - 3412</td>
      <td data-label="Due Date">02/01/2016</td>
      <td data-label="Amount">$842</td>
      <td data-label="Period">01/01/2016 - 01/31/2016</td>
    </tr>
  </tbody>
</table>

答案 1 :(得分:3)

实际上,使用CSS没有为HTML表元素定义这样的工具。我尝试了一些通过给表和包含div的各种位置,没有工作。与您提供的小提琴示例一样,您必须使用HTML div元素。

答案 2 :(得分:3)

X = 1
Do Until IsEmpty(Sheet9.Cells(X, 30).Value) Or X > Sheet1.Range("C6").Value
    no2 = Sheet9.Cells(X, 30).Value
    no1 = Sheet9.Cells(X, 31).Value
    result = WorksheetFunction.Min(no1, no2)
    Sheet9.Cells(X, 30).Value = result
    X = X + 1
Loop

JsFiddle Link http://jsfiddle.net/U3pVM/32296/

你只需要为第一列创建一大块记录,你可以在控制器本身中创建,然后在ng-repeat的帮助下你可以渲染它

答案 3 :(得分:2)

使用divcolumn

.columns {
  column-count: 2;
  column-gap: 10px;
}
.myTable {
  display: table;
  width: 100%;
  height: 200px;
}
.myHeader {
  width: 100%;
  font-weight: bold;
}
.myCell {
  display: table-cell;
  width: 33%;
  float: left;
}
<div class="columns">
  <div class="myTable">
    <div class="myHeader">
      <div class="myCell">Name</div>
      <div class="myCell">Sport</div>
      <div class="myCell">Score</div>
    </div>
    <div class="myCell">Bob</div>
    <div class="myCell">Soccer</div>
    <div class="myCell">8</div>
    <div class="myCell">Jane</div>
    <div class="myCell">Softball</div>
    <div class="myCell">9</div>
    <div class="myCell">Hank</div>
    <div class="myCell">Baseball</div>
    <div class="myCell">6</div>
    <div class="myCell">Lisa</div>
    <div class="myCell">Soccer</div>
    <div class="myCell">9</div>
    <div class="myCell">Bill</div>
    <div class="myCell">Football</div>
    <div class="myCell">4</div>
  </div>
</div>

FIDDLE

答案 4 :(得分:2)

  

这一切都很棒,但我使用角度,问题是如果我   有更多的行,我没有垂直的空间。

与角度有什么关系呢?

  

[..]如果我有更多行,我没有垂直空间。   相反,我想“溢出”到它的右边

表格不会给你那种灵活性,尤其是你无法将行的高度和流量控制为列。

  

[..]这样我可以使内容溢出,如果它超过了   表?请注意,在某些情况下,我可能有2或3个条目,所以我是   希望我没有必要使宽度加倍于正常尺寸   开始,而是根据数量来确定表的大小   我在表格中的条目。

一种简单快捷的方法是将行拆分为自己的表。如果你可以拥有这种结构,那么只需要using CSS columns

通常,您会将所有这些表包装在div中,该height具有column-*个约束。在包裹div上设置column-gap属性,然后就可以了。您可以使用column-rulecolumn-spancolumn-fillbreak-inside: avoid属性来美化整个内容。

另请注意,您需要在表格上使用#rowflow { height: 120px; max-height: 120px; border: 1px solid #d33; overflow: hidden; column-width: 200px; column-gap-width: 0px; column-fill: auto; column-rule: 1px solid #bbb; } table { font-family: sans-serif; margin-bottom: 2px; table-layout: fixed; width: 190px; } table:first-child { column-span: all; } table, th, td { border-collapse: collapse; border: 0px solid gray; padding: 6px; } table, tr { break-inside: avoid; } th, td { text-align: left; } th:last-child, td:last-child { text-align: right; },以避免它们在流向下一列时中途中断。

示例代码段

<div id="rowflow">
  <table><tr><th>Name</th><th>Sport</th><th>Score</th></tr></table>
  <table><tr><td>Jordan</td><td>Soccer</td><td>50</td></tr></table>
  <table><tr><td>Jordan</td><td>Soccer</td><td>50</td></tr></table>
  <table><tr><td>Jordan</td><td>Soccer</td><td>50</td></tr></table>
  <table><tr><td>Jordan</td><td>Soccer</td><td>50</td></tr></table>
  <table><tr><td>Jordan</td><td>Soccer</td><td>50</td></tr></table>
</div>
div

在上面的代码段中,包裹div是高度限制的,您可以看到列流动。

Use this fiddle 尝试更改窗口大小并查看效果。

  

[..]所以我希望我不必将宽度增加一倍   在开始时正常,而是根据表格调整表格   我在表中的条目数。没有滚动条。

包裹overflow本身就是全宽的。但是,您可以使用table-layout: fixed来控制溢出的处理方式。根据内容的宽度动态改变宽度是一个完全不同的球类游戏,你需要使用JavaScript并且它会变得混乱。

注意:要使上述示例正常工作,您需要修复表格的宽度,以使列整齐排列。您可以使用.unbind()来使用固定布局。