159 votes

Pourquoi l'ellipse CSS ne fonctionne-t-elle pas dans une cellule de tableau ?

Prenons l'exemple suivant : ( Démonstration en direct ici )

$(function() {
  console.log("width = " + $("td").width());
});

td {
  border: 1px solid black;
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

Le résultat est le suivant : width = 139 et l'ellipse n'apparaît pas.

Qu'est-ce qui m'échappe ?

2 votes

0 votes

Il s'agit en quelque sorte d'un doublon, mais la réponse ne propose pas de solution de contournement (comme le fait Arlen Cuss).

1 votes

width y height sur les cellules du tableau sont toujours utilisées comme minimal la largeur et la hauteur. Les cellules des tableaux sont différentes !

108voto

Misha Moroshko Points 20469

Apparemment, en ajoutant :

td {
  display: block; /* or inline-block */
}

résout également le problème.


Une autre solution possible consiste à définir table-layout: fixed; pour la table, et définit également sa valeur width . Par exemple : http://jsfiddle.net/fd3Zx/5/

4 votes

Exactement. Les éléments avec display: table-cell (par défaut pour les td ) n'acceptent pas de largeur.

30 votes

display: block; Cela va en quelque sorte à l'encontre de l'objectif poursuivi par l'utilisation d'un tableau. J'aime bien les table-layout: fixed; Cette option a bien fonctionné pour moi.

9 votes

table-layout:fixed distribue la largeur des colonnes d'une manière moins intelligente. Existe-t-il une autre option qui attribue la largeur des colonnes de la même manière ? table-layout: normal tout en affichant correctement l'ellipse ?

92voto

streetlight Points 2099

Il est également important de mettre

table-layout:fixed;

Onto the containing table, so it operates well in IE9 (if your utilize max-width) as well in IE9 (if your utilize max-width).

7 votes

Cela permettra également de s'assurer que le débordement du texte fonctionne dans les mises en page réactives.

3 votes

C'est exactement ce dont j'avais besoin. La largeur du tableau est de 100 %. Et toutes les colonnes, sauf une, ont une largeur fixe. Cela permet à la dernière colonne d'occuper tout l'espace restant.

84voto

marcosbdm Points 149

Comme indiqué précédemment, vous pouvez utiliser td { display: block; } mais cela va à l'encontre de l'objectif poursuivi par l'utilisation d'un tableau.

Vous pouvez utiliser table { table-layout: fixed; } mais peut-être voulez-vous qu'il se comporte différemment pour certaines colonnes.

La meilleure façon d'obtenir ce que vous souhaitez est donc d'envelopper votre texte dans un fichier <div> et appliquez votre CSS à la <div> (pas au <td> ) comme ceci :

td {
  border: 1px solid black;
}
td > div {
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

2 votes

C'est la méthode la plus simple que j'ai vue et elle fonctionne dans IE8.

2 votes

C'est en fait la meilleure solution que j'ai vue pour les ellipses dans les tableaux.

1 votes

Je ne vois pas bien en quoi c'est différent, puisque cela force la définition d'une largeur. Il désactive toujours complètement l'auto-dimensionnement des colonnes de tableaux, ce qui signifie que vous devez maintenant bricoler avec le pixel nudging sur chaque colonne de votre application entière. Pour une application de grande taille, c'est un cauchemar.

45voto

Yuki Izumi Points 7493

Essayez d'utiliser max-width au lieu de width le tableau calculera toujours la largeur automatiquement.

Fonctionne même en ie11 (avec le mode de compatibilité ie8).

td.max-width-50 {
  border: 1px solid black;
  max-width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

<table>
  <tbody>
    <tr>
      <td class="max-width-50">Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

jsfiddle .

1 votes

Bien vu. Il est probablement préférable d'utiliser à la fois afin que l'élément ait une largeur fixe. Dans le cas contraire, il pourrait être plus court si le contenu le permettait.

0 votes

Bien mieux que le display hack ; le displayhack se plante dans la bordure de la table.

27voto

vsync Points 11280

Page de démonstration

Pour les tableaux à largeur dynamique, j'ai trouvé la méthode ci-dessous qui donne des résultats satisfaisants. Chaque <th> dont on souhaite qu'il ait une capacité de texte tronqué doit avoir un élément d'habillage intérieur qui enveloppe le contenu de l'élément <th> permettre text-overflow pour travailler.

La véritable astuce consiste à définir max-width (sur le site <th> ) en vw unités .

La largeur de l'élément sera ainsi "liée" à la largeur de la fenêtre de visualisation (fenêtre du navigateur) et il en résultera un écrêtage réactif du contenu. Définir la largeur de l'élément vw à une valeur satisfaisante nécessaire.

CSS minimal :

th{ max-width:10vw; }

th > .wrap{ 
   text-overflow:ellipsis;
   overflow:hidden;
   white-space:nowrap;
}

Démonstration (avec textes modifiables) :

document.designMode="on"

table {
  font: 18px Arial;
  width: 40%;
  margin: 1em auto;
  color: #333;
  border: 1px solid rgba(153, 153, 153, 0.4);
}

table td, table th {
  text-align: left;
  padding: 1.2em 20px;
  white-space: nowrap;
  border-left: 1px solid rgba(153, 153, 153, 0.4);
}

table td:first-child, table th:first-child {
  border-left: 0;
}

table th {
  border-bottom: 1px solid rgba(153, 153, 153, 0.4);
  font-weight: 400;
  text-transform: uppercase;
  max-width: 10vw;
}

table th > .wrap {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}

<table>
    <thead>
        <tr>
            <th>
                <div class="wrap" title="Some long title">Some long title</div>
            </th>
            <th>
                <div class="wrap">Short</div>
            </th>
            <th>
                <div class="wrap">medium one</div>
            </th>
            <th>
                <div class="wrap" title="endlessly super long title which no developer likes to see">endlessly super long title which no developer likes to see</div>
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>-</td>
            <td>-</td>
            <td>-</td>
            <td>very long text here</td>
        </tr>
    </tbody>
</table>

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