Come fare in modo che <div> riempia <td> l'altezza


99

Ho esaminato diversi post su StackOverflow, ma non sono riuscito a trovare una risposta a questa domanda piuttosto semplice.

Ho un costrutto HTML come questo:

<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>

Quello di cui ho bisogno è divche riempia l'altezza del td, così posso essere in grado di posizionare lo sfondo del div (l'icona) nell'angolo in basso a destra del td.

Come mi suggerisci di farlo?


Risposte:


177

Se dai al tuo TD un'altezza di 1px, il div figlio avrebbe un genitore alto da cui calcolare la sua%. Poiché i tuoi contenuti sarebbero più grandi di 1px, il td crescerebbe automaticamente, così come il div. Una specie di spazzatura, ma scommetto che funzionerebbe.


7
Anche se sembra funzionare bene nel webkit, IE9 si rompe completamente.
Daniel Imms

Funziona per me in IE11 solo quando imposto anche div su inline-block. Grazie!
Danny C

5
Ecco una soluzione che funziona anche in Firefox: stackoverflow.com/questions/36575846/…
Wouter

Per farlo funzionare sia in Firefox che in Chrome ho dovuto usare al min-height: 1px;posto diheight: 1px;
Matt Leonowicz

🤯 Non sono sicuro se mi piacciono i CSS o lo odio
noob

35

Altezza CSS: 100% funziona solo se il genitore dell'elemento ha un'altezza definita esplicitamente. Ad esempio, questo funzionerebbe come previsto:

td {
    height: 200px;
}

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

Dato che sembra che la tua <td>altezza sarà variabile, cosa succede se hai aggiunto l'icona in basso a destra con un'immagine posizionata in modo assoluto in questo modo:

.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;
}

Con il markup delle celle della tabella in questo modo:

<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>

Modifica: utilizzo di jQuery per impostare l'altezza del div

Se mantieni il <div>come figlio di <td>, questo snippet di jQuery imposterà correttamente la sua altezza:

// 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());
});

Potrebbe funzionare. Lasciami tornare da te quando ci ho provato. Mi sono documentato sull'argomento e ho capito che <div> necessita di un'altezza specificata per poter scalare al 100%. Da quello che ho letto è stato possibile fare con jQuery, dato che può calcolarlo per me.

2
Non ho lavorato molto bene e abbiamo deciso un approccio diverso. Ma accetterò la tua risposta poiché è la migliore in circolazione.

3
Hah, se solo avessi un dollaro per il numero di volte in cui CSS mi ha fatto cambiare approccio :)
Pat

5
Sono l'unico a pensare che "CSS height: 100% funziona solo se il genitore dell'elemento ha un'altezza esplicitamente definita" sia una regola davvero stupida? Il browser determina comunque l'altezza dell'elemento genitore; non c'è modo di dover impostare esplicitamente l'altezza dell'elemento genitore.
Jez

1
la soluzione jquery ha funzionato solo quando l'ho posizionata alla fine del file, grazie
luke_mclachlan

5

Potresti provare a far fluttuare il tuo div:

.thatSetsABackgroundWithAnIcon{

    float:left;
}

In alternativa, usa il blocco in linea:

.thatSetsABackgroundWithAnIcon{

    display:inline-block;
}

Esempio di lavoro del metodo inline-block:

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>


Il galleggiante: il suggerimento di sinistra non sembra funzionare. Questa risposta potrebbe essere migliorata rimuovendola, poiché la seconda soluzione citata sembra funzionare.
Wouter

1
Non con Firefox. Sembra funzionare solo con Chrome.
YLombardi

8
Quel frammento non funziona nemmeno su Chromium, almeno al giorno d'oggi (sto usando 63.0.3239.84).
Michael

0

Devo davvero farlo con JS. Ecco una soluzione. Non ho usato i nomi delle tue classi, ma ho chiamato il div all'interno del nome della classe td di "full-height" :-) Ho usato jQuery, ovviamente. Nota che questo è stato chiamato da jQuery (document) .ready (function () {setFullHeights ();}); Nota anche se hai immagini, dovrai prima iterarle attraverso qualcosa come:

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()
    }
});

}

E vorresti invece chiamare il loadFullHeights () da docReady. Questo è in realtà quello che ho finito per usare per ogni evenienza. Devi pensare in anticipo, sai!

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');
}

}


-1

Questa domanda ha già una risposta qui . Basta inserire height: 100%sia il divche il contenitore td.


-4

Modifica l'immagine di sfondo del <td> stesso.

Oppure applica un css al div:

.thatSetsABackgroundWithAnIcon{
    height:100%;
}

mentre scrivo nel codice. Il TD ha già un'immagine di sfondo impostata utilizzando una classe. Quindi questa opzione non è praticabile. Ho provato a impostare l'altezza del div al 100%, ma non funziona. Si avvolge semplicemente all'altezza variabile del <dl> contenuto. Quindi è necessario qualcosa per far "capire" al div che dovrebbe riempire l'altezza. E l'altezza: il 100% non lo fa. (non solo almeno)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.