Firefox có hỗ trợ vị trí: tương đối trên các thành phần bảng không?


169

Khi tôi cố gắng sử dụng position: relative/ position: absolutetrên một <th>hoặc <td>trong Firefox, nó dường như không hoạt động.


3
Không, tôi nghĩ rằng không có trình duyệt hỗ trợ điều đó đúng. Nó không hợp pháp trong bất kỳ tiêu chuẩn HTML nào AFAIK
Pekka

2
@Pekka: HTML không đi vào nó, đây là CSS. Và thật đáng kinh ngạc, nó hoạt động. :-)
TJ Crowder

15
Hoạt động trong WebKit và IE theo như tôi có thể nói. Firefox dường như là người duy nhất không thích nó trên các ô của bảng. Và vâng, tôi đang cố gắng định vị các yếu tố bên trong <td> mà không phải phụ thuộc vào phao.
Ben Johnson

2
Một lần nữa, hãy nhìn vào câu trả lời của Justin. Nó hoạt động tốt trong Firefox nếu bạn nói với Firefox rằng bạn đang coi nó như một khối chứ không phải là một phần tử bảng.
TJ Crowder

1
Một jsfiddle thể hiện vấn đề trong câu hỏi này: jsfiddle.net/M5P93 Hoạt động trong IE, Safari, Chrome; Firefox thất bại.
Chris Moschini

Câu trả lời:


167

Cách dễ dàng và đúng đắn nhất sẽ là bọc nội dung của ô trong một div và thêm vị trí: liên quan đến div đó.

thí dụ:

<td>
  <div style="position:relative">
      This will be positioned normally
      <div style="position:absolute; top:5px; left:5px;">
           This will be positioned at 5,5 relative to the cell
      </div>
  </div>
</td>

11
+1 Đây là giải pháp duy nhất hiệu quả với tôi. Sử dụng tr {display:block}hoàn toàn làm hỏng bố cục.
Wesley Murch

+1 Đây là câu trả lời cho tôi. display: blockkhông đủ sửa chữa trên bố trí bảng phức tạp. Các div thêm là giải pháp đáng tin cậy hơn.
DA.

5
nhưng, với giải pháp này "chiều rộng" và "chiều cao" vẫn không thể được sử dụng
4esn0k

@ 4esn0k bạn đã tìm thấy một giải pháp mà bạn có thể sử dụng chiều rộng và chiều cao?
Neil

9
Thật không may, giải pháp của bạn không hoạt động nếu bạn thêm một cột khác có nhiều nội dung trong đó hơn cột khác. Vì vậy, tôi không hiểu cờ "câu trả lời được chấp nhận" và sự đánh giá cao được đưa ra từ các phiếu bầu. Vui lòng kiểm tra jsfiddle.net/ukR3q
ngày

35

Điều đó sẽ không có vấn đề gì. Nhớ cũng đặt:

display: block;

32
Nhược điểm của cài đặt hiển thị: khối dường như thực sự có thể gây rối với định dạng bảng nếu nó được áp dụng trực tiếp vào phần tử. Bởi vì nó thay đổi nó từ tế bào bảng ... hay tôi điên?
Ben Johnson

3
@Ben: Vâng, vâng. positionTheo định nghĩa, việc đặt trên một ô của bảng là thay đổi nghiêm trọng định dạng bảng. Bạn lấy khối của tế bào ra khỏi dòng chảy (ngoại trừ position: relative, nơi nó nằm trong luồng nhưng bù lại từ nó).
TJ Crowder

2
@Ben - Không, không điên. Bạn chắc chắn sẽ phải làm thêm một số công việc để có được mọi thứ theo cách bạn muốn. Vấn đề chỉ là nó có thể.
Justin Niessner

1
@TJ Không thêm vị trí: tương đối thay đổi giao diện trực quan, nó thay đổi th / td từ ô bảng sang khối. Một lần nữa, rất vui khi biết rằng nó hoạt động, nhưng trong rất nhiều trường hợp, việc tạo các phần tử mức khối sẽ thực sự gây rối với định dạng bảng. Cảm ơn Justin!
Ben Johnson

9
than ôi, display: blockcũng có thể gây ra sự cố trong Firefox - cụ thể là nếu ô bảng đang kéo dài các cột, đặt nó thành khối sẽ thu gọn ô xuống cột đầu tiên.
DA.

13

Vì mọi trình duyệt web bao gồm Internet Explorer 7, 8 và 9 xử lý chính xác vị trí: tương đối trên một yếu tố hiển thị bảng và chỉ FireFox xử lý không chính xác, nên cách tốt nhất của bạn là sử dụng shim JavaScript. Bạn không cần phải sắp xếp lại DOM của mình chỉ vì một trình duyệt bị lỗi. Mọi người sử dụng JavaScript che chắn mọi lúc khi IE gặp lỗi và tất cả các trình duyệt khác đều đúng.

Dưới đây là một jsfiddle hoàn toàn có chú thích với tất cả các HTML, CSS và JavaScript được giải thích.

http://jsfiddle.net/mrbinky3000/MfWuV/33/

Ví dụ jsfiddle của tôi ở trên sử dụng các kỹ thuật "Responsive Web Design" chỉ để cho thấy rằng nó sẽ hoạt động với bố cục đáp ứng. Tuy nhiên, mã của bạn không cần phải phản hồi.

Dưới đây là JavaScript bên dưới, nhưng nó sẽ không có ý nghĩa nhiều trong bối cảnh. Vui lòng kiểm tra liên kết jsfiddle ở trên.

$(function() {
    // FireFox Shim
    // FireFox is the *only* browser that doesn't support position:relative for
    // block elements with display set to "table-cell." Use javascript to add
    // an inner div to that block and set the width and height via script.
    if ($.browser.mozilla) {

        // wrap the insides of the "table cell"            
        $('#test').wrapInner('<div class="ffpad"></div>');

        function ffpad() {
            var $ffpad = $('.ffpad'),
                $parent = $('.ffpad').parent(),
                w, h;

            // remove any height that we gave ffpad so the browser can adjust size naturally.
            $ffpad.height(0);

            // Only do stuff if the immediate parent has a display of "table-cell".  We do this to
            // play nicely with responsive design.
            if ($parent.css('display') == 'table-cell') {               

                // include any padding, border, margin of the parent
                h = $parent.outerHeight();

                // set the height of our ffpad div
                $ffpad.height(h);

            }

        }


        // be nice to fluid / responsive designs   
        $(window).on('resize', function() {
            ffpad();
        });

        // called only on first page load
        ffpad();

    }

});

$ .browser đã bị xóa trong jQuery 1.9
Matus

Vâng. để thay thế bằng phương pháp phát hiện trình duyệt yêu thích của bạn.
mrbinky3000

1
Trình duyệt không bị lỗi. Các đặc điểm kỹ thuật nói rằng hiệu ứng là không xác định.
WGH

4
@WGH Không làm cho giải pháp ít đúng hơn. Cảm ơn các downvote.
mrbinky3000

1
Này, tôi vừa tạo một polyfill từ cam kết của bạn, nhìn vào nó! :) github.com/Grawl/gecko-table-poseition-polyfill
Đã được xác nhận vào

11

Bắt đầu với Firefox 30, bạn sẽ có thể sử dụng positiontrên các thành phần bảng. Bạn có thể tự mình thử với bản dựng hàng đêm hiện tại (hoạt động dưới dạng độc lập): http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/

Trường hợp thử nghiệm ( http://jsfiddle.net/acbabis/hpWZk/ ):

<table>
    <tbody>
        <tr>
            <td style="width: 100px; height: 100px; background-color: red; position: relative">
                <div style="width: 10px; height: 10px; background-color: green; position: absolute; top: 10px; right: 10px"></div>
            </td>
        </tr>
    </tbody>
<table>

Bạn có thể tiếp tục theo thảo luận của nhà phát triển trong những thay đổi ở đây (chủ đề là 13 năm tuổi): https://bugzilla.mozilla.org/show_bug.cgi?id=63895

Đánh giá theo lịch sử phát hành gần đây , điều này có thể có sẵn ngay sau tháng 5 năm 2014. Tôi hầu như không thể kiềm chế sự phấn khích của mình!

EDIT (6/10/14): Firefox 30 đã được phát hành ngày hôm nay. Ngay sau đó, định vị bảng sẽ không là vấn đề trong các trình duyệt máy tính để bàn chính


7

Kể từ Firefox 3.6.13, vị trí: tương đối / tuyệt đối dường như không hoạt động trên các phần tử bảng. Điều này dường như là hành vi lâu dài của Firefox. Xem như sau: http://csscreator.com/node/31771

Liên kết CSS Creator đăng tham chiếu W3C sau:

Tác động của 'vị trí: tương đối' đối với nhóm bảng hàng, nhóm tiêu đề bảng, nhóm chân trang, nhóm hàng, bảng cột, nhóm bảng, cột bảng, ô bảng và các yếu tố chú thích bảng không định nghĩa được. http://www.w3.org/TR/CSS21/visuren.html#poseitioning-scheme


Xem câu trả lời của Justin. Nó hoạt động, miễn là bạn thay đổi displaycài đặt. Điều này có ý nghĩa (với mức độ CSS có ý nghĩa).
TJ Crowder

8
Vâng, nó "hoạt động" ngoại trừ việc áp dụng nó cho các tế bào phá hủy hoàn toàn bảng của bạn ... Trong trường hợp đó là vô nghĩa.
Simon East

3

Hãy thử sử dụng display:inline-blocknó hoạt động với tôi trong Firefox 11 cho tôi khả năng định vị trong td / th mà không phá hủy bố cục của bảng. Điều đó kết hợp với position:relativetrên một td / th nên làm cho mọi thứ hoạt động. Chỉ cần nó làm việc bản thân mình.


1

Tôi đã có một table-cellyếu tố (mà thực sự DIVkhông phải là một TD)

tôi đã thay thế

display: table-cell;
position: relative;
left: .5em

(đã hoạt động trong Chrome) với

display: table-cell;
padding-left: .5em

Tất nhiên phần đệm thường được thêm vào chiều rộng trong mô hình hộp - nhưng các bảng dường như luôn có ý nghĩ của riêng chúng khi nói đến độ rộng tuyệt đối - vì vậy điều này sẽ hoạt động trong một số trường hợp.


0

Thêm hiển thị: khối cho phần tử cha đã làm việc này trong firefox. Tôi cũng đã phải thêm top: 0px; trái: 0px; thành phần chính để Chrome hoạt động. IE7, IE8, & IE9 cũng đang hoạt động.

<td style="position:relative; top:0px; left:0px; display:block;">
    <table>        
        // A table of information here. 
        // Next line is the child element I want to overlay on top of this table
    <tr><td style="position:absolute; top:5px; left:100px;">
        //child element info
    </td></tr>
   </table>
</td>

0

Loại giải pháp được chấp nhận, nhưng không phải nếu bạn thêm một cột khác có nhiều nội dung trong đó hơn là một cột khác. Nếu bạn thêm height:100%vào tr , td & div thì nó sẽ hoạt động.

<tr style="height:100%">
  <td style="height:100%">
    <div style="position:relative; height:100%">
        This will be positioned normally
        <div style="position:absolute; top:5px; left:5px;">
             This will be positioned at 5,5 relative to the cell
        </div>
    </div>
  </td>
</tr>

Vấn đề duy nhất là điều này chỉ khắc phục vấn đề chiều cao cột trong FF, không phải trong Chrome và IE. Vì vậy, đó là một bước gần hơn, nhưng không hoàn hảo.

Tôi đã cập nhật một câu đố từ Jan không hoạt động với câu trả lời được chấp nhận để cho thấy nó hoạt động. http://jsfiddle.net/gvcLoz20/

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.