Table débordant en dehors de div

94

J'essaie d'empêcher une table dont la largeur est explicitement déclarée de déborder en dehors de son parent div. Je suppose que je peux faire cela d'une certaine manière en utilisant max-width, mais je n'arrive pas à faire fonctionner cela.

Le code suivant (avec une très petite fenêtre) provoquera ceci:

<style type="text/css">
  #middlecol {
    width: 45%;
    border-right:2px solid red;
  }
  #middlecol table {
    max-width:100% !important;
  }
</style>

<div id="middlecol">
  <center>
    <table width="400" cellpadding="3" cellspacing="0" border="0" align="center">
      <tr>
        <td bgcolor="#DDFFFF" align="center" colspan="2">
          <strong>Notification!</strong>
        </td>
      <tr>
        <td width="50">
          <img src="http://www.example.com/img.png" width="50" height="50" alt="" border="0">
        </td>
        <td>
          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
        </td>
      </tr>
    </table>
  </center>
 </div>

La ligne rouge est la bordure droite du div, et si vous réduisez la fenêtre de votre navigateur, vous verrez que le tableau ne rentre pas dedans.

waiwai933
la source
2
Hors sujet: ne pas utiliser <center>. Il est obsolète depuis des années. D'ailleurs, vous en avez déjà un align="center"sur votre table.
ЯegDwight
C'est malheureusement quelque chose sur lequel je n'ai aucun contrôle. Le contenu à l'intérieur du div est en fait inclus à partir d'un fichier qui n'est pas généré par moi. Je ne peux toucher que le CSS, mais j'éliminerais le <center> si je le pouvais.
waiwai933

Réponses:

24

Retournez-le en faisant:

<style type="text/css">
  #middlecol {
    border-right: 2px solid red;
    width: 45%;
  }

  #middlecol table {
    max-width: 400px;
    width: 100% !important;
  }
</style>

Je vous conseille également de:

  • Ne pas utiliser la centerbalise (elle est obsolète)
  • Ne pas utiliser width, les bgcolorattributs, les définir en CSS ( widthet background-color)

(en supposant que vous puissiez contrôler la table qui a été rendue)

Zyphrax
la source
Si je fais une largeur: 100%, il ignore ma marge: à droite. qui provoque un défilement horizontal de la barre
Jesse
208

Vous pouvez empêcher les tables de s'étendre au-delà de leur div parent en utilisant table-layout:fixed.

Le CSS ci-dessous fera étendre vos tableaux à la largeur du div qui l'entoure.

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

J'ai trouvé cette astuce ici .

James Lawruk
la source
63
Cela force toutes les colonnes à avoir la même largeur ... pas très utile
Serj Sagan
11
En fait, vous pouvez toujours créer des colonnes de largeurs différentes, il vous suffit de spécifier les largeurs en <col>s ou sur les s de la première ligne <td>(plutôt que de la laisser couler en fonction de la taille du texte). De MDN: "fixe: les largeurs de tableau et de colonne sont définies par la largeur des éléments de table et de colonne ou par la largeur de la première ligne de cellules. Les cellules des lignes suivantes n'affectent pas la largeur des colonnes."
philfreo
1
Merci beaucoup. Ce fut une grande aide que vous avez fait pour moi ...
Parthan_akon
67

Une solution rudimentaire consiste à définir display: tablele div contenant.

questzen
la source
8
C'est génial, exactement ce que je recherchais. Pour aider les autres, voici quelques chaînes googlables: j'essayais d'utiliser CSS pour adapter le div parent au débordement, ou adapter un arrière-plan pour couvrir le contenu de table débordant. Cela a parfaitement fonctionné, merci beaucoup!
trisweb
Juste un addendum, veuillez faire attention au contexte dans lequel cela est appliqué, cela est utilisé pour donner une mise en page de tableau comme un comportement et donc la présence d'autres attributs de style comme table-row, table-cell. Les mises en page tabulaires ne sont pas flottantes. Au moment de l'affichage: la propriété de la table seule n'est pas suffisante
Questzen
Également venu ici après des heures de recherche de réponse. Chaînes pour le moteur de recherche: Le tableau à l'intérieur de div ne défile pas, Firefox. Div avec table ne défile pas, Firefox. Aucune barre de défilement n'apparaissant dans le tableau d'un div.
anevaude
2
J'ai essayé quelques choses mais j'ajoute simplement display: table au div parent supérieur. Le problème a été résolu, merci.
Günay Gültekin
Meilleure solution pour les tableaux avec de longs noms d'en-tête et un long contenu de cellule. Merci!.
Ege Bayrak
34

J'ai essayé toutes les solutions mentionnées ci-dessus, puis je n'ai pas fonctionné. J'ai 3 tableaux l'un en dessous de l'autre. Le dernier a débordé. Je l'ai corrigé en utilisant:

/* Grid Definition */
table {
    word-break: break-word;
}

Pour IE11 en mode Edge, vous devez le définir sur word-break:break-all

M. Doomsbuster
la source
12

Au début, j'ai utilisé la méthode de James Lawruk. Cela a cependant changé toutes les largeurs des td's.

La solution pour moi était d'utiliser white-space: normalsur les colonnes (qui était réglé sur white-space: nowrap). De cette façon, le texte se cassera toujours. L'utilisation word-wrap: break-wordgarantira que tout se cassera en cas de besoin, même à mi-chemin d'un mot.

Le CSS ressemblera alors à ceci:

td, th {
    white-space: normal; /* Only needed when it's set differntly somewhere else */
    word-wrap: break-word;
}

Ce n'est peut-être pas toujours la solution souhaitable, car cela word-wrap: break-wordpourrait rendre vos mots dans le tableau illisibles. Cela gardera cependant votre table à la bonne largeur.

Sander Koedood
la source
5

J'ai essayé presque tout ce qui précède mais cela n'a pas fonctionné pour moi ...

word-break: break-all;

Ceci à ajouter sur le div parent (conteneur de la table.)

Waheed Asghar
la source
1
overflow-x: auto;
overflow-y : hidden;

Appliquez le style ci-dessus à la division parent.

Christian Heath
la source
-3

Il y a un width="400"sur la table, retirez-le et cela fonctionnera ...

vallée
la source