【问题标题】:Table cell with nowrap overflows带有 nowrap 溢出的表格单元格
【发布时间】:2016-08-16 11:23:55
【问题描述】:

我正在使用引导程序,并想创建一个简单的 HTML table,在最后一列中,我有一个 2 按钮组和一个单独的按钮。我希望最后一个单元格始终将这 3 个按钮保持在一行中,因此我添加了 text-nowrap 引导类(这是一个简单的 white-space: nowrap)。

如果其他单元格的内容足够长,最后一个单元格的内容会水平溢出,我不明白为什么。我希望表格的其余部分会缩小以为非包装单元格腾出空间。

这里是重现问题的演示:bootply

这是标记。

<div style="width: 500px">
  <table class="table table-striped">
    <tbody><tr>
      <td>Test text</td>
      <td class="text-nowrap">
        <div class="btn-group">
          <button class="btn btn-default"><span>A</span></button>
          <button class="btn btn-warning"><span>B</span></button>
        </div>
        <button class="btn btn-success"><span>C</span></button>
      </td>
    </tr>
  </tbody></table>
</div>

按钮组div 和单独的button 都是inline-block 元素,因此包装应该按预期IMO 工作。我做错了什么?

也许这与引导程序并不严格相关。

更新

  • 我已经更新了 bootply,链接是以前的版本,抱歉
  • 在最新的 Chrome 和 IE 中测试,两者的问题几乎相同。

原因和解决方法

  • 我已经意识到从btn-group 展开两个按钮会产生正确的布局,因此我开始检查btn-group 的实际作用。
  • 我发现btn-group 中的btns 是浮动的,这种浮动会导致布局错误。 clearfix 类添加到btn-group 可以解决问题。 不,实际上没有,仍在研究中...
  • 我将研究为什么引导程序需要float: left,看起来组中的按钮可以通过纯粹使用inline-block 来对齐,没有边距。我将在v4-alpha 代码中检查这一点,并将此问题报告给引导程序v3

【问题讨论】:

  • 很高兴您找到了自己的方式。是的,浮动内容不计入单元格将获得的总部分。从您的示例代码中,右侧列的宽度被计算为该列只有一个按钮。但是添加 clearfix 会取消浮动。
  • btn-group 有意设置为浮动,这样当溢出发生时,任何按钮都不会离开屏幕或呈现在其容器之外。

标签: html css twitter-bootstrap


【解决方案1】:

&lt;table class="table"&gt; 将填充其容器的 100% 宽度。列宽与其内容的宽度按比例划分。

当左侧占据较大部分时,按钮栏将“短”。

当左侧部分较小时,按钮列会变大,从而使按钮“向中心移动”。

解决方法:将右侧列的宽度设置为固定值。所有三个按钮的组合宽度的总值:width:125px。如下图:

<div style="width: 500px">
  <table class="table table-striped">
    <tbody><tr>
      <td>Test text</td>
      <td class="text-nowrap" style="width:125px;">
        <div class="btn-group">
          <button class="btn btn-default"><span>A</span></button>
          <button class="btn btn-warning"><span>B</span></button>
        </div>
        <button class="btn btn-success"><span>C</span></button>
      </td>
    </tr>
  </tbody></table>
</div>

见:http://www.bootply.com/PGL6xCDgMz

这会将按钮列的宽度设置为 125 像素的固定值。所以左边的列将得到剩下的任何部分。

更新 1:(根据提问者 cmets)

- 技巧 1:

<div style="width: 500px">
  <table class="table table-striped">
    <tbody><tr>
      <td>Test text</td>
      <td class="text-nowrap">
        <table cellpadding="0" cellspacing="0">
          <tr>
            <td><button class="btn btn-default"><span>A</span></button></td>
            <td><button class="btn btn-warning"><span>B</span></button></td>
            <td><button class="btn btn-success"><span>C</span></button></td>
          </tr>
        </table>
      </td>
    </tr>
  </tbody></table>
</div>

- 技巧 2:

<div style="width: 500px">
  <table class="table table-striped">
    <tbody><tr>
      <td>Test text</td>
      <td><button class="btn btn-default"><span>A</span></button></td>
      <td><button class="btn btn-warning"><span>B</span></button></td>
      <td><button class="btn btn-success"><span>C</span></button></td>
    </tr>
  </tbody></table>
</div>

【讨论】:

  • 谢谢,我知道我总是可以为列设置一个固定的宽度,但这样就根本不需要nowrap 功能了。我使用nowrap 来避免需要固定宽度。
  • 对不起,您没有提到您在问题中避免了这一点。然后你应该将你的按钮包装在一个普通的&lt;table&gt; 中或将它们放在单元格中,因为表格行没有被包装,而空白被包装。我会根据你的评论更新我的答案。
  • 其实我刚刚找到问题的原因,并相应地更新了我的帖子/
【解决方案2】:

你也可以使用另一个

td {
  max-width: 100px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

【讨论】:

  • 谢谢,是的,这个肯定需要fixed 布局模式,但是,我不想拥有max-width,甚至不需要width。我只是希望内容不换行,而其他列可以容纳。
【解决方案3】:

阅读更多信息this link

table { table-layout:fixed; width:100%; }

而不是使用表格布局:固定;对于您的表,您可以使用此技巧让 DIV 始终占用具有 text-overflow: ellipsis; 功能的 TD 的全部空间:

div { width: 0; min-width: 100%; }

主要技巧是为宽度提供除自动/百分比以外的其他值,并使用 100% 的最小宽度;

 div { width: 0; min-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
table.myTable { width: 100%; border-collapse: collapse; }
td { border: 1px solid #000; }

td.td1 { width: 100%; min-width: 50px; }
td.td2 { width: 100px; min-width: 100px; }
td.td3 { width: 150px; min-width: 150px; }

td.td4 { width: 50%; min-width: 50px; }
td.td5 { width: 50%; min-width: 50px; }
td.td6 { width: 150px; min-width: 150px; }

【讨论】:

  • 感谢您的回答,我知道fixed table-layout,但是,我认为只有在想要控制溢出时才需要它(例如带有省略号的文本溢出)。我不会想到 simple 非包装内容需要它。我在链接中没有找到任何关于此的注释。真的没有别的办法了吗?固定布局引入了一些副作用 AFAIK。
  • 我不需要省略号溢出功能,也不想使用固定列宽,因为这就是我使用text-nowrap 模式的原因,以避免需要固定宽度。也许你误解了什么。请检查我更新的引导程序(如果您还没有),我的问题就是为什么最后一个按钮会溢出蓝色行。
  • 其实我刚刚找到问题的原因,并相应地更新了我的帖子/
【解决方案4】:

这里是更新的Demo

/* CSS used here will be applied after bootstrap.css */
tr{
  background-color: yellow;
  display: flex !important;
}

tr .text{
  flex: 3
}
tr .buttons{
  flex: 1;
}
<div style="width: 500px;">
  <table class="table table-striped">
    <tbody>
      <tr style="background-color: blue;">
        <td class="text">Test text Test text Test text Test textTest text Test textTest text Test text</td>
        <td class="text-nowrap buttons">
          <div class="btn-group">
            <button class="btn btn-default"><span>A</span></button>
            <button class="btn btn-warning"><span>B</span></button>
          </div>
          <button class="btn btn-success"><span>C</span></button>
        </td>
      </tr>
    </tbody>
  </table>
</div>

注意:按钮上的样式不会反映在给定的代码中,因为它们来自引导程序。但将在 Demo

中工作

【讨论】:

  • 感谢您的回答,实际上我还不想使用 flexbox,而且,这似乎有点类似于使用固定宽度的列,我也想避免这种情况。
【解决方案5】:
// Try It 
table { table-layout:fixed; width:100%; }

【讨论】:

  • 感谢您的回答,我知道fixed table-layout,但是,我认为只有在想要控制溢出时才需要它(例如带有省略号的文本溢出)。我不会想到 simple 非包装内容需要它。真的没有别的办法了吗?固定布局引入了一些副作用 AFAIK。
  • 嗨 Samudrala :在某些情况下,您的纯代码答案会更好。例如,您可以解释为什么使用fixed 布局是解决提问者问题的好方法;那么它对他们以及其他寻找类似问题答案的读者都会更有用。
猜你喜欢
  • 2013-01-26
  • 2019-02-02
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
相关资源
最近更新 更多