CSS : 테이블 셀을 자르지 만 가능한 한 적합


223

프레드를 만나십시오. 그는 테이블입니다.

하나의 셀은 더 많은 내용을 가지고 더 넓고, 다른 하나는 더 적은 내용을 가지고 더 좁습니다

<table border="1" style="width: 100%;">
    <tr>
        <td>This cells has more content</td>
        <td>Less content here</td>
    </tr>
</table>

프레드의 아파트는 크기가 변하는 기괴한 습관을 가지고 있기 때문에 다른 모든 유닛을 밀지 않고 휘 포드 부인의 거실을 망각으로 밀어 넣지 않도록 일부 내용을 숨기는 법을 배웠습니다.

이제 셀의 크기는 동일하지만 내용 중 하나만 잘리고 다른 셀에 공백이 있으면 둘 다 들어갈 수있는 것처럼 보입니다.

<table border="1" style="width: 100%; white-space: nowrap; table-layout: fixed;">
    <tr>
        <td style="overflow: hidden; text-overflow: ellipsis">This cells has more content</td>
        <td style="overflow: hidden; text-overflow: ellipsis">Less content here</td>
    </tr>
</table>

이것은 작동하지만 Fred는 오른쪽 셀 (셀 디토라는 별명)이 약간의 공간을 포기하면 왼쪽 셀이 많은 시간 동안 잘리지 않을 것이라는 잔소리를합니다. 그의 정신력을 구할 수 있습니까?


요약 : 표의 셀이 어떻게 고르게 오버플로 될 수 있으며 모든 공백을 모두 포기했을 때만 가능합니까?


95
+1 가상 객체의 특성화를 위해 멋진 선생님이 있습니다 :)
Myles Grey

6
이 문제를 해결하려면 JavaScript를 사용해야한다고 생각합니다.
thirtydot

6
오락 가치를위한 Lolz .. +1 :) ... 이것은 동적이어야합니까, 아니면 단순히 각 열에 너비를 설정할 수 없습니까?
War

답변:


82
<table border="1" style="width: 100%;">
    <colgroup>
        <col width="100%" />
        <col width="0%" />
    </colgroup>
    <tr>
        <td style="white-space: nowrap; text-overflow:ellipsis; overflow: hidden; max-width:1px;">This cell has more content.This cell has more content.This cell has more content.This cell has more content.This cell has more content.This cell has more content.</td>
        <td style="white-space: nowrap;">Less content here.</td>
    </tr>
</table>

http://jsfiddle.net/7CURQ/


9
어. 그래서 좋은 작품,하지만 난 나를 긴장하게 왜 아무 생각이,이 없다 :(
숀 로완

감사! 질문이 말한 것을 정확하게하지는 않지만 (모든 열을 고르게 자르십시오), 코드 의 동작은 내가 찾고있는 것입니다.
Sam

3
또한 <col>너비를 <td>스타일 앞에 추가 하여 s를 제거 할 수 있습니다 . jsfiddle.net/7CURQ/64
Sam

2
실제로 이것은 잘리지 않은 열의 동적 열 크기를 망칠 것으로 보입니다. 그들은 항상 최소 너비로 축소 된 것처럼 보입니다.
Sam

38

JavaScript가 아닌 솔루션이 있다고 생각합니다! 결코 늦지 않는 것보다 낫지? 결국 이것은 훌륭한 질문이며 Google은 끝났습니다. 페이지가로드 할 수없는 후에 움직일 때 약간의 지터가 허용되지 않기 때문에 자바 스크립트 수정을 해결하고 싶지 않았습니다.

특징 :

  • 자바 스크립트 없음
  • 고정 레이아웃 없음
  • 가중치 또는 백분율 폭 트릭 없음
  • 여러 열과 함께 작동
  • 간단한 서버 측 생성 및 클라이언트 측 업데이트 (계산 필요 없음)
  • 크로스 브라우저 호환

작동 방식 : 테이블 셀 안에는 두 개의 다른 요소에 내용의 두 복사본을 상대적으로 배치 된 컨테이너 요소 내에 배치합니다. 스페이서 요소는 정적으로 배치되므로 테이블 셀의 너비에 영향을줍니다. 스페이서 셀의 내용물을 감싸도록함으로써 찾고있는 테이블 셀의 "최적의"너비를 얻을 수 있습니다. 이를 통해 절대적으로 배치 된 요소를 사용하여 보이는 컨텐츠의 너비를 상대적으로 배치 된 부모의 너비로 제한 할 수 있습니다.

IE8, IE9, IE10, Chrome, Firefox, Safari, Opera에서 테스트 및 작업

결과 이미지 :

좋은 비례 폭 좋은 비례 클리핑

JSFiddle : http://jsfiddle.net/zAeA2/

샘플 HTML / CSS :

<td>
    <!--Relative-positioned container-->
    <div class="container">
        <!--Visible-->
        <div class="content"><!--Content here--></div>
        <!--Hidden spacer-->
        <div class="spacer"><!--Content here--></div>
        <!--Keeps the container from collapsing without
            having to specify a height-->
        <span>&nbsp;</span>
     </div>
</td>

.container {
    position: relative;
}
.content {
    position: absolute;
    max-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.spacer {
    height: 0;
    overflow: hidden;
}

3
내용이 공백이없는 매우 긴 단어 인 경우 작동하지 않지만 & shy;를 사용하여 spacer의 conent에 하이픈을 추가하면됩니다. jsfiddle.net/zAeA2/160
리카르도 Casatta

2
이것은 굉장하다! 내용 중복을 피하기 위해 attr을 사용하여 나만의 변형을 만들었습니다. jsfiddle.net/coemL8rf/2
Jayen

@Jayen Nice-아마도 마우스 오버 툴팁을 얻는 title대신에 사용 data-spacer:)
William George

@Jayen, 방금 시도한 결과 오른쪽의 셀이 잘리지 않는 것처럼 보이므로 셀이 고르게 넘치지 않아도됩니다. Chrome 46을 사용하고 있습니다.
Sam

@Sam 그렇습니다. 내 예는 내용을 복제하지 않고 두 유형의 셀을 모두 만들 수 있음을 보여줍니다. 나는 질문에 대답하려고하지 않고 단순히 다른 방법을 보여주었습니다. 내 예제에서 HTML을 변경하면 원하는대로 작동합니다.
Jayen

24

나는 며칠 전에 같은 도전에 직면했습니다. 루시퍼 샘 이 최고의 해결책을 찾은 것 같습니다 .

그러나 spacer 요소에서 내용을 복제해야한다는 것을 알았습니다. 그렇게 나쁘지는 않다고 생각했지만 title잘린 텍스트에 팝업 을 적용하고 싶습니다 . 그리고 그것은 긴 텍스트가 내 코드에서 세 번째로 나타날 것임을 의미합니다.

여기서는 의사 요소의 title속성 에 액세스 :after하여 스페이서를 생성하고 HTML을 깨끗하게 유지하도록 제안합니다 .

IE8 +, FF, Chrome, Safari, Opera에서 작동

<table border="1">
  <tr>
    <td class="ellipsis_cell">
      <div title="This cells has more content">
        <span>This cells has more content</span>
      </div>
    </td>
    <td class="nowrap">Less content here</td>
  </tr>
</table>
.ellipsis_cell > div {
    position: relative;
    overflow: hidden;
    height: 1em;
}

/* visible content */
.ellipsis_cell > div > span {
    display: block;
    position: absolute; 
    max-width: 100%;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    line-height: 1em;
}

/* spacer content */
.ellipsis_cell > div:after {
    content: attr(title);
    overflow: hidden;
    height: 0;
    display: block;
}

http://jsfiddle.net/feesler/HQU5J/


더 동의하지 못했습니다, 훌륭합니다!
Mikhail

다른 CSS 솔루션보다 훨씬 낫습니다. 두 컨텐츠 모두에서 작동하기 때문입니다. 즉, 컨텐츠 셀이 컨텐츠 셀보다 적을수록 더 많습니다.
buggedcom

19

Javascript가 수용 가능한 경우, 시작점으로 사용할 수있는 빠른 루틴을 작성했습니다. 창 크기 조정 이벤트에 반응하여 범위의 내부 너비를 사용하여 셀 너비를 동적으로 조정하려고 시도합니다.

현재 각 셀은 일반적으로 행 너비의 50 %를 차지한다고 가정하고 오른쪽 셀을 축소하여 왼쪽 셀을 최대 너비로 유지하여 오버플로를 방지합니다. 사용 사례에 따라 훨씬 더 복잡한 폭 밸런싱 로직을 구현할 수 있습니다. 도움이 되었기를 바랍니다:

테스트에 사용한 행의 마크 업 :

<tr class="row">
    <td style="overflow: hidden; text-overflow: ellipsis">
    <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
    </td>
    <td style="overflow: hidden; text-overflow: ellipsis">
    <span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</span>
    </td>
</tr>

크기 조정 이벤트를 연결하는 JQuery :

$(window).resize(function() {
    $('.row').each(function() {
        var row_width = $(this).width();
        var cols = $(this).find('td');
        var left = cols[0];
        var lcell_width = $(left).width();
        var lspan_width = $(left).find('span').width();
        var right = cols[1];
        var rcell_width = $(right).width();
        var rspan_width = $(right).find('span').width();

        if (lcell_width < lspan_width) {
            $(left).width(row_width - rcell_width);
        } else if (rcell_width > rspan_width) {
            $(left).width(row_width / 2);
        }
    });
});

18

훨씬 더 쉽고 우아한 솔루션이 있습니다.

잘림을 적용하려는 테이블 셀 내에 css table-layout : fixed로 컨테이너 div를 포함하십시오. 이 컨테이너는 부모 테이블 셀의 전체 너비를 사용하므로 반응 형입니다.

표의 요소에 잘림을 적용하십시오.

IE8 +에서 작동

<table>
  <tr>
    <td>
     <div class="truncate">
       <h1 class="truncated">I'm getting truncated because I'm way too long to fit</h1>
     </div>
    </td>
    <td class="some-width">
       I'm just text
    </td>
  </tr>
</table>

그리고 CSS :

    .truncate {
      display: table;
      table-layout: fixed;
      width: 100%;
    }

    h1.truncated {
      overflow-x: hidden;
      text-overflow: ellipsis;
      white-space: nowrap;
    }

여기 작동하는 바이올린이 있습니다 https://jsfiddle.net/d0xhz8tb/


이 솔루션에는 비 구조적 효과를 달성하기 위해 2 개의 추가 블록 수준 요소가 필요합니다. 하나의 테이블 셀을 "display : table"로 설정하면 div 중 하나를 제거 할 수 있습니다. jsfiddle.net/rza4hfcv 확실하지 않습니다. 이것에 대해 어떻게 생각해야합니까? 그러나 솔루션을 공유해 주셔서 감사합니다!
armin

해당 솔루션에 문제가 있습니까? 전문적인 환경에서 사용하는 것에 대해 생각하고 있습니다.
armin

@armin, 잘라내려는 셀을 복제하십시오. 나란히 둘 이상을 넣을 수 없습니다.
DanielM

나는 이것이 최종 해결책이라고 말하지 않을 것입니다. 테이블의 주요 이점 중 하나는 내용에 따라 열 크기가 조정된다는 것입니다. 이와 같이 모든 열을 설정하면 내용의 길이에 관계없이 모든 열의 너비가 동일합니다.
DanielM

@DanielM 이전 테이블 레이아웃 일과 같이 테이블을 더 중첩하여 솔루션을 확장 할 수 있지만 이제는 CSS로 가능합니다.
armin

11

문제는 균등 한 간격의 고정 너비 열을 생성하는 'table-layout : fixed'입니다. 그러나이 CSS 속성을 비활성화하면 테이블이 최대한 커지고 오버플로가 발생하지 않기 때문에 텍스트 오버플로가 중단됩니다.

죄송하지만이 경우 Fred는 케이크를 가지고 그것을 먹을 수 없습니다. 집주인이 Celldito에게 처음으로 작업 할 공간이 줄어들지 않으면 Fred는 그의 케이크를 사용할 수 없습니다.


9

다음과 같이 특정 열에 "가중"을 시도 할 수 있습니다.

<table border="1" style="width: 100%;">
    <colgroup>
        <col width="80%" />
        <col width="20%" />
    </colgroup>
    <tr>
        <td>This cell has more content.</td>
        <td>Less content here.</td>
    </tr>
</table>

너비가 0 % 인 열을 사용하고 white-spaceCSS 속성을 조합하여 사용하는 등 좀 더 재미있는 조정을 시도 할 수도 있습니다.

<table border="1" style="width: 100%;">
    <colgroup>
        <col width="100%" />
        <col width="0%" />
    </colgroup>
    <tr>
        <td>This cell has more content.</td>
        <td style="white-space: nowrap;">Less content here.</td>
    </tr>
</table>

당신은 아이디어를 얻습니다.


3

그래도 thirtydot에 있다고 말하면 js 메소드를 사용하지 않으면 할 수있는 방법이 없습니다. 정의해야 할 복잡한 렌더링 조건에 대해 이야기하고 있습니다. 예를 들어 두 셀이 아파트에 비해 너무 커지면 어떻게 될지 우선 순위를 가진 사람을 결정하거나 단순히 면적의 백분율을 제공해야합니다. CSS로 할 수있는 방법이없는 다른 셀에서 다리를 뻗습니다. 사람들이 내가 생각하지 않은 CSS 로하는 꽤 펑키 한 일이 있지만. 그래도 당신이 이것을 할 수 있는지 의심합니다.


3

samplebias 답변과 마찬가지로 Javascript가 허용되는 답변 인 경우 https://github.com/marcogrcr/jquery-tableoverflow를 위해 특별히 jQuery 플러그인을 만들었습니다.

플러그인을 사용하려면 다음을 입력하십시오.

$('selector').tableoverflow();

전체 예 : http://jsfiddle.net/Cw7TD/3/embedded/result/

편집 :

  • IE 호환성을 위해 jsfiddle에서 수정되었습니다.
  • 더 나은 브라우저 호환성 (Chrome, Firefox, IE8 +)을 위해 jsfiddle에서 수정되었습니다.

3

CSS 해킹을 사용 display: table-column;하면 구출 할 수있는 것처럼 보입니다 .

<div class="myTable">
    <div class="flexibleCell">A very long piece of content in first cell, long enough that it would normally wrap into multiple lines.</div>
    <div class="staticCell">Less content</div>
</div>

.myTable {
    display: table;
    width: 100%;
}

.myTable:before {
    display: table-column;
    width: 100%;
    content: '';
}

.flexibleCell {
    display: table-cell;
    max-width:1px;
    white-space: nowrap;
    text-overflow:ellipsis;
    overflow: hidden;
}

.staticCell {
    white-space: nowrap;
}

JSFiddle : http://jsfiddle.net/blai/7u59asyp/


훌륭한 솔루션! 감사!
Valeriu92

유연한 셀 앞에 정적 셀을 추가 할 때까지 꽤 좋았습니다 : jsfiddle.net/7u59asyp/5
Sam

이것은 내가 변화 예상 컨텐츠 크기가 4 열이 있기 때문에,하지 완벽하게이기는하지만, 나를 위해 일한 유일한 하나입니다
경우 하향

3

다음 규칙을 간단하게 추가하십시오 td.

overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
// These ones do the trick
width: 100%;
max-width: 0;

예:

table {
  width: 100%
}

td {
  white-space: nowrap;
}

.td-truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  width: 100%;
  max-width: 0;
}
<table border="1">
  <tr>
    <td>content</td>
    <td class="td-truncate">long contenttttttt ttttttttt ttttttttttttttttttttttt tttttttttttttttttttttt ttt tttt ttttt ttttttt tttttttttttt ttttttttttttttttttttttttt</td>
    <td>other content</td>
  </tr>
</table>

추신 : 다른 너비로 사용자 정의 너비를 설정 td하려면 min-width.


이것의 문제점은 기본적으로 테이블 열이 공간을 비례 적으로 소비한다는 것입니다. 한 행의 내용이 다른 행의 내용보다 길면 더 많은 너비를 할당합니다. 그러나이 기술은 공간을 균등하게 나눕니다. 해결 방법이 있습니까?
Malik Brahimi

2

이 질문은 Google에서 상단에 표시되므로 제 경우에는 https://css-tricks.com/snippets/css/truncate-string-with-ellipsis/ 의 CSS 스 니펫을 사용 했지만 td에 적용하지 않았습니다. 원하는 결과.

나는 td의 텍스트 주위에 div 태그를 추가해야했고 줄임표가 마침내 작동했습니다.

약식 HTML 코드;

<table style="width:100%">
 <tr>
    <td><div class='truncate'>Some Long Text Here</div></td>
 </tr>
</table>

약식 CSS;

.truncate { width: 300px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

0

"nowrap"이 문제를 어느 정도 해결했는지 확인하십시오. 참고 : nowrap은 HTML5에서 지원되지 않습니다

<table border="1" style="width: 100%; white-space: nowrap; table-layout: fixed;">
<tr>
    <td style="overflow: hidden; text-overflow: ellipsis;" nowrap >This cells has more content  </td>
    <td style="overflow: hidden; text-overflow: ellipsis;" nowrap >Less content here has more content</td>
</tr>


white-space: nowrapnowrap속성과 동일한 효과가 있습니다 (예제에서 사용하고 있습니다). 여기에 추가하면 내가 알 수있는 한 아무것도 변경되지 않습니다.
s4y

0

오른쪽 셀의 너비를 필요한 최소 너비로 설정 한 다음 왼쪽 셀 내부에 overflow-hidden + text-overflow를 적용 할 수 있지만 Firefox는 버그가 있습니다.

flexbox가 도움이 될 수 있지만


0

나는 최근에 노력하고 있습니다. 이 jsFiddle test 를 확인하고 기본 테이블의 너비를 변경하여 동작을 확인하십시오.)

해결책은 테이블을 다른 테이블에 포함시키는 것입니다.

<table style="width: 200px;border:0;border-collapse:collapse">
    <tbody>
        <tr>
            <td style="width: 100%;">
                <table style="width: 100%;border:0;border-collapse:collapse">
                    <tbody>
                        <tr>
                            <td>
                                <div style="position: relative;overflow:hidden">
                                    <p>&nbsp;</p>
                                    <p style="overflow:hidden;text-overflow: ellipsis;position: absolute; top: 0pt; left: 0pt;width:100%">This cells has more content</p>
                                </div>
                            </td>
                        </tr>
                    </tbody>
                </table>
            </td>
            <td style="white-space:nowrap">Less content here</td>
        </tr>
    </tbody>
</table>

Fred는 이제 Celldito의 확장에 만족합니까?


응답이 부족하여 죄송합니다. 이것이 단일 테이블과 다르게 작동하는 것을 볼 수 없습니다. Chrome 또는 Firefox에서 바이올린을 볼 때 질문의 두 번째 스크린 샷과 정확히 같습니다. 뭔가 빠졌습니까?
s4y 2016 년

죄송합니다. 링크가 내가 게시 한 링크가 아닙니다. 실제로 이것은 하나의 jsfiddle.net/VSZPV/2 입니다. 두 셀의 텍스트와 테스트 할 기본 테이블의 너비를 변경하십시오. 그것이 당신이 찾는 곳이
되길 바랍니다

0

이것이 누구에게 도움이되는지 모르겠지만 각 열에 특정 너비 크기를 백분율로 지정하여 비슷한 문제를 해결했습니다. 분명히 이것은 각 열에 너비가 너무 넓지 않은 내용이있는 경우 가장 잘 작동합니다.


-1

나는 같은 문제가 있었지만 여러 줄을 표시해야했습니다 ( text-overflow: ellipsis;실패한 곳 ). textarea내부 a를 사용하여 해결 TD한 다음 테이블 셀처럼 작동하도록 스타일을 지정합니다.

    textarea {
        margin: 0;
        padding: 0;
        width: 100%;
        border: none;
        resize: none;

        /* Remove blinking cursor (text caret) */
        color: transparent;
        display: inline-block;
        text-shadow: 0 0 0 black; /* text color is set to transparent so use text shadow to draw the text */
        &:focus {
            outline: none;
        }
    }

-2

'table-layout : fixed'가 필수 레이아웃 요구 사항이라는 점을 감안할 때 균등하게 간격을 조정할 수없는 열을 만들지 만 너비가 다른 셀을 만들어야한다면 셀의 'colspan'을 배수로 설정해야합니까?

예를 들어, 백분율 계산을 쉽게하기 위해 총 너비 100을 사용하고 하나의 셀이 80 %이고 다른 하나는 20 %가 필요하다고 가정하면 다음을 고려하십시오.

<TABLE width=100% style="table-layout:fixed;white-space:nowrap;overflow:hidden;">
     <tr>
          <td colspan=100>
               text across entire width of table
          </td>
     <tr>
          <td colspan=80>
               text in lefthand bigger cell
          </td>
          <td colspan=20>
               text in righthand smaller cell
          </td>
</TABLE>

물론 80 % 및 20 %의 열의 경우 100 % 너비 셀 colspan을 5로, 80 %를 4로, 20 %를 1로 설정할 수 있습니다.


1
안녕하세요 @Siubear. tds 에 백분율 너비를 지정하는 것과 어떻게 다른 가요?
s4y

그런 식으로 colspan을 사용하는 것은 끔찍한 생각입니다. 대신 너비를 사용하지 않겠습니까?
퍼시
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.