186 votes

Faire en sorte qu'un DIV remplisse une cellule entière du tableau

J'ai vu cette question y j'ai fait quelques recherches sur Internet mais rien n'a fonctionné jusqu'à présent. Je me dis que nous sommes en 2010 (ces questions/réponses sont vieilles et, en fait, sans réponse) et que nous avons CSS3 ! Existe-t-il un moyen de faire en sorte qu'une division occupe toute la largeur et la hauteur d'une cellule de tableau à l'aide de CSS ?

Je ne sais pas à l'avance quelle sera la largeur et/ou la hauteur de la cellule, et le fait de fixer la largeur et la hauteur de la division à 100 % ne fonctionne pas.

De plus, la raison pour laquelle j'ai besoin du div est que je dois positionner absolument certains éléments en dehors de la cellule, et position: relative ne s'applique pas à td et j'ai donc besoin d'un div enveloppant.

0 votes

Le conteneur du tableau lui-même a-t-il une hauteur spécifique ? Le tableau couvre-t-il la fenêtre d'affichage de la page ?

5 votes

Il est vraiment étrange que le réglage de la hauteur et de la largeur à 100 % ne fonctionne pas. Cela devrait donner à la division la largeur et la hauteur complètes de la balise parent. Peut-être que cela ne fonctionne pas à cause du positionnement relatif. Je suis curieux de voir la solution quand quelqu'un la trouvera.

0 votes

@meder les données dans le tableau sont dynamiques, donc je ne connaîtrai jamais la hauteur. la largeur remplit l'écran, oui.

82voto

dma Points 207

Div height=100% dans une cellule de tableau ne fonctionnera que si le tableau a lui-même un attribut de hauteur.

<table border="1" style="height:300px; width: 100px;">
 <tr><td>cell1</td><td>cell2</td></tr>
 <tr>
   <td style="height: 100%">
     <div style="height: 100%; width: 100%; background-color:pink;"></div>
   </td>
   <td>long text long text long text long text long text long text</td>
 </tr>
</table>

UPD dans FireFox, vous devez également définir height=100% au parent TD élément

62 votes

C'est trop bizarre. c'est stupide qu'on soit en 2012 et que ce bug n'ait pas encore été corrigé

2 votes

Et à cause de cela, nous payons plus

0 votes

Bonne astuce, mais ne fonctionne que sur Chromium pour moi. IE9 et firefox 19 ne sont pas capables d'étirer le div.

48voto

Ian Henry Points 9239

Le code suivant fonctionne sur IE 8, le mode de compatibilité IE 7 d'IE 8, et Chrome (non testé ailleurs) :

<table style="width:100px"> <!-- Not actually necessary; just makes the example text shorter -->
   <tr><td>test</td><td>test</td></tr>
   <tr>
      <td style="padding:0;">
         <div style="height:100%; width:100%; background-color:#abc; position:relative;">
            <img style="left:90px; position:absolute;" src="../Content/Images/attachment.png"/>
            test of really long content that causes the height of the cell to increase dynamically
         </div>
      </td>
      <td>test</td>
   </tr>
</table>

Vous avez dit dans votre question initiale que le réglage width y height à 100% n'a pas fonctionné, ce qui me fait penser qu'il existe une autre règle qui la remplace. Avez-vous vérifié le style calculé dans Chrome ou Firebug pour voir si les règles de largeur/hauteur étaient réellement appliquées ?

Modifier

Comme je suis stupide ! The div s'adaptait au texte, et non à l'écran de l'ordinateur. td . Vous pouvez résoudre ce problème dans Chrome en faisant en sorte que l'option div display:inline-block mais cela ne fonctionne pas sur IE. Cela s'avère plus délicat...

0 votes

Sigh... bien vu de vérifier si d'autres styles étaient appliqués. apparemment, j'avais des règles de padding qui empêchaient mon div de s'étendre sur toute la cellule du tableau. une fois que je les ai supprimées, je n'ai plus eu de problèmes. j'étais curieux parce que mon code ressemble au vôtre (en utilisant des classes bien sûr), mais quand j'ai remonté la chaîne, voilà le padding. merci pour votre aide.

6 votes

Essayez cet exemple : jsfiddle.net/2K2tG Remarquez que la cellule avec l'image est rouge et non pas #abc. Largeur/hauteur 100% ne fait rien.

0 votes

Merci pour cet article ; je cherchais cela depuis longtemps.

15voto

Matt Browne Points 3535

Si la raison pour laquelle vous souhaitez avoir un div 100% à l'intérieur d'une cellule de tableau est de permettre à une couleur d'arrière-plan de s'étendre sur toute la hauteur tout en conservant un espacement entre les cellules, vous pouvez donner à la balise <td> lui-même la couleur de fond et utiliser la propriété CSS border-spacing pour créer la marge entre les cellules.

Toutefois, si vous avez vraiment besoin d'une div d'une hauteur de 100 %, comme d'autres l'ont mentionné ici, vous devez soit attribuer une hauteur fixe à l'attribut <table> ou utiliser Javascript.

1 votes

Vous pouvez espacer la cellule en utilisant border-spacing:5px sur l'élément "table", mais je suis d'accord, l'utilisation d'un DIV à l'intérieur des cellules est beaucoup plus élégante et globalement meilleure.

0 votes

Merci pour la suggestion, ça marche très bien. n'oubliez pas d'appliquer border-collapse: separate à la table, sinon cela n'aura aucun effet. +1

0 votes

border-collapse: separate est la valeur par défaut, mais oui, c'est un bon conseil.

6voto

mrbinky3000 Points 1604

Étant donné que tous les autres navigateurs (y compris IE 7, 8 et 9) gèrent position:relative sur une cellule de tableau correctement et seulement Firefox se trompe, votre meilleure chance est d'utiliser une cale JavaScript. Vous ne devriez pas avoir à modifier votre DOM pour un navigateur défaillant. Les gens utilisent des cales tout le temps quand IE se trompe et que tous les autres navigateurs s'en sortent bien.

Voici un extrait avec tout le code annoté. Dans mon exemple, le JavaScript, le HTML et le CSS utilisent les pratiques de conception Web réactive, mais vous n'êtes pas obligé de le faire si vous ne le souhaitez pas. (Responsive signifie qu'il s'adapte à la largeur de votre navigateur).

http://jsfiddle.net/mrbinky3000/MfWuV/33/

Voici le code lui-même, mais il n'a pas de sens sans le contexte, alors visitez l'URL jsfiddle ci-dessus. (L'extrait complet comporte également de nombreux commentaires à la fois dans le CSS et le Javascript).

$(function() {
    // FireFox Shim
    if ($.browser.mozilla) {
        $('#test').wrapInner('<div class="ffpad"></div>');
        function ffpad() {
            var $ffpad = $('.ffpad'),
                $parent = $('.ffpad').parent(),
                w, h;
            $ffpad.height(0);
            if ($parent.css('display') == 'table-cell') {               
                h = $parent.outerHeight();
                $ffpad.height(h);
            }
        }
        $(window).on('resize', function() {
            ffpad();
        });
        ffpad();
    }
});

2 votes

Bien que ce soit une bonne réponse, ne copiez pas/collez ce code. $.browser est déprécié depuis jQuery 1.8 et a été supprimé dans la version 1.9. Pour plus d'informations : api.jquery.com/jQuery.browser

0 votes

J'aime aussi cette réponse, mais comme @cmegown l'a dit, $.browser est maintenant déprécié. Ce que je ferais personnellement à la place (je vais essayer - je ne suis pas sûr à 100% que ça va marcher) serait de changer le positionnement de l'élément de statique à absolu (ou l'inverse) et voir s'il y a un changement dans la position de l'élément par rapport à la fenêtre. Cela ne devrait fonctionner que si l'élément a top:0; left: 0; .

0 votes

Je peux confirmer que cela a fonctionné pour moi - je récupère le .offset() de l'élément, puis je le change en position absolue et je récupère à nouveau son offset() et s'il n'est pas le même, je l'enferme dans un div position : relative. Cela fonctionne uniquement parce qu'en position absolue, je ne m'attends pas à ce que mon élément change de positionnement (puisqu'il est top : 0 ; left : 0 ;).

3voto

user2500929 Points 67

Après plusieurs jours de recherche, j'ai trouvé une solution possible à ce problème.

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin título</title>
</head>

<body style="height:100%">
<!-- for Firefox and Chrome compatibility set height:100% in the containing TABLE, the TR parent and the TD itself. -->
<table width="400" border="1" cellspacing="0" cellpadding="0" style="height:100%;">  
  <tr>
    <td>whatever</td>
    <td>whatever</td>
    <td>whatever</td>
  </tr>
  <tr style="height:100%;">
    <td>whatever dynamic height<br /><br /><br />more content
</td>
    <td>whatever</td>

    <!-- display,background-color and radius properties in TD BELOW could be placed in an <!--[if IE]> commentary If desired.
    This way TD would remain as display:table-cell; in FF and Chrome and would keep working correctly.    
    If you don't place the properties in IE commentary it will still work in FF and Chorme with a TD display:block;

    The Trick for IE is setting the cell to display:block; Setting radius is only an example of whay you may want a DIV 100%height inside a Cell.
    -->

    <td style="height:100%; width:100%; display:block; background-color:#3C3;border-radius: 0px 0px 1em 0px;">

    <div style="width:100%;height:100%;background-color:#3C3;-webkit-border-radius: 0px 0px 0.6em 0px;border-radius: 0px 0px 0.6em 0px;">
    Content inside DIV TAG
    </div>
     </td>
  </tr>
</table>
</body>
</html>

Langue anglaise : L'astuce consiste à définir le tableau, le TR et le TD sur height:100%. Cela le rend compatible avec FireFox et Chrome. Internet Explorer n'en tient pas compte, c'est pourquoi la balise TD doit être bloquée. De cette façon, Explorer prend la hauteur maximale.

Explication en anglais : dans les commentaires du code

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