如何在所有行中将列缩小到该列的最大宽度,例如表格中的 td 宽度?

Posted

技术标签:

【中文标题】如何在所有行中将列缩小到该列的最大宽度,例如表格中的 td 宽度?【英文标题】:How to shrink column to max width of that column in all rows, like td width in a table? 【发布时间】:2021-05-18 09:29:40 【问题描述】:

我想用flexbox 元素替换table

基本上由此而来:

<table>
  <tr>
    <td>row_1.col_1</td>
    <td>row_1.col_2</td>
  </tr>
  <tr>
    <td>row_2.col_1.with_longer_content</td>
    <td>row_2.col_2</td>
  </tr>
</table>

到这里:

<div>
  <div>
    <div>row_1.col_1</div>
    <div>row_1.col_2</div>
  </div>
  <div>
    <div>row_2.col_1.with_longer_content</div>
    <div>row_2.col_2</div>
  </div>
</div>

在表格的情况下,第一行的第一个单元格将扩大宽度,以便第二个单元格 row_1.col_2 将与其下方的单元格正确对齐 row_2.col_2

-------------------------------------------------
| row_1.col_1                     | row_1.col_2 |
| row_2.col_1.with_longer_content | row_2.col_2 |
-------------------------------------------------

我怎样才能对 div 做同样的事情,使用 flexbox,以便第一列占用最少的宽度,但第二列仍然对齐?

这可能吗?

我之所以要这样做是因为我希望每一行都是 Quasar q-card,但其中的元素应该与上面和下面的卡片对齐,但仍然占用最少的空间而不是通过“12 列”网格系统控制宽度。

基本上像这样,我需要将徽章和输入对齐,就好像它是一张桌子一样(我不能使用q-table,而且——由于使用了UMD——也不是q-markup-table) :

<q-card>
  <q-card v-for='element in elements'>
    <q-badge>element.badge</q-badge>
    <q-input v-model='element.text'></q-input>
  </div>
</div>

【问题讨论】:

如果你想让 div 表现得像一个表格,为什么不使用显示表格而不是 flex 呢?另外,如果是表格数据,有什么理由删除表格? 看这个***.com/questions/46824086/… 【参考方案1】:

display:table代替flex可能会更好

div 
  display: table;


div>div 
  display: table-row;


div>div>div 
  display: table-cell;
<div>
  <div>
    <div>row_1.col_1</div>
    <div>row_1.col_2</div>
  </div>
  <div>
    <div>row_2.col_1.with_longer_content</div>
    <div>row_2.col_2</div>
  </div>
</div>

【讨论】:

我只是想指出,当“行”-div 之间应该有间距时,这会产生一个问题,例如将box-shadow 应用于它们时,这将被下一个覆盖排。可以将行包装在&lt;template&gt;-tag 中,遍历模板,并让模板包含q-card,后跟固定高度的div。然后这个 div 在q-cards 之间创建空白空间,使下阴影可见。 @DanielF 如果你想要行之间的间距,你可以使用border-spacing: 0 10px; 来添加一些间距(这就像老式的单元格间距) - 请参阅这篇文章:***.com/questions/1264187/…【参考方案2】:

使用display: flexbox,您可以通过按列而不是按行组织数据来做到这一点。使用display: table 可以维护表的结构。例子:

.flex-table 
  display: flex;


.column 
  padding: 4px;


.table 
  display: table;


.table-row 
  display: table-row;


.table-cell 
  display: table-cell;
  padding: 0 4px;
<h3>table</h3>

<table>
  <tr>
    <td>row_1.col_1</td>
    <td>row_1.col_2</td>
  </tr>
  <tr>
    <td>row_2.col_1.with_longer_content</td>
    <td>row_2.col_2</td>
  </tr>
</table>

<h3>flexbox table</h3>

<div class="flex-table">
  <div class="column">
    <div>row_1.col_1</div>
    <div>row_2.col_1.with_longer_content</div>
  </div>
  <div class="column">
    <div>row_1.col_2</div>
    <div>row_2.col_2</div>
  </div>
</div>

<h3>display table</h3>

<div class="table">
  <div class="table-row">
    <div class="table-cell">row_1.col_1</div>
    <div class="table-cell">row_1.col_2</div>
    
  </div>
  <div class="table-row">
    <div class="table-cell">row_2.col_1.with_longer_content</div>
    <div class="table-cell">row_2.col_2</div>
  </div>
</div>

【讨论】:

我确实考虑过这一点,但这会与通过v-for='element in elements' 遍历每个对象混淆(但是,再想一想,可能不会那么多,因为我只需要遍历每一列.) @DanielF 我已经用另一种解决方案更新了我的答案,该解决方案可以维护标记中的数据结构,请再看看。 谢谢。因为我对第一种方法的问题是我不能遍历每一列,因为每一行都应该是一个 q-card 元素。【参考方案3】:
<style>
    .row 
        display: -ms-flexbox;
        display: flex;
        -ms-flex-wrap: wrap;
        flex-wrap: wrap;
        margin-right: -15px;
        margin-left: -15px;
    

    .col 
        -ms-flex-preferred-size: 0;
        flex-basis: 0;
        -ms-flex-positive: 1;
        flex-grow: 1;
        max-width: 100%;
        position: relative;
        width: 100%;
        padding-right: 15px;
        padding-left: 15px;
    

    .text-wrap 
        white-space: normal !important;
    
</style>

<div>
    <div class="row">
        <div class="col text-wrap">row_1.col_1</div>
        <div class="col text-wrap">row_1.col_2</div>
    </div>
    <div class="row">
        <div class="col text-wrap">row_2.col_1.with_longer_content</div>
        <div class="col text-wrap">row_2.col_2</div>
    </div>
</div>

尝试这样编写,如果您不想使用上述样式,请改用 bootstrap css 链接。

【讨论】:

以上是关于如何在所有行中将列缩小到该列的最大宽度,例如表格中的 td 宽度?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JavaScript 调整表格列的宽度

CSS 表格列宽不适合某些屏幕尺寸

Bootstrap 使所有列等于最大 col-auto 宽度

如何在所有表中查找特定列并在 PostgreSQL 中修改该列的值

无论单元格中的文本量如何,都将表格列宽设置为常数?

在接近限制的数据库中查找列的工具?