Forcer les largeurs de colonne de table à toujours être fixes quel que soit le contenu

89

J'ai une table html avec table-layout: fixedet un td avec une largeur définie. La colonne se développe toujours pour contenir le contenu du texte qui ne contient pas d'espace. Existe-t-il un moyen de résoudre ce problème autre que d'encapsuler le contenu de chaque td dans un div?

Exemple: http://jsfiddle.net/6p9K3/29/

<table>
    <tbody>
        <tr>
            <td style="width: 50px;">Test</td>
            <td>Testing 1123455</td>
        </tr><tr>
            <td style="width: 50px;">AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</td>
            <td>B</td>
        </tr>
    </tbody>
</table>

table
{
    table-layout: fixed;
}

td
{
    border: 1px solid green;
    overflow: hidden;
}

Dans l'exemple, vous pouvez voir que la colonne avec AAAAAAAAAAAA ... se développe bien qu'elle soit explicitement définie sur 50 px de large.

datadamnation
la source
1
Duplicata de stackoverflow.com/q/4457506/1190388
hjpotter92

Réponses:

178

Spécifiez la largeur du tableau:

table
{
    table-layout: fixed;
    width: 100px;
}

Voir jsFiddle

Arie Xiao
la source
2
Il coupe le contenu
Vikash
7
Incroyable! cela fonctionne également parfaitement avec table-layout: fixed; width: 100%;.
Lucas Reppe Welander le
22

Essayez de regarder dans le CSS suivant:

word-wrap:break-word;

Les navigateurs Web ne doivent pas interrompre les «mots» par défaut, de sorte que vous rencontrez un comportement normal d'un navigateur. Cependant, vous pouvez remplacer cela avec la directive CSS word-wrap.

Vous devrez définir une largeur sur le tableau global puis une largeur sur les colonnes. "largeur: 100%;" devrait également être OK en fonction de vos besoins.

L'utilisation de la fonction Word-wrap n'est peut-être pas ce que vous voulez, mais elle est utile pour afficher toutes les données sans déformer la mise en page.

Drew Anderson
la source
2
Ceci, combiné à la réponse d'Arie Shaw, m'a donné le comportement que je recherchais. La colonne a toujours la même largeur quel que soit le texte et elle enveloppe le texte même s'il n'y a pas d'espaces.
datadamnation du
Je cherche quelque chose comme ça, mais cela ne semble pas fonctionner si la table n'est pas définie sur table-layout: fixed. Cependant, la disposition de table fixe n'est pas stylable en CSS si la tête de table th a un colspan. Comment faire fonctionner le word-wrap dans une table? stackoverflow.com/questions/42371945/…
Manuel
13

Rendre la table solide comme le roc AVANT le css. Calculez la largeur de votre tableau, puis utilisez une ligne de «contrôle» dans laquelle chaque td a une largeur explicite, qui s'ajoutent à la largeur de la balise table.

Devoir faire des centaines d'e-mails html pour travailler partout, en utilisant d'abord le bon HTML, puis le style w / css contournera de nombreux problèmes dans tous les IE, webkit et mozillas.

donc:

<table width="300" cellspacing="0" cellpadding="0">
  <tr>
    <td width="50"></td>
    <td width="100"></td>
    <td width="150"></td>
  </tr>
  <tr>
    <td>your stuff</td>
    <td>your stuff</td>
    <td>your stuff</td>
  </tr>
</table>

Gardera une table à 300px de large. Regardez des images plus grandes que la largeur par des extrêmes

kelly johnson
la source
1
w3school dit non pris en charge dans html5
v.oddou
L' widthattribut est, vous utilisez le CSS widthpropriété ou, le HTML recommandé 5 façon de largeur de colonne ensemble, l' utilisation <colgroup>et <col>éléments juste après l' <table>étiquette , et avant tout <thead>, <tbody>ou des <tr>éléments.
S. Esteves
9

Vous pouvez ajouter un divau td, puis le styliser. Cela devrait fonctionner comme prévu.

<td><div>AAAAAAAAAAAAAAAAAAA</div></td>

Puis le css.

td div { width: 50px; overflow: hidden; }
John Fisher
la source
3

Vous pouvez également travailler avec "overflow: hidden" ou "overflow-x: hidden" (uniquement pour la largeur). Cela nécessite une largeur définie (et / ou une hauteur?) Et peut-être aussi un "display: block".

"Overflow: Hidden" masque tout le contenu, qui ne rentre pas dans la zone définie.

Exemple:

http://jsfiddle.net/NAJvp/

HTML:

<table border="1">
    <tr>
        <td><div>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div></td>
        <td>bbb</td>
        <td>cccc</td>
    </tr>
</table>

CSS:

td div { width: 100px; overflow-y: hidden; }

EDIT: Honte à moi, je l'ai vu, vous utilisez déjà le "débordement". Je suppose que cela ne fonctionne pas, car vous ne définissez pas "display: block" sur votre élément ...

Stefan Brendle
la source
0

J'essaierais de le régler sur max-width: 50px;

Alex
la source
et largeur: 50px; si vous voulez vraiment avoir une largeur fixe.
Adrian P.
0

Vous pouvez également utiliser des pourcentages et / ou spécifier dans les en-têtes de colonne:

<table width="300">  
  <tr>
    <th width="20%">Column 1</th>
    <th width="20%">Column 2</th>
    <th width="20%">Column 3</th>
    <th width="20%">Column 4</th>
    <th width="20%">Column 5</th>
  </tr>
  <tr>
    <!--- row data -->
  </tr>
</table>

Le bonus avec les pourcentages est une moindre maintenance du code: vous pouvez modifier la largeur de votre table sans avoir à redéfinir la largeur des colonnes.

Mise en garde: Je crois comprendre que la largeur du tableau spécifiée en pixels n'est pas prise en charge dans HTML 5; vous devez utiliser CSS à la place.

PfunnyGuy
la source
-1

Cela fonctionne pour moi

td::after { 
content: ''; 
display: block; 
width: 30px;
}
MikeyMo
la source