CSS 줄임표가 표 셀에서 작동하지 않는 이유는 무엇입니까?


150

다음 예제를 고려하십시오 : ( live demo here )

$(function() {
  console.log("width = " + $("td").width());
});
td {
  border: 1px solid black;
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

출력은 다음과 같습니다. width = 139 이며 줄임표는 나타나지 않습니다.

내가 여기서 무엇을 놓치고 있습니까?



어쨌든 중복되지만 대답은 해결책을 제공하지 않습니다 (Arlen Cuss와 마찬가지로).
Florian Margaine

1
width그리고 height테이블 셀에서는 항상 최소 너비와 높이 로 사용됩니다 . 테이블 셀이 다릅니다!
Mr Lister

1
@FlorianMargaine 실제로 다른 질문은 해결 방법을 제공합니다. 원하는 너비의 셀에 div를 넣으십시오.
Mr Lister

그러나 여전히이 페이지에 나열된 답변을 선호합니다.
Florian Margaine

답변:


102

분명히 다음을 추가하십시오.

td {
  display: block; /* or inline-block */
}

문제도 해결합니다.


또 다른 가능한 해결책은 table-layout: fixed;테이블 에 설정 하고 테이블을 설정하는 것 width입니다. 예를 들면 다음과 같습니다. http://jsfiddle.net/fd3Zx/5/


4
바로 그거죠. (요소 display: table-cell의 기본값)을 가진 td요소는 너비를 허용하지 않습니다.
Michael Mior

29
display: block;일종의 테이블 사용 목적을 무효화합니다. 나는 table-layout: fixed;옵션을 좋아한다 , 그것은 나를 위해 잘 작동했다.
Alex K

7
table-layout:fixed열 너비를 덜 현명하게 분산시킵니다. 열 너비를 같은 방식으로 지정 table-layout: normal하고 줄임표를 올바르게 표시하는 다른 옵션이 있습니까?
둥지

이 테이블 테두리와 나사; 최대 너비를 사용하지 않습니다.
Charlie 5

84

두는 것도 중요합니다

table-layout:fixed;

포함 테이블에서 IE9 (최대 너비를 사용하는 경우)에서도 잘 작동합니다.


7
이렇게하면 반응 형 레이아웃에서 텍스트 오버플로가 작동합니다.
jao

3
이것이 바로 내가 필요한 것입니다. 테이블 너비가 100 %입니다. 너비가 고정 된 열을 제외한 모든 열. 이렇게하면 마지막 열이 남은 공간을 차지할 수 있습니다.
matthew_360

78

앞에서 말했듯 td { display: block; }이 사용할 수는 있지만 테이블 사용의 목적을 상실합니다.

사용할 수는 table { table-layout: fixed; }있지만 일부 열에 대해 다르게 동작하기를 원할 수도 있습니다.

따라서 원하는 것을 달성하는 가장 좋은 방법은 텍스트를 a로 감싸고 다음 <div>과 같이 CSS를 <div>(가 아닌 <td>)에 적용하는 것입니다.

td {
  border: 1px solid black;
}
td > div {
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

2
이것은 내가 본 가장 간단한 방법이며 실제로 IE8에서 작동합니다.
Keith Ketterer

2
실제로 테이블의 줄임표에서 본 최고의 솔루션입니다.
membersound

41

max-width대신에 사용해보십시오width , 테이블은 여전히 자동으로 너비를 계산합니다.

ie11(ie8 호환 모드) 에서도 작동 합니다.

td.max-width-50 {
  border: 1px solid black;
  max-width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<table>
  <tbody>
    <tr>
      <td class="max-width-50">Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

jsfiddle .


1
잘 발견되었습니다. 요소가 고정 너비가되도록 두를 모두 사용 하는 것이 가장 좋습니다 . 그렇지 않으면 내용이 허용하면 더 짧을 수 있습니다.
LSerni

해킹을 표시하는 것보다 더 나은 방법; 테이블 테두리가있는 디스플레이 해킹 나사.
Charlie 5

21

데모 페이지

동적 너비가있는 테이블의 경우 만족스러운 결과를 생성하는 아래 방법을 찾았습니다. 각각의 <th>(가)의 내용을 랩하는 내부 포장 요소가 있어야 손질 텍스트 기능을 가지고 싶다고되는 <th>수 있도록 text-overflow작업을합니다.

진짜 트릭은 설정하는 것입니다 max-width합니다 (에 <th>에) vw단위 .

이렇게하면 요소의 너비가 뷰포트 너비 (브라우저 창)에 "바인딩"되어 응답 성있는 컨텐트 클리핑이 발생합니다. vw단위를 필요한 값으로 설정하십시오 .

최소 CSS :

th{ max-width:10vw; }
      
th > .wrap{ 
   text-overflow:ellipsis;
   overflow:hidden;
   white-space:nowrap;
}

실행 가능한 데모는 다음과 같습니다.

table {
  font: 18px Arial;
  width: 40%;
  margin: 1em auto;
  color: #333;
  border: 1px solid rgba(153, 153, 153, 0.4);
}

table td, table th {
  text-align: left;
  padding: 1.2em 20px;
  white-space: nowrap;
  border-left: 1px solid rgba(153, 153, 153, 0.4);
}

table td:first-child, table th:first-child {
  border-left: 0;
}

table th {
  border-bottom: 1px solid rgba(153, 153, 153, 0.4);
  font-weight: 400;
  text-transform: uppercase;
  max-width: 10vw;
}

table th > .wrap {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}
<table>
    <thead>
        <tr>
            <th>
                <div class="wrap" title="Some long title">Some long title</div>
            </th>
            <th>
                <div class="wrap">Short</div>
            </th>
            <th>
                <div class="wrap">medium one</div>
            </th>
            <th>
                <div class="wrap" title="endlessly super long title which no developer likes to see">endlessly super long title which no developer likes to see</div>
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>-</td>
            <td>-</td>
            <td>-</td>
            <td>very long text here</td>
        </tr>
    </tbody>
</table>


3

내가이 문제를 겪었을 때 대안을 제공하고 여기에 다른 대답은 내가 원하는 효과를 얻지 못했습니다. 대신 목록을 사용했습니다. 이제 의미 적으로 출력 한 정보는 테이블 형식 데이터 일뿐 아니라 나열된 데이터로 간주 될 수있었습니다.

결국 내가 한 일은 :

<ul>
    <li class="group">
        <span class="title">...</span>
        <span class="description">...</span>
        <span class="mp3-player">...</span>
        <span class="download">...</span>
        <span class="shortlist">...</span>
    </li>
    <!-- looped <li> -->
</ul>

따라서 기본적으로 ulis table, liis trspanis td입니다.

그런 다음 CSS에서 내가 설정 span될 요소 display:block;float:left;(나에게 그 조합을 선호하는 inline-block플로트 효과를 볼 취소는, IE의 이전 버전에서 작동 하겠지만를 : http://css-tricks.com/snippets/css/clear- 수정 / ) 및 타원도 갖습니다.

span {
    display: block;
    float: left;
    width: 100%;

    // truncate when long
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

그런 다음 max-widths스팬 범위를 설정 하면 목록에 테이블 모양이 나타납니다.


td 내부에 ul을 적용 할 수 <td><ul>...</ul></td>있습니까 (예 :) ? 그것은 나를 위해 작동하지 않는 것 같습니다 :(
Sam

2

텍스트 넘침 문제를 해결하기 위해 줄임표를 사용하는 대신 비활성화되고 스타일이 지정된 입력이 더 좋아 보이고 사용자가 필요한 경우 전체 문자열을보고 선택할 수 있다는 것을 알았습니다.

<input disabled='disabled' style="border: 0; padding: 0; margin: 0" />

텍스트 필드처럼 보이지만 강조 할 수 있으므로 더 사용자 친화적입니다.


2
보조 기술을 사용하면 입력으로 잘못 읽히므로 사용자가 무언가를 입력 할 수 있다고 생각하기 때문에 사용자 친화적이지 않습니다. 요소의 의미를 잘못 사용하는 것은 좋지 않습니다.
카를로

세상에, 이건 너무 영리 해요! 테이블의 일부이므로 입력을 투명한 배경의 경계선 없음으로 설정하기 만하면됩니다. 나는이 해결책을 좋아한다!

1

요소 box-sizing의 CSS 속성을 확인하십시오 td. CSS 템플릿에 문제가있어 border-box값으로 설정했습니다 . 설정이 필요합니다 box-sizing: content-box.


0

테이블을 그대로 둡니다. 잘린 CSS가 적용된 범위로 TD 내부의 내용을 래핑하십시오.

/* CSS */
.truncate {
    width: 50px; /*your fixed width */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    display: block; /* this fixes your issue */
}

<!-- HTML -->
<table>
    <tbody>
        <tr>
            <td>
                <span class="truncate">
                    Table data to be truncated if it's too long.
                </span>
            </td>
        </tr>
    </tbody>
</table>

나는 이것을 시도했지만 DataTables.net에서는 작동하지 않습니다. 어떤 생각?

-2

max-width를 td로 설정하지 않으려면 ( 이 답변 과 같이 ) max-width를 div로 설정할 수 있습니다.

function so_hack(){}

function so_hack(){} http://jsfiddle.net/fd3Zx/754/ function so_hack(){}

function so_hack(){}

참고 : 100 %는 작동하지 않지만 99 %는 FF에서 트릭을 수행합니다. 다른 최신 브라우저에는 바보 같은 div 해킹이 필요하지 않습니다.

td {
  테두리 : 1px 검은 색;
    왼쪽 여백 : 5px;
    오른쪽 여백 : 5px;
}
td> div {
    최대 폭 : 99 %;
    오버플로 : 숨겨진;
    텍스트 오버플로 : 줄임표;
    공백 : nowrap;

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