テーブルセルのCSSテキストオーバーフロー?


500

CSSを使いたい text-overflowテーブルセルで、テキストが長すぎて1行に収まらない場合は、複数行に折り返されるのではなく省略記号が表示されます。これは可能ですか?

私はこれを試しました:

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

しかし、white-space: nowrapはテキスト(およびそのセル)を継続的に右に拡張し、テーブルの幅全体をコンテナの幅を超えて押し上げているように見えます。ただし、これがないと、テキストがセルの端に達したときに複数行に折り返され続けます。


9
テーブルセルはうまく処理できませんoverflow。セルにdivを入れて、そのdivをスタイリングしてみてください。
リスター氏2012年

回答:


898

テーブルセルをオーバーフローしたときに省略記号でテキストをクリップするには、オーバーフローを機能させるために、max-widthtdクラスにCSSプロパティを設定する必要があります。追加のレイアウトdivは必要ありません

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

レスポンシブレイアウトの場合。max-widthCSSプロパティを使用して列の有効な最小幅を指定するか、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(またはそれ以下)の場合、これをHTMLに入れて、IE固有のレンダリングの問題を修正する必要があります。

<!--[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 14年

2
@OzrenTkalcecKrznaricはdisplay: table-cell実際に機能しますが、max-widthパーセント(%)で定義されている場合は機能しません。FF 32でテスト
Greg

14
(上記のフォローアップ)%値を使用する場合table-layout: fixed、要素でのみ使用するdisplay: tableとトリックが実行されます
Greg

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>要素でラップします。
ロイティンカー

2
これは本当に賢い解決策であり、解決策を必要とするすべてのテーブルでうまく機能します。ただし、すべてのテーブルセルを同じ幅にしたくない場合は、幅を設定する必要があります。
Kevin Beal 2015年

固定幅がない場合、このソリューションが最適に機能します。確かにとても賢いです!
アビデニック

1
これにより、他のソリューションではdisplay: block実現できなかった垂直整列が維持されます
j3ff

これまでにない最高のソリューション!かなり独創的です。どうもありがとうございます。
ClownCoder 2018

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にはコードが含まれており(デバッグの変更がいくつかあります)、これをのdiv代わりにに適用すると問題なく機能しtdます。また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 2012年

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 2017年

それはすべての列の選択された幅の制限を台無しにします。たとえば、いくつかの列が定義されmax-width: Xている場合、それらはより広くなる可能性があります-これはdisplay: flex使用されているためだと思いましたが、それを削除して違いはありません...
user9645

24

要素に指定するtable-layout: fixed;と、tableスタイルtdが有効になるようです。ただし、これはセルのサイズ設定にも影響します。

Sitepointは、ここでテーブルレイアウトメソッドについて少し説明しています:http ://reference.sitepoint.com/css/tableformatting


2
テーブルの幅を指定したくない場合は、これが正しい答えになるはずです。
アドリアンの

20

テーブルを自動レイアウトするだけの場合

max-width、または列幅のパーセンテージtable-layout: fixedなどを使用しない場合

https://jsfiddle.net/tturadqq/

使い方:


ステップ1:テーブルの自動レイアウトに任せるだけです。

大量のテキストを含む1つ以上の列がある場合、他の列をできるだけ縮小してから、長い列のテキストを折り返します。

ここに画像の説明を入力してください


ステップ2:セルの内容をdivでラップし、そのdivを max-height: 1.1em

(追加の0.1emは、「g」と「y」の尾のように、テキストベースの下に少しレンダリングする文字用です)

ここに画像の説明を入力してください


ステップ3:titledivに設定する

これはアクセシビリティに優れており、すぐに使用する小さなトリックに必要です。

ここに画像の説明を入力してください


ステップ4:::afterdivにCSS を追加する

これはトリッキーなビットです。でCSSを設定::aftercontent: attr(title)、それをdivの上に配置して設定しtext-overflow: ellipsisます。わかりやすくするために、ここでは赤色にしています。

(長い列の末尾に省略記号があることに注意してください)

ここに画像の説明を入力してください


ステップ5:divテキストの色を transparent

これで完了です。

ここに画像の説明を入力してください


2
これは素晴らしい完璧なソリューションです!なぜこれがほとんどの賛成投票の代わりに反対票を獲得したのだろう。
zendu 2017

2
素晴らしい男!(@ user9645-不正解です。Vue.jsでレンダリングされたテーブルを使用してください。タイトルは、tdではなくdivに配置してください)
Christian Opitz '

@ChristianOpitz-うん、どういうわけかそれを台無しにしたに違いない...それを再試行し、それは機能している。
user9645 2018

テーブルセルの<a>代わりに使用すると、このアプローチが失敗することがわかりました<div>。追加word-break: break-all;すると問題が解決します。例:jsfiddle.net/de0bjmqv
zendu

ただ素晴らしい。セルに同じテキストを含める必要もありません(タイトルで十分です)。次に、max-height: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

セルの内容をflexブロックでラップします。おまけとして、セルの自動表示幅に合わせます。

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クラスに追加する必要がありました。
ロス・アレン

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 FYI-ブラウザはテーブルタグの下のDivを処理できます。
Ryan O'Connell 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.