Sử dụng Vị trí Tương đối / Tuyệt đối trong TD?


108

Tôi có mã sau:

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

Điều này không hoạt động ở tất cả. Vì một số lý do, lệnh position: relative không được đọc trên TD và thông báo DIV đang được đặt bên ngoài vùng chứa nội dung ở cuối trang của tôi. Tôi đã cố gắng đưa tất cả nội dung của TD vào DIV như:

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

Tuy nhiên, điều này tạo ra một vấn đề mới. Vì chiều cao của nội dung của ô trong bảng có thể thay đổi, thông báo DIV không phải lúc nào cũng ở cuối ô. Nếu một ô trong bảng vượt ra ngoài điểm đánh dấu 60px, nhưng không có ô nào khác làm như vậy, thì trong các ô khác, thông báo DIV ở dưới 60px, thay vì ở dưới cùng.


Có một lý do để sử dụng bảng? Tôi giả sử phần còn lại của mục lục sẽ thay đổi nội dung của ô này. Nếu bảng là cần thiết bạn có thể sử dụng hai hàng trên cùng với valign = top và bottom với valign = bottom
Wayne

Nếu bạn đang sử dụng bảng cho mục đích bố trí, tôi khuyên bạn không nên làm điều đó. Sử dụng bảng để hiển thị dữ liệu là tốt, nhưng chúng không tốt nhất cho bố cục.
Kyle

5
Nó cho một lịch ... do đó, một lưới bảng là điều cần thiết: 8wayrun.com/events/monthly/1.2011
Jason Axelrod

Câu trả lời:


189

Điều này là do theo CSS 2.1 , ảnh hưởng của position: relativecác phần tử bảng là không xác định. Minh họa cho điều này, position: relativecó hiệu quả mong muốn trên Chrome 13, nhưng không phải trên Firefox 4. Giải pháp của bạn ở đây là thêm một divnội dung xung quanh và đặt nội dung position: relativeđó divthay vì td. Phần sau minh họa kết quả bạn nhận được với position: relative(1) ở mặt divtốt), (2) về mặt trái td(không tốt) và cuối cùng là (3) về mặt divtrong td(lại tốt).

Trên 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
Chiều cao của div sẽ không là 100%, vì vậy vị trí tương đối so với dưới cùng: 0 không có tác dụng.
Softlion

1
Lưu ý rằng "Khoảng tuyệt đối" trong ví dụ này sẽ không ảnh hưởng đến chiều cao td, điều này về cơ bản làm cho việc sử dụng bảng trở nên vô ích.
Dror

@Softlion: Làm thế nào về việc gói toàn bộ nội dung tdbên trong a div, đặt thành width: 100%height: 100%, áp dụng bất kỳ phần đệm nào từ td đến div và đặt nó thành relative? Ý tưởng là tạo ra một lớp chứa mỏng ngay phía trên td, hoạt động giống như tdchính nó, nhưng nó là một div. Nó đã làm việc cho tôi.
CamilB

1
Liên kết cho nguồn HTML đã chết. Bạn có thể cập nhật / làm mới nó không?
Peter VARGA

1
Đối với những người tìm thấy câu trả lời này vào năm 2019 hoặc mới hơn: mặc dù CSS2.1 thực sự nói rằng tác động của position:relativecác phần bên trong bảng là không xác định, nhưng nó có nghĩa là hành vi của chính các phần của bảng (ví dụ: không rõ các đường viền của các phần này sẽ tdhoạt động như thế nào nếu nó được chuyển qua position:relativetrong trường hợp của border-collapse:collapse). Nó không loại trừ chúng khỏi có thể chứa các khối hậu duệ được định vị tuyệt đối. Vì vậy, hành vi của Firefox hóa ra là chỉ là một lỗi, được cố định trong năm 2014.
Ilya Streltsyn

5

Thủ thuật này cũng phù hợp, nhưng trong trường hợp này các thuộc tính căn chỉnh (giữa, dưới cùng, v.v.) sẽ không hoạt động.

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

2

Nội dung của ô bảng, chiều cao có thể thay đổi, có thể lớn hơn 60px;

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


1

Về lần thử thứ hai, bạn đã thử sử dụng căn chỉnh dọc chưa? Hoặc

<td valign="bottom">

hoặc với css

vertical-align:bottom

Điều đó sẽ không hoạt động ... nếu tôi đã làm điều đó, thì nội dung của ô bảng sẽ được cách xa 60px từ dưới cùng; thay vì ở trên cùng.
Jason Axelrod

-2

cũng hoạt động nếu bạn thực hiện một "display: block;" trên td, phá hủy danh tính td, nhưng hoạt động!

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.