Cara membuat <div> mengisi <td> tinggi


99

Saya telah melihat beberapa posting di StackOverflow, tetapi belum dapat menemukan jawaban untuk pertanyaan yang agak sederhana ini.

Saya memiliki konstruksi HTML seperti ini:

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

Yang saya butuhkan adalah untuk divmengisi tinggi td, jadi saya bisa memposisikan latar belakang div (ikon) di sudut kanan bawah td.

Bagaimana Anda menyarankan saya melakukan itu?


Jawaban:


178

Jika Anda memberi TD Anda tinggi 1px, maka div turunan akan memiliki orang tua yang ditinggikan untuk menghitung% asalnya. Karena konten Anda akan lebih besar dari 1px, td secara otomatis akan bertambah, seperti halnya div. Agak hack sampah, tapi saya yakin itu akan berhasil.


7
Meskipun tampaknya berfungsi dengan baik di webkit, IE9 benar-benar rusak.
Daniel Imms

Bekerja untuk saya di IE11 hanya jika saya juga menyetel div ke blok-inline. Terima kasih!
Danny C

5
Berikut solusi yang juga berfungsi di Firefox: stackoverflow.com/questions/36575846/…
Wouter

Untuk membuatnya berfungsi di Firefox serta di Chrome, saya harus menggunakan min-height: 1px;alih-alihheight: 1px;
Matt Leonowicz

🤯 Saya tidak yakin apakah saya suka CSS atau tidak
noob

35

Tinggi CSS: 100% hanya berfungsi jika induk elemen memiliki tinggi yang ditentukan secara eksplisit. Misalnya, ini akan berfungsi seperti yang diharapkan:

td {
    height: 200px;
}

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

Karena sepertinya Anda <td>akan menjadi tinggi variabel, bagaimana jika Anda menambahkan ikon kanan bawah dengan gambar yang benar-benar diposisikan seperti ini:

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

Dengan markup sel tabel seperti ini:

<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: menggunakan jQuery untuk mengatur ketinggian div

Jika Anda menyimpan <div>sebagai anak dari <td>, cuplikan jQuery ini akan menyetel tingginya dengan benar:

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

Itu bisa berhasil. Biarkan saya kembali kepada Anda ketika saya sudah mencoba. Saya memang membaca tentang subjek tersebut dan memahami bahwa <div> membutuhkan ketinggian tertentu agar dapat diskalakan hingga 100%. Dari apa yang saya baca itu mungkin dilakukan dengan jQuery, karena itu dapat menghitungnya untuk saya.

2
Saya tidak bekerja dengan baik, dan kami telah memutuskan pendekatan yang berbeda. Tapi saya akan menerima jawaban Anda karena itu yang terbaik.

3
Hah, seandainya saya memiliki satu dolar untuk berapa kali CSS membuat saya mengubah pendekatan saya :)
Tepuk

5
Apakah saya satu-satunya yang berpikir bahwa "CSS height: 100% hanya berfungsi jika induk elemen memiliki ketinggian yang ditentukan secara eksplisit" adalah aturan yang benar-benar bodoh? Browser tetap menentukan tinggi elemen induk; tidak mungkin Anda harus menyetel tinggi elemen induk secara eksplisit.
Jez

1
solusi jquery bekerja meskipun hanya ketika saya meletakkannya di akhir file, terima kasih
luke_mclachlan

5

Anda dapat mencoba membuat div mengambang:

.thatSetsABackgroundWithAnIcon{

    float:left;
}

Sebagai alternatif, gunakan blok-sebaris:

.thatSetsABackgroundWithAnIcon{

    display:inline-block;
}

Contoh kerja dari metode blok-sebaris:

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>


Pelampung: saran kiri sepertinya tidak berhasil. Jawaban ini dapat ditingkatkan dengan menghapusnya, karena solusi kedua yang disebutkan tampaknya berfungsi.
Wouter

1
Tidak dengan Firefox. Tampaknya hanya berfungsi dengan Chrome.
YLombardi

8
Cuplikan itu juga tidak berfungsi di Chromium, setidaknya saat ini (saya menggunakan 63.0.3239.84).
Michael

0

Benar-benar harus melakukan ini dengan JS. Inilah solusinya. Saya tidak menggunakan nama kelas Anda, tapi saya memanggil div di dalam nama kelas td "full-height" :-) Jelas digunakan jQuery. Perhatikan ini dipanggil dari jQuery (document) .ready (function () {setFullHeights ();}); Perhatikan juga jika Anda memiliki gambar, Anda harus mengulanginya terlebih dahulu dengan sesuatu seperti:

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

}

Dan Anda ingin memanggil loadFullHeights () dari docReady sebagai gantinya. Ini sebenarnya yang akhirnya saya gunakan untuk berjaga-jaga. Harus berpikir jauh ke depan lho!

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

Pertanyaan ini sudah terjawab di sini . Masukkan saja ke height: 100%dalam divdan wadahnya td.


-4

Ubah gambar latar belakang <td> itu sendiri.

Atau terapkan beberapa css ke div:

.thatSetsABackgroundWithAnIcon{
    height:100%;
}

seperti yang saya tulis di kode. TD sudah memiliki set gambar latar belakang menggunakan kelas. Jadi opsi itu tidak memungkinkan. Saya telah mencoba mengatur ketinggian div menjadi 100%, tetapi itu tidak berhasil. Ini hanya membungkus dengan tinggi variabel dari <dl> yang terkandung. Jadi sesuatu diperlukan untuk membuat div "memahami" bahwa ia harus memenuhi ketinggian. Dan tinggi: 100% tidak melakukan itu. (tidak sendiri
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.