การใช้ Position Relative / Absolute ภายใน TD?


108

ฉันมีรหัสต่อไปนี้:

<td style="position: relative; min-height: 60px; vertical-align: top;">
    Contents of table cell, variable height, could be more than 60px;

    <div style="position: absolute; bottom: 0px;">
        Notice
    </div>
</td>

สิ่งนี้ใช้ไม่ได้เลย ด้วยเหตุผลบางประการตำแหน่ง: คำสั่งสัมพัทธ์ไม่ถูกอ่านบน TD และการแจ้งเตือน DIV ถูกวางไว้นอกคอนเทนเนอร์เนื้อหาที่ด้านล่างของหน้าของฉัน ฉันได้พยายามใส่เนื้อหาทั้งหมดของ TD ลงใน DIV เช่น:

<td>
    <div style="position: relative; min-height: 60px; vertical-align: top;">
        Contents of table cell, variable height, could be more than 60px;

        <div style="position: absolute; bottom: 0px;">
            Notice
        </div>
    </div>
</td>

อย่างไรก็ตามสิ่งนี้สร้างปัญหาใหม่ เนื่องจากความสูงของเนื้อหาของเซลล์ตารางเป็นตัวแปรการแจ้งเตือน DIV จึงไม่ได้อยู่ที่ด้านล่างของเซลล์เสมอไป ถ้าเซลล์ตารางยาวเกินเครื่องหมาย 60px แต่ไม่มีเซลล์อื่นทำดังนั้นในเซลล์อื่น DIV การแจ้งเตือนจะอยู่ที่ 60px ด้านล่างแทนที่จะอยู่ที่ด้านล่าง


มีเหตุผลในการใช้ตารางหรือไม่? ฉันสมมติว่าเนื้อหาในตารางส่วนที่เหลือกำลังจะเปลี่ยนเนื้อหาของเซลล์นี้ หากจำเป็นต้องใช้ตารางคุณสามารถใช้สองแถวบนสุดโดยมี valign = บนและล่างโดยมี valign = bottom
Wayne

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

5
สำหรับปฏิทิน ... ดังนั้นตารางตารางจึงมีความสำคัญ: 8wayrun.com/events/monthly/1.2011
Jason Axelrod

คำตอบ:


189

เนื่องจากตามCSS 2.1position: relativeไม่ได้กำหนดผลกระทบขององค์ประกอบตาราง การแสดงภาพประกอบนี้position: relativeมีผลตามที่ต้องการใน Chrome 13 แต่ไม่ใช่บน Firefox 4 วิธีแก้ปัญหาของคุณที่นี่คือการเพิ่มdivเนื้อหารอบ ๆ ของคุณและใส่สิ่งposition: relativeนั้นdivแทนtd. ต่อไปนี้แสดงให้เห็นถึงผลลัพธ์ที่คุณได้รับจากposition: relative(1) ในด้านdivดี) (2) ในtd(ไม่ดี) และสุดท้าย (3) จากdivด้านในtd(ดีอีกครั้ง)

บน Firefox 4

<table>
  <tr>
    <td>
      <div style="position:relative;">
        <span style="position:absolute; left:150px;">
          Absolute span
        </span>
        Relative div
      </div>
    </td>
  </tr>
</table>


29
ความสูงของ div จะไม่เป็น 100% ดังนั้นการวางตำแหน่งสัมพัทธ์กับด้านล่าง: 0 จึงไม่มีผล
Softlion

1
โปรดทราบว่า "ช่วงค่าสัมบูรณ์" ในตัวอย่างนี้จะไม่ส่งผลต่อความสูง td ซึ่งโดยพื้นฐานแล้วทำให้การใช้ตารางไร้ประโยชน์
Dror

@Softlion: วิธีการห่อเนื้อหาทั้งหมดtdภายใน a divตั้งค่าwidth: 100%และheight: 100%ใช้ช่องว่างภายในจาก td เป็น div แล้วตั้งค่าเป็นrelativeอย่างไร แนวคิดคือการสร้างเลเยอร์ที่มีบาง ๆ อยู่เหนือtdซึ่งทำหน้าที่เหมือนtdตัวมันเอง แต่เป็นไฟล์div. มันได้ผลสำหรับฉัน
CamilB

1
ลิงก์สำหรับซอร์ส HTML ไม่ทำงาน คุณช่วยอัปเดต / รีเฟรชได้ไหม
Peter VARGA

1
สำหรับผู้ที่พบคำตอบนี้ในปี 2019 หรือใหม่กว่า: แม้ว่า CSS2.1 จะบอกว่าผลกระทบของposition:relativeชิ้นส่วนตารางภายในนั้นไม่ได้กำหนดไว้ แต่ก็หมายถึงพฤติกรรมของชิ้นส่วนตารางเอง (ตัวอย่างเช่นไม่ชัดเจนว่าขอบเขตของtdพฤติกรรมควรเป็นอย่างไร หากมีการเลื่อนผ่านposition:relativeในกรณีของborder-collapse:collapse) มันไม่ได้แยกพวกเขาออกจากบล็อกที่เป็นไปได้ของผู้สืบทอดตำแหน่งที่แน่นอน ดังนั้นพฤติกรรมของ Firefox จึงกลายเป็นเพียงข้อบกพร่องซึ่งได้รับการแก้ไขในปี 2014
Ilya Streltsyn

5

เคล็ดลับนี้ก็เหมาะสมเช่นกัน แต่ในกรณีนี้คุณสมบัติการจัดตำแหน่ง (กลางล่าง ฯลฯ ) จะไม่ทำงาน

<td style="display: block; position: relative;">
</td>


1

ในความพยายามครั้งที่สองของคุณคุณลองใช้แนวตั้งหรือไม่? ทั้ง

<td valign="bottom">

หรือด้วย css

vertical-align:bottom

มันจะไม่ได้ผล ... ถ้าฉันทำอย่างนั้นเนื้อหาของเซลล์ตารางจะเว้นระยะ 60px จากด้านล่าง แทนที่จะอยู่ด้านบน
Jason Axelrod

-2

ยังใช้งานได้ถ้าคุณทำ "display: block;" บน td ทำลายเอกลักษณ์ td แต่ได้ผล!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.