표 셀의 CSS 텍스트 오버플로?


499

text-overflow텍스트가 너무 길어서 한 줄에 맞지 않을 경우 여러 줄로 줄 바꿈하지 않고 줄임표로 자르도록 CSS 를 표 셀 에 사용하고 싶습니다 . 이것이 가능한가?

나는 이것을 시도했다 :

td {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

그러나 white-space: nowrap텍스트 (및 셀)가 계속 오른쪽으로 확장되어 테이블의 전체 너비가 컨테이너 너비를 넘어서도록 하는 것처럼 보입니다. 그러나 텍스트가 없으면 셀 가장자리에 닿을 때 텍스트가 여러 줄로 줄 바꿈됩니다.


9
테이블 셀은 잘 처리되지 않습니다 overflow. 셀에 div를 넣고 해당 div를 스타일링하십시오.
Mr Lister

답변:


897

표 셀이 오버플로 될 때 줄임표가있는 텍스트를 자르 려면 오버플로가 작동하도록 max-widthtd클래스에 CSS 속성 을 설정해야합니다 . 추가 레이아웃 div가 필요하지 않습니다

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

반응 형 레이아웃; 사용 max-width열의 유효 최소 폭을 지정하거나 사용하는 CSS 속성을 max-width: 0;무제한 유연성. 또한 포함하는 테이블에는 일반적으로 특정 너비가 필요하며 width: 100%;열의 너비는 일반적으로 총 너비의 백분율로 설정됩니다.

table {
    width: 100%;
}
td {
    max-width: 0;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}
td.columnA {
    width: 30%;
}
td.columnB {
    width: 70%;
}

역사적 : IE 9 이하의 경우 IE 고유의 렌더링 문제를 해결하려면 HTML에 이것을 포함해야합니다.

<!--[if IE]>
<style>
    table {
        table-layout: fixed;
        width: 100px;
    }
</style>
<![endif]-->

7
IE에서 작동하려면 테이블에 너비가 필요합니다. jsfiddle.net/rBthS/69
Trevor Dixon

1
셀을 항상 가능한 한 넓게 설정 width: 100%;하고 min-width: 1px;텍스트가 필요할 때 (요소 너비가 특정 크기에 도달 할 때가 아닌) 텍스트를 자르기 위해 줄임표를 사용하는 경우 반응 형 레이아웃에 매우 유용합니다.
Duncan Walker

2
@OzrenTkalcecKrznaric display: table-cell실제로 작동 하지만 max-width백분율 (%)로 정의 된 경우 에는 작동 하지 않습니다 . FF 32에서 테스트
Greg Greg

14
단지 사용 후, 당신은 % 값을 사용하는 경우 (위의 위로에 따라) table-layout: fixed와 요소에 display: table트릭을 할 것입니다
그렉

1
부트 스트랩 응답 테이블과 같은 응답 방식으로 열 너비를 자동으로 지정하려면 어떻습니까? 최대 너비를 설정하면 그에 침입합니다. 해결 방법이 있습니까?
둥지

81

지정 max-width너비를 고정하거나 것이 모든 상황에서 작동하는 것은 아니며 테이블은 유동적이고 자동으로 셀 간격을 유지해야합니다. 이것이 바로 테이블입니다.

이것을 사용하십시오 : http://jsfiddle.net/maruxa1j/

HTML :

<td class="ellipsis">
    <span>This Text Overflows and is too large for its cell.</span>
</td>

CSS :

.ellipsis {
    position: relative;
}
.ellipsis:before {
    content: '&nbsp;';
    visibility: hidden;
}
.ellipsis span {
    position: absolute;
    left: 0;
    right: 0;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}

IE9 및 기타 브라우저에서 작동합니다.


참고 :이 솔루션은 셀 내용을 <span>요소로 묶습니다.
Roy Tinker

2
이것은 정말 영리한 솔루션이며 솔루션이 필요한 모든 테이블에서 잘 작동합니다. 그러나 모든 테이블 셀의 너비를 동일하게하지 않으려면 너비를 설정해야합니다.
Kevin Beal

고정 너비가 없으면이 솔루션이 가장 효과적입니다. 참으로 영리하다!
avidenic 2016 년

1
이것은 다른 솔루션 display: block이 그렇지 않은 경우에도 수직 정렬을 유지합니다.
j3ff

최고의 솔루션! 매우 독창적입니다. 정말 고맙습니다.
ClownCoder

39

이런 일이 발생합니까?

w3.org 의이 섹션텍스트 오버플로가 블록 요소에만 적용되는 것으로 보입니다 .

11.1.  Overflow Ellipsis: the ‘text-overflow’ property

text-overflow      clip | ellipsis | <string>  
Initial:           clip   
APPLIES TO:        BLOCK CONTAINERS               <<<<
Inherited:         no  
Percentages:       N/A  
Media:             visual  
Computed value:    as specified  

MDN은 동일을 말한다 .

jsfiddle 에는 코드 (몇 가지 디버그 수정 사항이 있음) divtd있습니다. 또한 내용을 td포함하는 div블록 에 래핑하여 빠르게 생각할 수있는 유일한 해결 방법이 있습니다 . 그러나 그것은 나에게 "못생긴"마크 업처럼 보이기 때문에 다른 사람이 더 나은 해결책을 원합니다. 이것을 테스트하는 코드는 다음과 같습니다.

td, div {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  border: 1px solid red;
  width: 80px;
}
Works, but no tables anymore:
<div>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</div>

Works, but non-semantic markup required:
<table><tr><td><div>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</div></td></tr></table>


2
감사합니다 마크 업에서 테이블 셀을 제거 할 수 없으므로 대신 div로 내용을 래핑하고 (너비가 셀 너비로 설정 됨) 대신 오버플로를 적용했습니다. 매력처럼 일했다!
daGUY

28

고정 너비를 다른 것으로 설정하지 않으려는 경우

아래 솔루션을 사용하면 테이블 셀 내용이 길지만 부모 테이블의 너비 나 부모 행의 높이에 영향을 미치지 않아야합니다. 예를 들어 width:100%자동 크기 기능을 다른 모든 셀에 적용 하는 테이블이있는 경우 . "메모"또는 "설명"열 또는 무언가가있는 데이터 그리드에 유용합니다.

여기에 이미지 설명을 입력하십시오

CSS에 다음 3 가지 규칙을 추가하십시오.

.text-overflow-dynamic-container {
    position: relative;
    max-width: 100%;
    padding: 0 !important;
    display: -webkit-flex;
    display: -moz-flex;
    display: flex;
    vertical-align: text-bottom !important;
}
.text-overflow-dynamic-ellipsis {
    position: absolute;
    white-space: nowrap;
    overflow-y: visible;
    overflow-x: hidden;
    text-overflow: ellipsis;
    -ms-text-overflow: ellipsis;
    -o-text-overflow: ellipsis;
    max-width: 100%;
    min-width: 0;
    width:100%;
    top: 0;
    left: 0;
}
.text-overflow-dynamic-container:after,
.text-overflow-dynamic-ellipsis:after {
    content: '-';
    display: inline;
    visibility: hidden;
    width: 0;
}

동적 텍스트 오버플로를 원하는 표 셀에서 다음과 같이 HTML 형식을 지정하십시오.

<td>
  <span class="text-overflow-dynamic-container">
    <span class="text-overflow-dynamic-ellipsis" title="...your text again for usability...">
      //...your long text here...
    </span>
  </span>
</td>

또한 원하는 적용 min-width 테이블 셀에 (또는 전혀 없음)을 적용하십시오.

물론 바이올린 : https://jsfiddle.net/9wycg99v/23/


가장 유용한 답변, 동적 줄임표는 정말 대단합니다.
lucifer63

모든 컬럼의 선택된 너비 한계를 max-width: Xdisplay: flex
망칩니다.

24

당신이 지정하는 경우 것 같습니다 table-layout: fixed;table을 위해 다음 요소 당신의 스타일을 td적용한다. 그러나 이것은 셀 크기에 영향을 미칩니다.

Sitepoint는 테이블 레이아웃 방법에 대해 약간 설명합니다. http://reference.sitepoint.com/css/tableformatting


2
테이블 너비를 지정하지 않으려는 경우 정답이어야합니다.
adriaan

20

테이블을 자동 레이아웃하려는 경우

없이 사용 max-width또는 백분율 칼럼 폭, 또는 table-layout: fixed등등

https://jsfiddle.net/tturadqq/

작동 방식 :


1 단계 : 테이블 자동 레이아웃이 그 일을하도록하십시오.

텍스트가 많은 하나 이상의 열이 있으면 가능한 한 다른 열을 축소 한 다음 긴 열의 텍스트를 줄 바꿈합니다.

여기에 이미지 설명을 입력하십시오


2 단계 : div에서 셀 내용을 래핑 한 다음 해당 div를 max-height: 1.1em

(추가 0.1em은 'g'와 'y'의 꼬리와 같이 텍스트 밑으로 약간 아래로 렌더링하는 문자 용입니다)

여기에 이미지 설명을 입력하십시오


3 단계 : titlediv 설정

이것은 접근성에 좋으며 잠시 사용할 작은 트릭에 필요합니다.

여기에 이미지 설명을 입력하십시오


4 단계 : ::afterdiv에 CSS 추가

이것은 까다로운 비트입니다. 우리는 CSS를 설정 ::after하여, content: attr(title)다음, 위치를 그 사업부와 세트의 상단에 text-overflow: ellipsis. 명확하게하기 위해 여기에 빨간색으로 표시했습니다.

(긴 기둥에 꼬리 줄임표가 어떻게 나타나는지 확인하십시오)

여기에 이미지 설명을 입력하십시오


5 단계 : div 텍스트의 색상을 transparent

그리고 우리는 끝났습니다!

여기에 이미지 설명을 입력하십시오


2
이것은 굉장하고 완벽한 솔루션입니다! 나는 이것이 왜 대부분의 공짜 투표 대신 부정적인 투표를 받았는지 궁금합니다 !!
zendu

2
멋진 남자! (@ user9645-맞지 않음 : Vue.js로 렌더링 된 테이블로 작업해야합니다. 제목은 td가 아닌 div에 두어야합니다.)
Christian Opitz

@ChristianOpitz-그렇습니다. 어쨌든 그것을 망쳐 놓았을 것입니다 ... 재 시도하고 작동합니다.
user9645

내부 테이블 셀 <a>대신 사용할 때이 방법이 실패한다는 것을 알았습니다 <div>. 추가하면 word-break: break-all;문제가 해결됩니다. 예 : jsfiddle.net/de0bjmqv
zendu

그냥 좋아요 셀에 동일한 텍스트가 없어도 (제목이 충분합니다) 최대 높이 : 1.1em 등이 필요하지 않습니다 .div에 필요한 것은 position : relative;입니다.
KS74

13

표 너비가 백분율이거나 표 셀에 고정 너비를 설정할 수없는 경우 당신은 table-layout: fixed;그것을 작동하도록 신청할 수 있습니다 .

table {
  table-layout: fixed;
  width: 100%;
}
td {
  text-overflow: ellipsis;
  white-space: nowrap;
  overflow: hidden;
  border: 1px solid red;
}
<table>
  <tr>
    <td>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</td>
    <td>Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah. Lorem ipsum and dim sum yeah yeah yeah.</td>
  </tr>
</table>


5

셀 내용을 플렉스 블록으로 감 쌉니다. 보너스로, 셀 자동은 보이는 너비에 맞습니다.

table {
  width: 100%;
}

div.parent {
  display: flex;
}

div.child {
  flex: 1;
  width: 1px;
  overflow-x: hidden;
  text-overflow: ellipsis;
}
<table>
  <tr>
    <td>
      <div class="parent">
        <div class="child">
          xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
        </div>
      <div>
    </td>
  </tr>
</table>


3
또한 수업 에 추가 white-space: nowrap;해야했습니다 child.
Ross Allen

3

셀 내부에 절대적으로 위치한 div를 사용 하여이 문제를 해결했습니다 (상대).

td {
    position: relative;
}
td > div {
    position: absolute;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    max-width: 100%;        
}

그게 다야. 그런 다음 div에 top : 값을 추가하거나 수직으로 가운데에 배치 할 수 있습니다.

td > div {      
    top: 0;
    bottom: 0;
    margin: auto 0;
    height: 1.5em; // = line height 
}

오른쪽에 약간의 공간을 확보하기 위해 최대 너비를 약간 줄일 수 있습니다.


이 인기있는 질문에 대한 다른 많은 답변과 마찬가지로 JSFiddle을 사용하면 좋을 것입니다.
oma

그러나 이것은 작동하지만 div에 약간 다른 스타일을 사용했습니다. left : 0; top : 0; right : 0; bottom : 0; padding : 2px; 올바른 위치를 얻고 테이블의 셀과 동일한 패딩을 갖습니다.
KS74

0

이것은 필자의 경우 Firefox와 Chrome 모두에서 작동했습니다.

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

-5

이것은 IE 9에서 작동하는 버전입니다.

http://jsfiddle.net/s27gf2n8/

<div style="display:table; table-layout: fixed; width:100%; " >
        <div style="display:table-row;">
            <div style="display:table-cell;">
                <table style="width: 100%; table-layout: fixed;">
                    <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">First row. Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
                </table>
            </div>
            <div style="display:table-cell;">
                Top right Cell.
            </div>
        </div>
        <div style="display:table-row;">
            <div style="display:table-cell;">
                <table style="width: 100%; table-layout: fixed;">
                    <div style="text-overflow:ellipsis;overflow:hidden;white-space:nowrap;">Second row - Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.</div>
                </table>
            </div>
            <div style="display:table-cell;">
                Bottom right cell.
            </div>
        </div>
    </div>

6
<table>의 직계 자식 인 <div>? 맞지 않는 것 같습니다!
Michiel

@michiel FYI-브라우저는 표 태그 아래에서 Div를 처리 할 수 ​​있습니다.
Ryan O'Connell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.