161 votes

100% width table overflowing div container

J'ai des problèmes avec un tableau html qui déborde de son conteneur parent.

.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>

Comment puis-je forcer le texte de l'en-tête et le texte de la cellule du tableau à s'enrouler de manière à ce qu'ils s'insèrent correctement dans leur conteneur ? Je préférerais une méthode CSS uniquement, mais je suis également ouvert à l'utilisation de Javascript (ou jQuery) si c'est absolument nécessaire.

304voto

canon Points 14870

D'un point de vue purement "faire tenir dans la div", ajoutez ce qui suit à votre classe de tableau ( jsfiddle ):

table-layout: fixed;
width: 100%;

Définissez la largeur de vos colonnes comme vous le souhaitez ; sinon, l'algorithme de mise en page fixe répartira la largeur du tableau de manière uniforme entre les colonnes.

Pour une référence rapide, voici les algorithmes de mise en page des tableaux, l'accent étant mis sur les miens :

  • Fixe ( source )

    Avec cet algorithme (rapide), la disposition horizontale du tableau ne dépend pas du contenu des cellules ; elle ne dépend que de la largeur du tableau, de la largeur des colonnes et des bordures ou de l'espacement des cellules.

  • Automatique ( source )

    Dans cet algorithme (qui ne nécessite généralement pas plus de deux passages), la largeur du tableau est donnée par la largeur de ses colonnes [, selon le contenu] (et intervenant frontières ).

    [...] Cet algorithme peut être inefficace car il exige que l'agent utilisateur ait accès à tout le contenu du tableau avant de déterminer la présentation finale et peut nécessiter plus d'un passage.

Cliquez sur la documentation source pour voir les spécificités de chaque algorithme.

65voto

Jon Schneider Points 2625

Essayez d'ajouter

word-break: break-all 

à la feuille de style CSS de votre élément de tableau.

Les mots contenus dans les cellules du tableau seront ainsi brisés de manière à ce que le tableau ne soit pas plus large que la div qu'il contient, mais que les colonnes du tableau soient toujours dimensionnées de manière dynamique. jsfiddle demo .

21voto

David Titarenco Points 17148

Ajouter display: block; y overflow: auto; a .my-table . Ceci coupera simplement tout ce qui se trouve au-delà de la 280px que vous avez imposée. Il n'y a aucun moyen de faire en sorte que ce soit "joli" avec cette exigence en raison de mots tels que pélagosthrough qui sont plus larges que 280px .

3voto

Essayez d'ajouter à td :

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

les tds débordés s'aligneront sur la nouvelle ligne.

1voto

Peter Lyons Points 47794

Eh bien, compte tenu de vos contraintes, je pense que la mise en place overflow: scroll; sur le .page div est probablement votre seule option. 280 px, c'est assez étroit, et compte tenu de la taille de votre police, l'habillage des mots ne suffira pas. Certains mots sont simplement longs et ne peuvent pas être enveloppés. Vous pouvez soit réduire votre taille de police de manière drastique, soit utiliser overflow : scroll.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X