【问题标题】:CSS: Constrain a table with long cell contents to page width?CSS:将具有长单元格内容的表格限制为页面宽度?
【发布时间】:2022-04-28 21:27:57
【问题描述】:

采取以下CSS+HTML:

<style>
    div.stuff {
        overflow: hidden;
        width: 100%;
        white-space: nowrap;
    }
    table { width: 100%; }
    td { border: 1px dotted black; }
</style>

<table>
    <tr><td>
        <div class='stuff'>Long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text</div>
    </td></tr>
</table>

这会导致表格增长以容纳整个长文本。 (让你的浏览器窗口变小,看看你的屏幕分辨率是否很高。)

我添加了width: 100%overflow: hidden 表示应该简单地截断长文本,但它似乎忽略了这一点。如何约束表格/表格单元格/div,使表格的宽度不超过文档的宽度?

(请不要评论使用表格的优点。我确实是显示表格数据,所以使用表格在语义上是正确的。另外请不要质疑切断的用户友好性text;实际上有一个“展开”按钮,允许用户查看全部内容。谢谢!)

(编辑:我也试过max-width,但无济于事。)

【问题讨论】:

    标签: css


    【解决方案1】:

    要实现这一点,您必须将长文本包装成两个 div。外层得到position: relative,只包含内层。内层获得position: absoluteoverflow: hiddenwidth: 100%(这将其限制为表格单元格的大小)。

    表格布局算法现在认为这些表格单元格是空的(因为绝对定位的元素被排除在布局计算之外)。因此,我们必须告诉它无论如何都要增长该列。有趣的是,在相关的 &lt;col&gt; 元素上设置 width: 100% 是有效的,因为它实际上并没有填充 100% 的宽度,而是 100% 减去所有其他列的宽度(自动调整大小)。它还需要vertical-align: top,否则(空)外部 div 会居中对齐,因此绝对定位的元素将偏离半行。

    这是一个完整的示例,其中包含一个三列两行的表格,展示了这一点:

    CSS:

    div.outer {
        position: relative;
    }
    div.inner {
        overflow: hidden;
        white-space: nowrap;
        position: absolute;
        width: 100%;
    }
    table {
        width: 100%;
        border-collapse: collapse;
    }
    td {
        border: 1px dotted black;
        vertical-align: top;
    }
    col.fill-the-rest { width: 100%; }
    

    HTML:

    <table>
        <col><col><col class="fill-the-rest">
        <tr>
            <td>foo</td>
            <td>fooofooooofooooo</td>
            <td>
                <div class='outer'>
                    <div class='inner'>
                        Long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text long text
                    </div>
                </div>
            </td>
        </tr>
        <tr>
            <td>barbarbarbarbar</td>
            <td>bar</td>
            <td>
                <div class='outer'>
                    <div class='inner'>
                        Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text Some more long text
                    </div>
                </div>
            </td>
        </tr>
    </table>
    

    在此示例中,前两列将具有最小的可能大小(即空格会使它们换行很多,除非您还向它们添加 white-space: nowrap)。

    jsFiddle:http://jsfiddle.net/jLX4q/

    【讨论】:

    • 非常好的解决方案和解释。值得指出的是,div.inner { width: 100%; } 是相关部分 - 如果没有该设置,overflow 将不会做任何事情,而内部 &lt;div&gt; 只会向右流出。此外,text-overflow: ellipsis; is now widely supported 和应设置在内部 &lt;div&gt; 以获得比仅剪切文本更好的效果。
    • 我必须给我的外部班级一个高度才能完成这项工作。还必须将边距设置为自动,并将顶部和底部设置为 0 才能使这项工作。我的 td 上有一些填充物,所以我认为这是导致问题的原因
    • 有没有办法让它允许动态高度?例如,我想在表格单元格内有无限数量的堆叠 div,但我希望每个 div 根据宽度溢出。您的示例从表格单元格计算中取出了“外部”div 的宽度,但它似乎并没有以相同的方式处理高度;单元格的高度由行中其他单元格的最大高度决定(就像宽度由列中的其他单元格决定),但溢出-y 的行为方式与溢出-x 不同。
    • 谢谢!!惊人的解决方案,工作完美!拯救了我的一天:)
    【解决方案2】:

    我添加了 width: 100% 和 overflow: hidden 表示应该简单地截断长文本,但它似乎忽略了这一点。

    不要忽略这一点,您的 div 正在扩展 100% 的表格宽度,该宽度设置为按原样扩展 100%,只需给您的 td 一个最大宽度,它应该会按照您的预期截断。

    【讨论】:

    • 这不是您想要的效果吗? - 我添加了 width: 100% 和 overflow: hidden 表示应该简单地切断长文本,但它似乎忽略了这一点。 --
    • 这是我写的一个演示,用于回答 SO 中的另一个问题,jsfiddle.net/caq8F/5,它在 td 内有一个 div 扩展 100% 并启用了溢出-x。
    • “这不是你想要的效果吗?” - 不,当然不是;如果页面是 500px 宽怎么办? 1000 像素?有人会认为 100% 应该意味着 100%...
    • 好的,那么,您希望在什么时候截断文本?您必须考虑一下,100% 宽度并不是很具体。
    • 另外,100% 是什么?宽度是相对于父级的,如果你有一个 500px 宽的表格,500px 的 100% 是 500px,如果你指的是 body 标签,100% 是内容的宽度,如果你指的是html标签,100%宽度是内容中所有可用的大小,你必须定义100%。
    【解决方案3】:

    以@Timwi 的解决方案为基础...

    table {
     width: 100%;
     border: 1px solid #ccc;
    }
    
    td {
     padding: 14px;
     line-height: 1.5;
     border: 1px solid #ccc;
    }
    
    .outer {
     position:relative;
     height: 22px;
    }
    
    .inner {
      position: absolute;
      overflow: hidden;
      width: 100%;
      white-space: nowrap;
      margin: auto;
      top: 0;
      bottom:0;
    }
    
    <table>
      <tr>
        <td>
          <div class="outer">
            <div class="inner">
              this_is_a_really_long_string_of_text
            </div>
          </div>
        </td>
        <td>
          222222222
        </td>
      </tr>
    </table>
    

    我使用的是引导程序 2.3.2,所以这就是高度值的来源。这是小提琴的链接http://jsfiddle.net/YFCV6/

    【讨论】:

      【解决方案4】:

      答案略有不同:如果您希望表格显示其所有内容,同时仍受限于页面宽度,请尝试使用overflow-wrap: anywhere。这会强制文本换行,尽可能打破单词边界。

      要支持旧版浏览器,您可以使用旧版 word-break: break-wordword-break: break-all 作为备用。

      此处示例:https://jsfiddle.net/joseph_white3/nhj9fLrw/

      另请注意:如果您希望仅根据第一行确定列宽,请仅设置 table-layout: fixed。请参阅documentation on MDN

      【讨论】:

        【解决方案5】:

        您设置了 nowrap,因此 td 无法正确约束内容。删除该值应该会达到预期的结果。

        【讨论】:

        • 不,删除该值将使文本换行。
        • 哦,我的错,我没有意识到你想要切断文本 - 抱歉。您是否尝试将 td 设置为溢出:隐藏?
        【解决方案6】:

        只要你有任何 width: 100% 标签,它就会扩展以包含内容。

        获得所需结果(不换行的文本)的一种方法是让一个带有隐藏溢出的外部 div + 一个固定宽度,然后是一个具有超宽宽度的内部 div。

        http://jsfiddle.net/xvaEw/

        【讨论】:

        • 您完全可以不使用外部 div 来做到这一点:只需将内部 div 限制为该大小。
        猜你喜欢
        • 1970-01-01
        • 2017-12-17
        • 1970-01-01
        • 2013-12-26
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 2013-10-31
        相关资源
        最近更新 更多