100%幅のテーブルでdivコンテナーがオーバーフローしています


136

親コンテナーでオーバーフローしているhtmlテーブルに問題があります。

.page {
    width: 280px;
    border:solid 1px blue;
}

.my-table {
    word-wrap: break-word; 
}

.my-table td {
    border:solid 1px #333;
}
<div class="page">
    <table class="my-table">
        <tr>
            <th>Header Text</th>
            <th>Col 1</th>
            <th>Col 2</th>
            <th>Col 3</th>
            <th>Col 4</th>
            <th>Header Text</th>
        </tr>
        <tr>
            <td>An archipelago is a chain or cluster of islands. The word archipelago is derived from the Greek ἄρχι- – arkhi and πέλαγος – pélagosthrough the Italian arcipelago. In Italian, possibly following a tradition of antiquity, the Arcipelago (from medieval Greek *ἀρχιπέλαγος) was the proper name for the Aegean Sea and, later, usage shifted to refer to the Aegean Islands (since the sea is remarkable for its large number of islands). It is now used to refer to any island group or, sometimes, to a sea containing a large number of scattered islands such as the Aegean Sea.[1]</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>An archipelago is a chain or cluster of islands. The word archipelago is derived from the Greek ἄρχι- – arkhi and πέλαγος – pélagosthrough the Italian arcipelago. In Italian, possibly following a tradition of antiquity, the Arcipelago (from medieval Greek *ἀρχιπέλαγος) was the proper name for the Aegean Sea and, later, usage shifted to refer to the Aegean Islands (since the sea is remarkable for its large number of islands). It is now used to refer to any island group or, sometimes, to a sea containing a large number of scattered islands such as the Aegean Sea.[1]</td>
        </tr>
    </table>    
</div>

ヘッダーテキストとテーブルセルテキストの両方を、コンテナーに適切に収まるように強制的に折り返すにはどうすればよいですか?私はCSSのみの方法を好みますが、どうしても必要な場合はJavaScript(またはjQuery)を使用することもできます。

回答:


252

純粋に「divに適合させる」という観点から、テーブルクラス(jsfiddle)に以下を追加します。

table-layout: fixed;
width: 100%;

必要に応じて列幅を設定します。それ以外の場合は、固定レイアウトアルゴリズムにより、テーブルの幅が列全体に均等に分散されます。

クイックリファレンスとして、次の表レイアウトアルゴリズムを強調します。

  • 固定(ソース
    この(高速な)アルゴリズムでは、テーブルの水平レイアウトはセルの内容依存しません。テーブルの幅、列の幅、および境界線またはセルの間隔にのみ依存します。
  • 自動(ソース
    このアルゴリズム(通常、2パス以下が必要です)では、テーブルの幅は列の幅[コンテンツによって決定される](およびその間のボーダーによって指定されます

    [...]このアルゴリズムは、最終的なレイアウトを決定する前にユーザーエージェントがテーブル内のすべてのコンテンツにアクセスする必要があり、複数のパスを要求する可能性があるため、非効率的な場合があります。

クリックしてソースドキュメントを確認し、各アルゴリズムの詳細を確認してください。


54

追加してみてください

word-break: break-all 

あなたのテーブル要素のCSSに。

これにより、テーブルのセル内の単語が壊れて、テーブルが含まれるdivよりも大きくならないようになりますが、テーブルの列のサイズは動的に変わりません。 jsfiddleデモ


10
さらに良いword-wrap: break-word;
アポロ2016年

1
@Apolo-同意した!私はこれを元のjsfiddleデモでも使用しました(上記の回答本文のリンクを参照)。
Jon Schneider

1
ブリンクブラウザはword-break: break-wordどちらが最もよく機能します。
Volvox 2017

overflow-wrapプロパティは標準化されているため、代わりに使用することをお
勧めし

18

display: block;overflow: auto;を追加し.my-tableます。これにより、適用した280px制限を超えたものはすべてカットされます。のようpélagosthroughに幅が広いという単語のため、その要件で「きれいに見える」ようにする方法はありません280px


私の場合だけ:テーブルをすべての親の幅(高解像度)に合わせる必要があったので、テーブルをdivで囲み、それにスタイルを適用しました。これでテーブルは親のすべての幅を使用しようとしますが、テーブルのコンテンツがオーバーフローしている場合はスクロールバーが表示されます。
manuman94 2018年

2

に追加してみてくださいtd

display: -webkit-box; // to make td as block
word-break: break-word; // to make content justify

オーバーフローしたtdsは新しい行に整列します。


1

まあ、あなたの制約を考えるとoverflow: scroll;.pagedivの設定がおそらく唯一の選択肢だと思います。280 pxはかなり狭く、フォントサイズを考えると、ワードラッピングだけでは十分ではありません。一部の単語は長すぎて折り返すことができません。フォントサイズを大幅に減らすか、オーバーフローを使用してスクロールできます。


1

CSSを次のように更新します。これで修正されます

.page {
    width: 280px;
    border:solid 1px blue;
    overflow-x: auto;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.