Comment rendre <div> remplir <td> hauteur

99

J'ai parcouru plusieurs articles sur StackOverflow, mais je n'ai pas été en mesure de trouver une réponse à cette question plutôt simple.

J'ai une construction HTML comme celle-ci:

<table>
  <tr>
    <td class="thatSetsABackground">
      <div class="thatSetsABackgroundWithAnIcon">
        <dl>
          <dt>yada
          </dt>
          <dd>yada
          </dd>
        </dl>
      <div>
    </td>
    <td class="thatSetsABackground">
      <div class="thatSetsABackgroundWithAnIcon">
        <dl>
          <dt>yada
          </dt>
          <dd>yada
          </dd>
        </dl>
      <div>
    </td>
  </tr>
</table>

Ce dont j'ai besoin est que le divremplisse la hauteur du td, afin que je puisse positionner l'arrière-plan du div (l'icône) dans le coin inférieur droit du td.

Comment me proposez-vous de m'y prendre?


la source
En relation: stackoverflow.com/questions/8344850/…
Chris Moschini

Réponses:

177

Si vous donnez à votre TD une hauteur de 1px, alors le div enfant aura un parent surélevé pour calculer son%. Parce que votre contenu serait plus grand que 1px, le td augmenterait automatiquement, tout comme le div. Un peu un hack poubelle, mais je parie que ça marcherait.

psayre23
la source
7
Bien que cela semble fonctionner correctement dans Webkit, IE9 se brise complètement.
Daniel Imms
Travaillez pour moi dans IE11 uniquement lorsque j'ai également défini div sur inline-block. Merci!
Danny C
5
Voici une solution qui fonctionne également dans Firefox: stackoverflow.com/questions/36575846/…
Wouter
Pour le faire fonctionner dans Firefox ainsi que dans Chrome, j'ai dû utiliser à la min-height: 1px;place deheight: 1px;
Matt Leonowicz
🤯 Je ne sais pas si j'aime CSS ou si je le déteste
noob
35

Hauteur CSS: 100% ne fonctionne que si le parent de l'élément a une hauteur explicitement définie. Par exemple, cela fonctionnerait comme prévu:

td {
    height: 200px;
}

td div {
    /* div will now take up full 200px of parent's height */
    height: 100%;
}

Puisqu'il semble que votre <td>hauteur soit variable, que se passe-t-il si vous avez ajouté l'icône en bas à droite avec une image positionnée de manière absolue comme ceci:

.thatSetsABackgroundWithAnIcon {
    /* Makes the <div> a coordinate map for the icon */
    position: relative;

    /* Takes the full height of its parent <td>.  For this to work, the <td>
       must have an explicit height set. */
    height: 100%;
}

.thatSetsABackgroundWithAnIcon .theIcon {        
    position: absolute;
    bottom: 0;
    right: 0;
}

Avec le balisage de cellule de tableau comme ceci:

<td class="thatSetsABackground">  
  <div class="thatSetsABackgroundWithAnIcon">    
    <dl>
      <dt>yada
      </dt>
      <dd>yada
      </dd>
    </dl>
    <img class="theIcon" src="foo-icon.png" alt="foo!"/>
  </div>
</td>

Edit: utiliser jQuery pour définir la hauteur de div

Si vous conservez le en <div>tant qu'enfant de <td>, cet extrait de jQuery définira correctement sa hauteur:

// Loop through all the div.thatSetsABackgroundWithAnIcon on your page
$('div.thatSetsABackgroundWithAnIcon').each(function(){
    var $div = $(this);

    // Set the div's height to its parent td's height
    $div.height($div.closest('td').height());
});
Tapoter
la source
Cela pourrait marcher. Permettez-moi de vous revenir quand j'ai essayé. J'ai lu sur le sujet et j'ai compris que <div> avait besoin d'une hauteur spécifiée pour pouvoir être mis à l'échelle à 100%. D'après ce que j'ai lu, il était possible de faire avec jQuery, car il peut le calculer pour moi.
2
Je n'ai pas vraiment bien travaillé et nous avons décidé d'une approche différente. Mais j'accepterai votre réponse car c'est la meilleure.
3
Hah, si seulement j'avais un dollar pour le nombre de fois que CSS m'a fait changer d'approche :)
Pat
5
Suis-je le seul à penser que "Hauteur CSS: 100% ne fonctionne que si le parent de l'élément a une hauteur explicitement définie" est une règle vraiment stupide? Le navigateur détermine quand même la hauteur de l'élément parent; il n'y a aucun moyen que vous devriez avoir à définir explicitement la hauteur de l'élément parent.
Jez
1
la solution jquery n'a fonctionné que lorsque je l'ai placée à la fin du fichier, merci
luke_mclachlan
5

Vous pouvez essayer de faire flotter votre div:

.thatSetsABackgroundWithAnIcon{

    float:left;
}

Alternativement, utilisez le bloc en ligne:

.thatSetsABackgroundWithAnIcon{

    display:inline-block;
}

Exemple de travail de la méthode de bloc en ligne:

table,
th,
td {
  border: 1px solid black;
}
<table>
  <tr>
    <td>
      <div style="border:1px solid red; height:100%; display:inline-block;">
        I want cell to be the full height
      </div>
    </td>
    <td>
      This cell
      <br/>is higher
      <br/>than the
      <br/>first one
    </td>
  </tr>
</table>

objet en colère
la source
Le flotteur: la suggestion de gauche ne semble pas fonctionner. Cette réponse pourrait être améliorée en la supprimant, puisque la deuxième solution mentionnée semble fonctionner.
Wouter
1
Ce n'est pas le cas avec Firefox. Cela ne semble fonctionner qu'avec Chrome.
YLombardi
8
Cet extrait de code ne fonctionne pas non plus sur Chromium, du moins de nos jours (j'utilise 63.0.3239.84).
Michael
0

Vraiment à faire avec JS. Voici une solution. Je n'ai pas utilisé vos noms de classe, mais j'ai appelé le div dans le nom de classe td "full-height" :-) J'ai utilisé jQuery, évidemment. Notez que cela a été appelé depuis jQuery (document) .ready (function () {setFullHeights ();}); Notez également que si vous avez des images, vous devrez d'abord les parcourir avec quelque chose comme:

function loadedFullHeights(){
var imgCount = jQuery(".full-height").find("img").length;
if(imgCount===0){
    return setFullHeights();
}
var loaded = 0;
jQuery(".full-height").find("img").load(function(){
    loaded++;
    if(loaded ===imgCount){
        setFullHeights()
    }
});

}

Et vous voudrez plutôt appeler le sharedFullHeights () de docReady. C'est en fait ce que j'ai fini par utiliser au cas où. Vous devez penser à l'avance, vous savez!

function setFullHeights(){
var par;
var height;
var $ = jQuery;
var heights=[];
var i = 0;
$(".full-height").each(function(){
    par =$(this).parent();
    height = $(par).height();
    var tPad = Number($(par).css('padding-top').replace('px',''));
    var bPad = Number($(par).css('padding-bottom').replace('px',''));
    height -= tPad+bPad;
    heights[i]=height;
    i++;
});
for(ii in heights){
    $(".full-height").eq(ii).css('height', heights[ii]+'px');
}

}

Bonnes nouvelles
la source
-1

Cette question est déjà répondue ici . Il suffit de mettre height: 100%à la fois le divet le contenant td.

Nacho Coloma
la source
-4

Modifiez l'image d'arrière-plan du <td> lui-même.

Ou appliquez du CSS au div:

.thatSetsABackgroundWithAnIcon{
    height:100%;
}
Jage
la source
comme j'écris dans le code. Le TD a déjà un ensemble d'images d'arrière-plan utilisant une classe. Cette option n'est donc pas viable. J'ai essayé de régler la hauteur du div à 100%, mais cela ne fonctionne pas. Il s'enroule simplement à la hauteur variable du <dl> contenu. Il faut donc quelque chose pour que la div "comprenne" qu'elle doit remplir la hauteur. Et la hauteur: 100% ne fait pas ça. (pas seul au moins)