วิธีสร้าง <div> เติม <td> ความสูง


106

ฉันได้ดูโพสต์ต่างๆใน StackOverflow แล้ว แต่ไม่สามารถหาคำตอบสำหรับคำถามที่ค่อนข้างง่ายนี้ได้

ฉันมีโครงสร้าง HTML ดังนี้:

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

สิ่งที่ฉันต้องการคือdivเพื่อเติมเต็มความสูงของtdดังนั้นฉันจึงสามารถจัดตำแหน่งพื้นหลังของ div (ไอคอน) ที่มุมล่างขวาของไฟล์td.

คุณจะแนะนำให้ฉันทำอย่างไร


ที่เกี่ยวข้อง: stackoverflow.com/questions/8344850/…
Chris Moschini

คำตอบ:


190

ถ้าคุณให้ TD ของคุณมีความสูง 1px div ลูกจะมีพาเรนต์ที่มีความสูงเพื่อคำนวณเป็น% เนื่องจากเนื้อหาของคุณจะมีขนาดใหญ่กว่า 1px td จะเติบโตโดยอัตโนมัติเช่นเดียวกับ div เป็นการแฮ็กขยะ แต่ฉันพนันได้เลยว่ามันจะได้ผล


7
แม้ว่าดูเหมือนว่าจะทำงานได้ดีใน webkit แต่ IE9 ก็หยุดทำงานโดยสิ้นเชิง
Daniel Imms

ทำงานให้ฉันใน IE11 เฉพาะเมื่อฉันตั้งค่า div เป็น inline-block ขอบคุณ!
Danny C

7
นี่เป็นวิธีแก้ปัญหาที่ใช้ได้กับ Firefox: stackoverflow.com/questions/36575846/…
Wouter

เพื่อให้ใช้งานได้ใน Firefox และใน Chrome ฉันต้องใช้min-height: 1px;แทนheight: 1px;
Matt Leonowicz

🤯ไม่แน่ใจว่าชอบ CSS หรือเกลียด
noob

37

ความสูง CSS: 100% จะใช้ได้เฉพาะเมื่อองค์ประกอบหลักมีความสูงที่กำหนดไว้อย่างชัดเจน ตัวอย่างเช่นสิ่งนี้จะได้ผลตามที่คาดไว้:

td {
    height: 200px;
}

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

เนื่องจากดูเหมือนว่าคุณ<td>จะมีความสูงไม่เท่ากันจะเกิดอะไรขึ้นถ้าคุณเพิ่มไอคอนด้านล่างขวาด้วยรูปภาพที่อยู่ในตำแหน่งที่แน่นอนดังนี้:

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

ด้วยมาร์กอัปเซลล์ตารางดังนี้:

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

แก้ไข: ใช้ jQuery เพื่อกำหนดความสูงของ div

หากคุณยังคง<div>เป็นเด็ก<td>ของ jQuery ตัวอย่างนี้จะกำหนดความสูงได้อย่างเหมาะสม:

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

ที่สามารถทำงานได้ ให้ฉันติดต่อกลับเมื่อฉันพยายามแล้ว ฉันอ่านหัวข้อนี้แล้วและเข้าใจว่า <div> ต้องการความสูงที่กำหนดเพื่อให้สามารถปรับขนาดได้ถึง 100% จากสิ่งที่ฉันอ่านนั่นเป็นไปได้ที่จะทำกับ jQuery เนื่องจากมันสามารถคำนวณให้ฉันได้

2
ฉันไม่ได้ทำงานได้ดีทั้งหมดและเราได้ตัดสินใจเลือกแนวทางที่แตกต่างออกไป แต่ฉันจะยอมรับคำตอบของคุณเพราะเป็นคำตอบที่ดีที่สุด

3
ฮ่า ๆ ถ้าเพียงแค่ฉันมีเงินดอลลาร์สำหรับจำนวนครั้งที่ CSS ทำให้ฉันเปลี่ยนแนวทางของฉัน :)

5
ฉันเป็นคนเดียวหรือเปล่าที่คิดว่า "CSS height: 100% จะใช้ได้ก็ต่อเมื่อองค์ประกอบหลักขององค์ประกอบมีความสูงที่กำหนดไว้อย่างชัดเจน" เป็นกฎที่โง่มากหรือ เบราว์เซอร์จะกำหนดความสูงขององค์ประกอบหลักอยู่ดี ไม่มีทางที่คุณจะต้องกำหนดความสูงขององค์ประกอบหลักอย่างชัดเจน
Jez

1
โซลูชัน jquery ใช้งานได้เฉพาะเมื่อฉันวางไว้ที่ส่วนท้ายของไฟล์ขอบคุณ
luke_mclachlan

4

คุณสามารถลองสร้าง div float ของคุณ:

.thatSetsABackgroundWithAnIcon{

    float:left;
}

อีกทางเลือกหนึ่งให้ใช้อินไลน์บล็อก:

.thatSetsABackgroundWithAnIcon{

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


ข้อเสนอแนะด้านซ้ายดูเหมือนจะไม่ได้ผล คำตอบนี้สามารถปรับปรุงได้โดยการลบออกเนื่องจากโซลูชันที่สองที่กล่าวถึงดูเหมือนจะใช้งานได้
Wouter

1
ไม่ใช้กับ Firefox ดูเหมือนว่าจะใช้ได้กับ Chrome เท่านั้น
YLombardi

8
ตัวอย่างข้อมูลนั้นใช้ไม่ได้กับ Chromium อย่างน้อยในปัจจุบัน (ฉันใช้ 63.0.3239.84)
Michael

0

ต้องทำแบบนี้กับ JS จริงๆ นี่คือวิธีแก้ปัญหา ฉันไม่ได้ใช้ชื่อชั้นเรียนของคุณ แต่ฉันเรียก div ภายในชื่อคลาส td ของ "full-height" :-) ใช้ jQuery ชัด ๆ โปรดทราบว่าสิ่งนี้ถูกเรียกจาก jQuery (document) .ready (function () {setFullHeights ();}); นอกจากนี้โปรดทราบว่าคุณมีภาพหรือไม่คุณจะต้องวนซ้ำก่อนด้วยสิ่งต่างๆเช่น:

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

}

และคุณต้องการเรียก loadedFullHeights () จาก docReady แทน นี่คือสิ่งที่ฉันใช้ในกรณีนี้ ต้องคิดล่วงหน้ารู้!

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

}



-4

แก้ไขภาพพื้นหลังของ <td> เอง

หรือใช้ css กับ div:

.thatSetsABackgroundWithAnIcon{
    height:100%;
}

ขณะที่เขียนโค้ด TD มีชุดภาพพื้นหลังโดยใช้คลาสแล้ว ดังนั้นตัวเลือกนั้นจึงไม่สามารถทำงานได้ ฉันได้ลองตั้งค่าความสูงของ div เป็น 100% แล้ว แต่ไม่ได้ผล มันแค่พันกับความสูงตัวแปรของ <dl> ที่มีอยู่ จึงจำเป็นต้องมีบางอย่างเพื่อให้ div "เข้าใจ" ว่าควรเติมความสูง และความสูง: 100% ไม่ทำเช่นนั้น (ไม่ได้อยู่คนเดียวอย่างน้อย)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.