HTML表中的自动换行


566

我一直在用s和s word-wrap: break-word包装文字。但是,它似乎在表单元格中不起作用。我将表设置为,其中包含一行和两列。列中的文本尽管具有上述样式,但不会自动换行。它导致文本超出单元格的边界。在Firefox,Google Chrome和Internet Explorer上会发生这种情况。divspanwidth:100%word-wrap

来源如下所示:

td {
  border: 1px solid;
}
<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-wrap: break-word;">
        Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
      </div>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>

上面的长字比我页面的边界大,但与上面的HTML相同。我尝试了以下添加text-wrap:suppress和的建议text-wrap:normal,但均无济于事。


添加硬连字符。<tr> <td style =“ text-wrap:normal; word-wrap:break-word”>这是一个预先声明。</ td> </ tr>
adatapost

不幸的是,其中的文本来自用户生成的内容。当然,我可以对其进行预处理并添加连字符,但我希望会有更好的方法。
psychotik

对于使用“硬连字符”一词,我深表歉意。在HTML中,纯连字符由“-”字符(&#45;或&#x2D;)表示。软连字符由字符实体引用&shy;表示。(&#173;或&#xAD;)
adatapost,

您是否真的在使用<code> break-wor <em> k </ em> </ code>?也许与它有关。
Ms2ger

1
如果您在这里,您可能还想看看white-space: pre-wrap developer.mozilla.org/en-US/docs/Web/CSS/white-space
Tom Prats

Answers:


624

以下内容适用于Internet Explorer。请注意table-layout:fixedCSS属性的添加

td {
  border: 1px solid;
}
<table style="table-layout: fixed; width: 100%">
  <tr>
    <td style="word-wrap: break-word">
      LongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongLongWord
    </td>
  </tr>
</table>


@ewomac是的,有时候,如果我知道它将在浏览器中运行,有时我就不得不忽略有关HTML / CSS的VS2010错误。
Marc Stober

2
@渣!!老兄,非常感谢。我的任务是建立一个使用表的客户端站点的移动版本,但是我很难使它正常工作!table-layout:fixed成功了!
调试

17
这会使其他列太宽。
–Clément

2
请务必阅读developer.mozilla.org/en-US/docs/Web/CSS/table-layout。表和列的宽度是由table和col元素的宽度或单元格第一行的宽度设置的。后续行中的单元格不会影响列宽。听起来这对性能也有好处。
Sam Barnum

2
@Clément在下面看到Indrek的答案<colgroup>,它为我解决了这个问题。
andrewtweber 2014年

164
<td style="word-break:break-all;">longtextwithoutspace</td>

要么

<span style="word-break:break-all;">longtextwithoutspace</span>

可以确认Pratik的方法也适用于iOS(iPhone)上的Safari。
occulus 2011年

要解决一些简短的单词和较长的单词的问题,您可以对文本进行预处理,并仅将较长的单词(例如,> 40个字符)换行<span>
nornagon 2011年

9
Firefox,歌剧对此不支持
meotimdihia 2011年

5
这不会优先中断非单词字符(例如,如果我有一系列较短的单词,这些单词之间用空格隔开,它将始终将这些单词一直排到最后一行,然后将最后一个单词切成两半)。Word-wrap仅在必要时才会打断单词
Hashbrown

这种方法更好,因为不需要table-layout: fixed;
精致


46

事实证明,没有做到这一点的好方法。我最接近的是添加“ overflow:hidden;”。到表格周围的div并丢失文本。真正的解决方案似乎是放弃沟渠。使用div和相对定位,我可以达到相同的效果,而无需<table>

2015年更新:适用于像我这样想要这些答案的人。经过6年的努力,这一切都要感谢所有贡献者。

* { // this works for all but td
  word-wrap:break-word;
}

table { // this somehow makes it work for td
  table-layout:fixed;
  width:100%;
}

29

如前所述,将文本放在div几乎可行的范围内。您只需要指定widthdiv,这是幸运,布局这是静态的。

这适用于FF 3.6,IE 8,Chrome。

<td>
  <div style="width: 442px; word-wrap: break-word">
    <!-- Long Content Here-->
  </div>
</td>

2
您可以添加min-width: 100%沿width,以确保div占据了整个小区。
user1091949 '16

我想用逗号(,)进行自动换行。喜欢Long,Long,Long,Long,Long。我想用任何逗号(,)将其包装。
Karthikeyan

20

使用溢出包装并与正常的表格布局+表格宽度100%兼容的解决方法

https://jsfiddle.net/krf0v6pw/

的HTML

<table>
  <tr>
    <td class="overflow-wrap-hack">
      <div class="content">
        wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
      </div>
    </td>
  </tr>
</table>

的CSS

.content{
  word-wrap:break-word; /*old browsers*/
  overflow-wrap:break-word;
}

table{
  width:100%; /*must be set (to any value)*/
}

.overflow-wrap-hack{
  max-width:1px;
}

优点:

  • overflow-wrap:break-word代替word-break:break-all。这样做会更好,因为它会先尝试在空格上打断,并且仅在单词大于容器时才切断单词。
  • 没有table-layout:fixed必要的。使用常规的自动调整大小。
  • 不需要定义固定像素width或固定max-width像素。%如果需要,定义父项。

已在FF57,Chrome62,IE11,Safari11中测试


尽管此hack实际上似乎在所有浏览器中都有效,但是请注意,CSS规范不对此提供任何保证。根据w3.org/TR/CSS21/visudet.html#propdef-max-width“最小宽度”和“最大宽度”对表,内联表,表单元格,表列和列组的影响为未定义”
Mark Amery

17

更改您的代码

word-wrap: break-word;

word-break:break-all;

<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-break:break-all;">longtextwithoutspacelongtextwithoutspace Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content, Long Content</div>
    </td>
    <td><span style="display: inline;">Short Content</span>
    </td>
  </tr>
</table>


-1; 这样一来,即使不需要,浏览器也可以完全忽略断字和断字。这很少是可取的行为,大概不是OP想要的行为,否则他们一开始就不会使用break-word
Mark Amery

16

问题

<td style="word-break:break-all;">longtextwithoutspace</td>

是如果文本一些空格,例如

<td style="word-break:break-all;">long text with andthenlongerwithoutspaces</td>

如果单词andthenlongerwithoutspaces在一行中适合表格单元格但long text with andthenlongerwithoutspaces不适合,则长单词将分为两部分,而不是被换行。

替代解决方案:在每个第20个字符后的每个长字中插入U + 200B(ZWSP),U + 00AD(软连字符)或U + 200C(ZWNJ)(但是,请参见下面的警告):

td {
  border: 1px solid;
}
<table style="width: 100%;">
  <tr>
    <td>
      <div style="word-wrap: break-word;">
        Looooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooooooooo&#xAD;oooooooooooooong word
      </div>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>

警告:插入其他零长度字符不会影响阅读。但是,它确实会影响复制到剪贴板的文本(这些字符当然也会被复制)。如果剪贴板文本稍后在Web应用程序的某些搜索功能中使用,则搜索将被破坏。尽管可以在某些知名的Web应用程序中看到此解决方案,但请尽可能避免。

警告:插入其他字符时,请勿在字形内分隔多个代码点。有关更多信息,请参见https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries


如果在足够长的单词中,在每个字符后插入一个软连字符,则由此产生的输出可能会稍微好些,以便浏览器可以在包含元素的右边缘可靠地断开单词。
Mark Amery

尽管这是一个可行的解决方案,但是如果您想在服务器上以编程方式执行此操作,则在“每个第20个字符之后”添加一些看似无害的建议充满了陷阱。在大多数编程语言中,很难遍历Unicode字符串的字符。在最好的,语言可以很容易地在Unicode代码点重复,但这些并不一定是我们会想称之为“字符”(例如什么可以写成两个代码点)。我们可能真的是指“字素”,但是我不知道有什么语言可以使这些字遍历变得微不足道。
Mark Amery

1
@MarkAmery你是对的。但是,即使使用普通ASCII,也不是很好。我添加了“警告”。
Piotr Findeisen

14

查看这个演示

   <table style="width: 100%;">
    <tr>
        <td><div style="word-break:break-all;">LongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWordLongWord</div>
        </td>
        <td>
            <span style="display: inline;">Foo</span>
        </td>
    </tr>
</table>

这是阅读链接


-1; 使用break-all会导致浏览器在决定放置换行符的位置时完全忽略换行符,这样的结果是,即使您的单元格包含正常的散文而没有很长的单词,您最终也会在单词中间出现换行符。这通常是不希望的。
Mark Amery

10

在IE 8和Chrome 13中进行了测试。

<table style="table-layout: fixed; width: 100%">
    <tr>
        <td>
              <div style="word-wrap: break-word;">
                 longtexthere
              </div>
        </td>
        <td><span style="display: inline;">Foo</span></td>
    </tr>
</table>

这将导致表格适合页面的宽度,而每一列占据该宽度的50%。

如果您希望第一列占据更多页面,请添加一个 width: 80%td在例中,如以下示例所示,将80%替换为您选择的百分比。

<table style="table-layout: fixed; width: 100%">
    <tr>
        <td style="width:80%">
               <div style="word-wrap: break-word;">
                 longtexthere
               </div>
            </td>
        <td><span style="display: inline;">Foo</span></td>
    </tr>
</table>

10

唯一需要做的就是根据要实现的布局,在<td><div>内部增加宽度<td>

例如:

<table style="width: 100%;" border="1"><tr>
<td><div style="word-wrap: break-word; width: 100px;">looooooooooodasdsdaasdasdasddddddddddddddddddddddddddddddasdasdasdsadng word</div></td>
<td><span style="display: inline;">Foo</span></td>
</tr></table>

要么

 <table style="width: 100%;" border="1"><tr>
    <td width="100" ><div style="word-wrap: break-word; ">looooooooooodasdsdaasdasdasddddddddddddddddddddddddddddddasdasdasdsadng word</div></td>
    <td><span style="display: inline;">Foo</span></td>

</tr></table>

1
这基本上只是重复了几个月前Loungerdork的回答,而没有添加任何新信息或见解。
Mark Amery

它为我工作
core114

8

赢得赏金的答案是正确的,但是如果的第一行具有合并/联接的单元格(所有单元格的宽度相等),则该答案将无效。

在这种情况下,应使用colgroupand col标记正确显示它:

<table style="table-layout: fixed; width: 200px">
<colgroup>
    <col style="width: 30%;">
    <col style="width: 70%;">
</colgroup>
<tr>
    <td colspan="2">Merged cell</td>
</tr>
<tr>
    <td style="word-wrap: break-word">VeryLongWordInThisCell</td>
    <td style="word-wrap: break-word">Cell 2</td>
</tr>
</table>

8
<p style="overflow:hidden; width:200px; word-wrap:break-word;">longtexthere<p>

1
-1既缺少解释又有不好的解决方案。将内容放在具有固定像素宽度p的表格单元内的固定像素宽度内,几乎可以肯定会导致表格单元溢出或填充失败。p
Mark Amery

8

看来您需要word-wrap:break-word;div具有指定(非相对)宽度的块元素()上进行设置。例如:

<table style="width: 100%;"><tr>
    <td><div style="display:block; word-wrap: break-word; width: 40em;">loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word</div></td>
    <td><span style="display: inline;">Foo</span></td>
</tr></table>

或使用word-break:break-allAbhishek Simon的建议。


5

这对我有用:

<style type="text/css">
    td {

        /* CSS 3 */
        white-space: -o-pre-wrap;
        word-wrap: break-word;
        white-space: pre-wrap;
        white-space: -moz-pre-wrap;
        white-space: -pre-wrap;
    }

并且表的属性是:

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

</style>

像其他几个答案一样,这里使之起作用的关键点是使用table-layout: fixed,但是已经有一个更旧的答案提示了这一点,因此该答案不会添加任何新信息。
Mark Amery

4

如果不需要表格边框,请执行以下操作:

table{
    table-layout:fixed;
    border-collapse:collapse;
}
td{
    word-wrap: break-word;
}

目前已经是一个更古老的回答表明,以使用table-layout: fixed; 此页面不会向页面添加任何新内容。
Mark Amery

4

我发现了一个似乎可以在Firefox,Google Chrome和Internet Explorer 7-9中运行的解决方案。用于在一侧放置长文本的两列表格布局。我到处搜索类似的问题,在一个浏览器中起作用的浏览器破坏了另一个问题,或者在表中添加了更多标签似乎就像是不好的编码。

我没有为此使用表格。DL DT DD来营救。至少对于固定两列布局而言,这基本上是词汇/词典/词义设置。

还有一些通用样式。

    dl {
        margin-bottom:50px;
    }

    dl dt {
        background:#ccc;
        color:#fff;
        float:left;
        font-weight:bold;
        margin-right:10px;
        padding:5px;
        width:100px;
    }

    dl dd {
        margin:2px 0;
        padding:5px 0;
        word-wrap:break-word;
        margin-left:120px;
    }
<dl>
    <dt>test1</dt>
    <dd>Fusce ultricies mi nec orci tempor sit amet</dd>
    <dt>test2</dt>
    <dd>Fusce ultricies</dd>
    <dt>longest</dt>
    <dd>
        Loremipsumdolorsitametconsecteturadipingemipsumdolorsitametconsecteturaelit.Nulla
        laoreet ante et turpis vulputate condimentum. In in elit nisl. Fusce ultricies
        mi nec orci tempor sit amet luctus dui convallis. Fusce viverra rutrum ipsum,
        in sagittis eros elementum eget. Class aptent taciti sociosqu ad litora
        torquent per conubia nostra, per.
    </dd>
</dl>

使用浮动的自动换行和左边距,我完全可以得到所需的内容。只是以为我会与其他人分享这一点,也许它会以两栏定义样式的布局帮助其他人,而使文字难以换行。

我尝试在表格单元格中使用自动换行功能,但是它仅在Internet Explorer 9(当然还有Firefox和Google Chrome)中有效,主要是试图在此处修复损坏的Internet Explorer浏览器。


2

默认情况下,表格会自动换行,因此请确保表格单元格的显示为table-cell

td {
   display: table-cell;
}

-1; 默认情况下,任何 HTML元素中的文本都会自动换行,而不仅仅是表格。这里的建议实际上没有任何意义。
Mark Amery

1

style =“ table-layout:fixed; width:98%; word-wrap:break-word”

<table bgcolor="white" id="dis" style="table-layout:fixed; width:98%; word-wrap:break-word" border="0" cellpadding="5" cellspacing="0" bordercolordark="white" bordercolorlight="white" >

演示-http://jsfiddle.net/Ne4BR/749/

这对我来说很棒。我有很长的链接,这将导致该表在Web浏览器上超过100%。在IE,Chrome,Android和Safari上进行了测试。


基本上,这是最受好评的答案;在这两种情况下,解决方案都归结为“使用table-layout: fixed”。
Mark Amery

0

可以将与Google Chrome和Firefox一起使用的解决方案(未经Internet Explorer测试)设置display: table-cell为阻止元素。


0

如果适合您,可以尝试一下...

在您的td内放置一个textarea,并用白色背景色将其禁用,并定义其行数。

<table style="width: 100%;">
  <tr>
    <td>
        <textarea rows="4" style="background-color:white;border: none;" disabled>      Looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong word
      </textarea>
    </td>
    <td><span style="display: inline;">Short word</span></td>
  </tr>
</table>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.