Cách tạo <div> lấp đầy <td> chiều cao


99

Tôi đã xem qua một số bài đăng trên StackOverflow, nhưng không thể tìm thấy câu trả lời cho câu hỏi khá đơn giản này.

Tôi có một cấu trúc HTML như thế này:

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

Những gì tôi cần là divđiền vào chiều cao của td, vì vậy tôi có thể định vị nền của div (biểu tượng) ở góc dưới cùng bên phải của td.

Làm thế nào để bạn đề nghị tôi đi về điều đó?


Câu trả lời:


175

Nếu bạn cung cấp chiều cao TD của mình là 1px, thì div con sẽ có cha mẹ có chiều cao để tính% từ đó. Bởi vì nội dung của bạn sẽ lớn hơn 1px, td sẽ tự động phát triển, cũng như div. Kinda là một hack rác, nhưng tôi cá là nó sẽ hoạt động.


7
Mặc dù nó có vẻ hoạt động tốt trong webkit, nhưng IE9 hoàn toàn bị hỏng.
Daniel Imms, 12/12/12

Chỉ làm việc cho tôi trong IE11 khi tôi cũng đặt div thành khối nội tuyến. Cảm ơn!
Danny C

5
Đây là một giải pháp cũng hoạt động trong Firefox: stackoverflow.com/questions/36575846/…
Wouter

Để làm cho nó hoạt động trong Firefox cũng như trong Chrome tôi đã phải sử dụng min-height: 1px;thay vìheight: 1px;
Matt Leonowicz

🤯 Tôi không chắc mình thích CSS hay ghét nó
noob

35

Chiều cao CSS: 100% chỉ hoạt động nếu phần tử gốc có chiều cao được xác định rõ ràng. Ví dụ: điều này sẽ hoạt động như mong đợi:

td {
    height: 200px;
}

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

Vì có vẻ như <td>chiều cao của bạn sẽ thay đổi, điều gì sẽ xảy ra nếu bạn thêm biểu tượng dưới cùng bên phải với một hình ảnh được định vị hoàn toàn như vậy:

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

Với đánh dấu ô trong bảng như vậy:

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

Chỉnh sửa: sử dụng jQuery để đặt chiều cao của div

Nếu bạn giữ đoạn mã <div>là con của <td>đoạn mã này, đoạn mã jQuery này sẽ đặt đúng chiều cao của nó:

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

Điều đó có thể hoạt động. Hãy để tôi quay lại với bạn khi tôi đã cố gắng. Tôi đã đọc về chủ đề này và hiểu rằng <div> cần độ cao được chỉ định để có thể mở rộng thành 100%. Từ những gì tôi đọc được, mặc dù có thể làm với jQuery, vì nó có thể tính toán cho tôi.

2
Tôi đã không thực sự làm việc tốt và chúng tôi đã quyết định cách tiếp cận khác nhau. Nhưng tôi sẽ chấp nhận câu trả lời của bạn vì đó là câu trả lời tốt nhất.

3
Hah, giá mà tôi có một đô la cho số lần CSS đã khiến tôi thay đổi cách tiếp cận của mình :)
Pat

5
Tôi có phải là người duy nhất nghĩ rằng "Chiều cao CSS: 100% chỉ hoạt động nếu phần tử gốc có chiều cao được xác định rõ ràng" là một quy tắc thực sự ngu ngốc không? Trình duyệt vẫn xác định chiều cao của phần tử mẹ; không có cách nào bạn phải đặt chiều cao của phần tử mẹ một cách rõ ràng.
Jez

1
giải pháp jquery làm việc dù chỉ khi tôi đặt nó ở phần cuối của tập tin, nhờ
luke_mclachlan

5

Bạn có thể thử tạo div float:

.thatSetsABackgroundWithAnIcon{

    float:left;
}

Ngoài ra, hãy sử dụng khối nội tuyến:

.thatSetsABackgroundWithAnIcon{

    display:inline-block;
}

Ví dụ làm việc của phương pháp khối nội tuyến:

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>


Đề xuất float: left dường như không hoạt động. Câu trả lời này có thể được cải thiện bằng cách loại bỏ nó, vì giải pháp thứ hai được đề cập dường như hoạt động.
Wouter

1
Nó không có với Firefox. Nó dường như chỉ hoạt động với Chrome.
YLombardi

8
Đoạn mã đó cũng không hoạt động trên Chromium, ít nhất là hiện nay (tôi đang sử dụng 63.0.3239.84).
Michael

0

Thực sự phải làm điều này với JS. Đây là một giải pháp. Tôi không sử dụng tên lớp của bạn, nhưng tôi đã gọi div trong tên lớp td là "full-height" :-) Rõ ràng là đã sử dụng jQuery. Lưu ý rằng điều này được gọi từ jQuery (document) .ready (function () {setFullHeights ();}); Cũng lưu ý rằng nếu bạn có hình ảnh, bạn sẽ phải lặp lại chúng trước tiên với những thứ như:

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

}

Và thay vào đó, bạn sẽ muốn gọi loadFullHeights () từ docReady. Đây thực sự là những gì tôi đã sử dụng để đề phòng. Phải suy nghĩ trước bạn biết không!

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

Câu hỏi này đã được trả lời ở đây . Chỉ cần đặt height: 100%cả hộp divvà hộp đựng td.


-4

Sửa đổi hình nền của chính <td>.

Hoặc áp dụng một số css cho div:

.thatSetsABackgroundWithAnIcon{
    height:100%;
}

như tôi viết trong mã. TD đã có bộ ảnh nền sử dụng một lớp. Vì vậy, lựa chọn đó là không khả thi. Tôi đã thử đặt chiều cao của div thành 100%, nhưng điều đó không hoạt động. Nó chỉ đơn giản là kết thúc với chiều cao thay đổi của <dl> được chứa. Vì vậy, một cái gì đó là cần thiết để làm cho div "hiểu" rằng nó nên lấp đầy chiều cao. Và chiều cao: 100% không làm điều đó. (không đơn độc ít nhất)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.