HTML 테이블에서 자동 줄 바꿈


566

s와 s로 word-wrap: break-word텍스트를 감싸는 데 사용 했습니다 . 그러나 테이블 셀에서는 작동하지 않는 것 같습니다. 하나의 행과 두 개의 열로 테이블을 설정했습니다 . 위의 스타일로되어 있지만 열의 텍스트는 줄 바꿈되지 않습니다. 텍스트가 셀 경계를 넘어갑니다. 이것은 Firefox, 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

'hard-hyphen'이라는 단어를 사용한 것에 대해 사과드립니다. HTML에서 일반 하이픈은 "-"문자 (& # 45; 또는 & # x2D;)로 표시됩니다. 소프트 하이픈은 문자 엔티티 참조 & shy; (& # 173; 또는 & # xAD;)
apostpost

실제로 <code> break-wor <em> k </ em> </ code>를 사용하고 있습니까? 어쩌면 그것은 그것과 관련이있을 수 있습니다.
Ms2ger

답변:


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 : 트릭을 수정했습니다!
디버그

17
이렇게하면 다른 열이 너무 넓어집니다.
Clément

2
developer.mozilla.org/en-US/docs/Web/CSS/table-layout 을 읽으십시오. 테이블 및 열 너비는 테이블 및 열 요소의 너비 또는 첫 번째 셀 행의 너비로 설정됩니다. 후속 행의 셀은 열 너비에 영향을 미치지 않습니다. 이와 같은 소리는 성능에도 좋습니다.
Sam Barnum

2
@ Clément에서 Indrek의 답변을 참조하십시오 <colgroup>.이 문제가 해결되었습니다.
andrewtweber

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

또는

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

Pratik의 접근 방식이 iOS (iPhone)의 Safari에서도 작동 함을 확인할 수 있습니다.
occulus

짧고 긴 단어로 문제를 해결하려면 텍스트를 사전 처리하고에서 긴 단어 (예 : 40 자) 만 줄 바꿈 할 수 있습니다 <span>.
nornagon

9
이것은 firefox, opera에 의해 지원되지 않습니다
meotimdihia

5
이것은 단어가 아닌 문자를 우선적으로 나누지 않았습니다 (예를 들어, 공백으로 구분 된 일련의 짧은 단어가 있으면 단어를 항상 줄까지 실행 한 다음 마지막 단어를 반으로 나눕니다). Word-wrap필요한 경우에만 단어를 깰 것입니다
Hashbrown

이 방법은 필요하지 않기 때문에 더 좋습니다 table-layout: fixed;.
Finesse

125

긴 샷이지만 Firebug (또는 이와 유사한 것)로 실수로 다음 규칙을 상속하지 않았 음을 다시 확인하십시오 .

white-space:nowrap;

지정된 줄 바꿈 동작을 무시할 수 있습니다 .


이것은 상속되었고 나를 위해 줄 바꿈이라는 단어를 깨뜨 렸습니다
shane lee

@RickGrundy 해당 문제가있는 경우 무엇으로 변경합니까?
cokedude

7
@cokedude 난 너무 늦었 어.하지만white-space:normal;
Beer Me

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거의 작동시킵니다. 당신은 방금 지정해야 width의를 div정적 레이아웃에 대한 행운이다.

이것은 FF 3.6, IE 8, Chrome에서 작동합니다.

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

2
셀 전체를 차지 하도록 min-width: 100%함께 추가 할 수 있습니다 . widthdiv
user1091949

쉼표 (,)로 단어 줄 바꿈을하고 싶습니다. 처럼 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에서 테스트


이 해킹은 실제로 모든 브라우저에서 작동하는 것처럼 보이지만 CSS 사양은이를 보증하지 않습니다. 당 w3.org/TR/CSS21/visudet.html#propdef-max-width , "테이블 인라인 테이블, 테이블 셀, 테이블 열 및 열 그룹에서 '최소 폭'과 '최대 폭'의 효과는 undefined " .
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>

경고 : 길이가 0 인 추가 문자를 삽입해도 읽기에는 영향을 미치지 않습니다. 그러나 클립 보드에 복사 한 텍스트에는 영향을 미칩니다 (물론 이러한 문자도 복사됩니다). 클립 보드 텍스트가 나중에 웹 앱의 일부 검색 기능에서 사용되면 검색이 중단됩니다. 이 솔루션은 일부 잘 알려진 웹 응용 프로그램에서 볼 수 있지만 가능하면 피하십시오.

경고 : 추가 문자를 삽입 할 때 grapheme 내에서 여러 코드 포인트를 분리하지 않아야합니다. 자세한 내용은 https://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries 를 참조 하십시오 .


충분히 긴 단어로 모든 문자 뒤에 부드러운 하이픈을 삽입 하여 브라우저가 포함하는 요소의 오른쪽 가장자리에서 단어를 안정적으로 깰 수있는 경우이 결과가 약간 더 좋습니다 .
Mark Amery

이것이 가능한 솔루션이지만, 서버에서 프로그래밍 방식으로 수행하려는 경우 "매 20 번째 문자" 를 추가하려는 무해한 제안 은 함정으로 가득 차 있습니다. 대부분의 프로그래밍 언어에서는 유니 코드 문자열 의 문자 를 반복하는 것이 어렵습니다. 에서 가장 , 언어는 쉽게 유니 코드 코드 포인트를 반복 할 수 있도록 수 있지만, 사람들은 우리가 (예를 들어, "문자"로 참조 할 것 무엇을 필요하지 않은 두 개의 코드 포인트로 기록 될 수 있습니다). 우리는 아마 정말 "제자"을 의미하지만, 내가 모르는 어떤 그 이상 루프는 사소한하게 언어를.
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 %를 차지합니다.

첫 번째 열이 더 많은 페이지를 차지하도록 하려면 다음 예에서와 같이 a 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

현상금을 얻은 답은 정확하지만 테이블 의 첫 번째 행에 병합 / 결합 된 셀이 있으면 작동하지 않습니다 (모든 셀의 너비가 동일 함).

이 경우 colgroupcol태그를 사용하여 올바르게 표시해야합니다.

<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 인 경우 -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에서 작동하는 것으로 나타났습니다. 한쪽에 긴 텍스트가있는 2 열 테이블 레이아웃을 수행합니다. 비슷한 문제를 찾기 위해 모든 것을 검색했으며 한 브라우저에서 다른 브라우저가 작동하거나 테이블에 더 많은 태그를 추가하는 것은 나쁜 코딩처럼 보입니다.

나는 이것을 위해 테이블을 사용하지 않았다. 구조에 DL DT DD. 최소한 2 열 레이아웃을 수정하기 위해 기본적으로 용어집 / 사전 / 단어 의미 설정입니다.

그리고 일반적인 스타일링.

    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>

떠 다니는 줄 바꿈과 여백을 사용하여 필요한 것을 정확히 얻었습니다. 내가 이것을 다른 사람들과 공유 할 것이라고 생각했을 것입니다. 아마도 줄 바꿈하는 데 어려움이있는 2 열 정의 스타일 레이아웃을 가진 다른 사람을 도울 것입니다.

표 셀에서 단어 줄 바꿈을 사용해 보았지만 Internet Explorer 9 (및 Firefox 및 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/

이것은 나를 위해 잘 작동했습니다. 웹 브라우저에서 테이블이 100 %를 초과하는 링크가 길었습니다. IE, Chrome, Android 및 Safari에서 테스트되었습니다.


이것은 기본적으로 최고 투표 답변 과 중복됩니다 . 두 경우 모두 해결책은 "사용 table-layout: fixed"으로 귀결됩니다 .
Mark Amery

0

Internet Explorer에서 테스트되지 않은 Chrome 및 Firefox에서 작동하는 솔루션 display: table-cell은 블록 요소 로 설정 하는 것입니다.


0

당신에게 적합하다면 이것을 시도 할 수 있습니다 ...

텍스트 영역을 td 안에 넣고 배경색을 흰색으로 비활성화하고 행 수를 정의하십시오.

<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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.