固定テーブルセル幅


175

多くの人々はまだコントロールやデータなどをレイアウトするためにテーブルを使用しています-これの一例は人気のあるjqGridです。しかし、私には理解できないようないくつかの魔法が起こっています(大声で叫ぶためのテーブル、どれほどの魔法が存在する可能性があるのでしょうか?)

どのようにしてテーブルの列幅を設定し、jqGridのようにすることができますか?これを複製しようとすると<td style='width: 20px'>、をすべて設定しても、これらのセルのいずれかのコンテンツが20pxを超えるとすぐに、セルが拡大します。

アイデアや洞察はありますか?

回答:


249

<col>すべての行にタグ管理テーブルのスタイルを使用することもできますがtable-layout:fixed<table>またはテーブルのcssクラスにoverflowスタイルを設定し、セルのスタイルを設定する必要があります

https://developer.mozilla.org/en-US/docs/Web/HTML/Element/col

<table class="fixed">
    <col width="20px" />
    <col width="30px" />
    <col width="40px" />
    <tr>
        <td>text</td>
        <td>text</td>
        <td>text</td>
    </tr>
</table>

そしてこれはあなたのCSSです

table.fixed { table-layout:fixed; }
table.fixed td { overflow: hidden; }

15
colはhtml5では機能せず、代わりにインラインcssまたはcssクラスによって個々のtdの幅を設定します
Pankaj Phartiyal 2013年

10
希望のテーブルに幅を明示的に適用しない限り、受け入れられた回答は機能しません。単位を使用してもパーセンテージを使用しても完全に機能します。@totymedliの回答には投票がなく、ユーザーに無視されたくなかったので、私はこれを指摘しました。しかし、それがあなたが目指しているものでなければ、単語分割の提案は必要ありません。
thebdawk05 2013

複数の列にまたがるTD要素が1つだけの行がある場合はどうなりますか?あなたのサンプルコードを使用して、あなたが<TD colspan="3">それ自体で一列にあった場合、それは90pxになりますか?
sab669

助けてくれてありがとう。データが重複する場合は、これを追加しtable.fixed td { word-wrap: break-word; }ます。
Parag Tyagi

改行の提案は必要ありませんが、固定幅のテーブルでオーバーフローするコンテンツがほとんどのシナリオで発生することはほぼ確実であるため、それは残りのSOユーザーにとって有用であり、質問に非常に適切です。
エイミーペレグリーニ

101

HTML5 / CSS3では、この問題に対するより良い解決策があります。私の意見では、この純粋なCSSソリューションが推奨されています。

table.fixed {table-layout:fixed; width:90px;}/*Setting the table width is important!*/
table.fixed td {overflow:hidden;}/*Hide text outside the cell.*/
table.fixed td:nth-of-type(1) {width:20px;}/*Setting the width of column 1.*/
table.fixed td:nth-of-type(2) {width:30px;}/*Setting the width of column 2.*/
table.fixed td:nth-of-type(3) {width:40px;}/*Setting the width of column 3.*/
<table class="fixed">
    <tr>
        <td>Veryverylongtext</td>
        <td>Actuallythistextismuchlongeeeeeer</td>
        <td>We should use spaces tooooooooooooo</td>
    </tr>
</table>

ハンターのソリューションwidthでテーブルを設定する必要があります。それ以外の場合は機能しません。
また、vsyncが提案したCSS3の新機能は次のとおりword-break:break-all;です。これにより、スペースのない単語も複数行に分割されます。次のようにコードを変更するだけです。

table.fixed { table-layout:fixed; width:90px; word-break:break-all;}

最終結果

レンダリングされたテーブル


で行をスローするとcolspan、これはこのソリューションを壊すようです。colspan> 1 を含むテーブルでこのソリューションを使用する方法に関する提案はありますか?
Eric K

@QuantumDynamix最初の行、コルスパンのない行、幅のある個々の列すべてを含めることで、これを修正しました。次に、その行を高さ0、border:none、visibility:hidden、padding:0pxなどで非表示にしました。2番目の行は、colspanがある場所で最初に表示したい行です。個々の固定幅セルを持つ最初の行は、幅を確立します。
AaronLS 2014年

@totymedliすべての列幅の合計をテーブルに反映させる方法はありますか?私のテーブルは少し動的に生成されており、テーブルの幅を事前に計算することはできませんが、100%を使用したくありません。
AaronLS 2014年

14
table td 
{
  table-layout:fixed;
  width:20px;
  overflow:hidden;
  word-wrap:break-word;
}

9
table-layouttd要素で使用できますか?
Nick 14

@ニック-それは大丈夫です。Hovewer私もmin-widthとmax-widthプロパティを追加する必要があります(widthと同じ値)、それからそれは本当に固定幅になりました。
Denis Khay

11

私は1つの長いテーブルのtdセルを持っていました、これはテーブルをブラウザの端に押し付け、醜く見えました。私はその列を固定サイズのみにして、指定された幅に達したときに単語を分割したかっただけです。これは私にとってうまくいきました:

<td><div style='width: 150px;'>Text to break here</div></td>

テーブル、tr要素にスタイルの種類を指定する必要はありません。また、overflow:hiddenを使用することもできます。他の回答で示唆されているように、余分なテキストが消える原因になります。


2
または、必要に応じて、widthの代わりにmax-widthを使用できます。これにより、幅の制限に達しない限り、テキストを壊さないようにすることができます。また、テキストが指定された幅よりも小さい場合、テーブルセルに空白はありません。<td> <div style = 'max-width:150px;'>ここで改行するテキスト</ div> </ td>
Tarik


0

FULLSCREEN幅テーブルの場合:

  • テーブルの幅は100%でなければなりません

  • N列が必要な場合、THはN + 1でなければなりません

3列の例:

table.fixed {
      table-layout: fixed;
      width: 100%;
    }
    table.fixed td {
      overflow: hidden;
    }
  <table class="fixed">
      <col width=20 />
      <col width=20 />
      <col width=20 />
    <tr>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>FREE</th>
    </tr>
    <tr>
      <td>text111111111</td>
      <td>text222222222</td>
      <td>text3333333</td>
    </tr>
  </table>


-2
table
{
  table-layout:fixed;
}
td,th
{
  width:20px; 
  word-wrap:break-word;
}

:first-child ...:nth-​​child(1)または...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.