Firefox รองรับตำแหน่ง: สัมพันธ์กับองค์ประกอบตารางหรือไม่


169

เมื่อฉันพยายามใช้position: relative/ position: absoluteบน<th>หรือ<td>ใน Firefox ดูเหมือนว่าจะไม่ทำงาน


3
ไม่ฉันคิดว่าไม่มีเบราว์เซอร์รองรับที่เหมาะสม มันไม่ถูกกฎหมายใน AFAIK มาตรฐาน HTML ใด ๆ
Pekka

2
@Pekka: HTML ไม่เข้ามานี่คือ CSS และมันใช้งานได้อย่างน่าอัศจรรย์ :-)
TJ Crowder

15
ทำงานได้ใน WebKit และ IE เท่าที่ฉันจะบอกได้ Firefox ดูเหมือนจะเป็นคนเดียวที่ไม่ชอบในเซลล์ตาราง และใช่ฉันพยายามวางองค์ประกอบภายใน <td> โดยไม่ต้องพึ่งพาลอย
Ben Johnson

2
ดูคำตอบของจัสตินอีกครั้ง มันใช้งานได้ดีใน Firefox ถ้าคุณบอก Firefox ว่าคุณใช้มันเป็นบล็อกแทนที่จะเป็นองค์ประกอบตาราง
TJ Crowder

1
jsfiddle แสดงปัญหาในคำถามนี้: jsfiddle.net/M5P93 ใช้งานได้ใน IE, Safari, Chrome; Firefox ล้มเหลว
Chris Moschini

คำตอบ:


167

วิธีที่ง่ายและเหมาะสมที่สุดคือการห่อเนื้อหาของเซลล์ใน div และเพิ่มตำแหน่ง: สัมพันธ์กับ div นั้น

ตัวอย่าง:

<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 นี่เป็นทางออกเดียวที่ใช้ได้สำหรับฉัน ใช้tr {display:block}รูปแบบซากปรักหักพังอย่างสมบูรณ์
Wesley Murch

+1 นี่คือคำตอบสำหรับฉันเช่นกัน display: blockไม่เพียงพอสำหรับการแก้ไขในรูปแบบตารางที่ซับซ้อน div พิเศษคือโซลูชันที่น่าเชื่อถือมากกว่า
ดา

5
แต่ด้วยวิธีนี้ "ความกว้าง" และ "ความสูง" ยังคงไม่สามารถใช้งานได้
4esn0k

@ 4esn0k คุณพบวิธีแก้ปัญหาที่คุณสามารถใช้ความกว้างและความสูงได้หรือไม่?
Neil

9
น่าเสียดายที่โซลูชันของคุณไม่ทำงานหากคุณเพิ่มคอลัมน์อื่นที่มีเนื้อหามากกว่านั้นในคอลัมน์อื่น ดังนั้นฉันจึงไม่เข้าใจธง "คำตอบที่ยอมรับ" และความชื่นชมที่ได้รับจากการโหวต กรุณาตรวจสอบjsfiddle.net/ukR3q
ม.ค.

35

นั่นน่าจะไม่มีปัญหา อย่าลืมตั้งค่า:

display: block;

32
ข้อเสียของการตั้งค่าการแสดงผล: บล็อกดูเหมือนว่ามันจะเลอะกับการจัดรูปแบบตารางจริง ๆ ถ้ามันถูกนำไปใช้กับองค์ประกอบโดยตรง เพราะมันเปลี่ยนจากตารางเซลล์ ... หรือฉันบ้าเหรอ?
Ben Johnson

3
@Ben: ใช่ การตั้งค่าpositionบนเซลล์ตารางโดยนิยามจะเปลี่ยนการจัดรูปแบบตารางอย่างจริงจัง คุณนำบล็อกของเซลล์ออกจากโฟลว์ (ยกเว้นposition: relativeที่ซึ่งจะยังคงอยู่ในการไหล แต่ offsets จากมัน)
TJ Crowder

2
@Ben - ไม่ไม่บ้า คุณจะต้องทำงานเพิ่มเพื่อให้ได้สิ่งที่ต้องการ ประเด็นก็คือว่ามันเป็นไปได้
Justin Niessner

1
@TJ มันไม่ได้เพิ่มตำแหน่ง: สัมพัทธ์ที่เปลี่ยนลักษณะที่ปรากฏมันเปลี่ยน th / td จากตารางเซลล์เพื่อบล็อก อีกครั้งดีใจที่รู้ว่ามันใช้งานได้ แต่ในหลายกรณีการสร้างองค์ประกอบระดับบล็อกจะยุ่งกับการจัดรูปแบบตาราง ขอบคุณ Justin!
Ben Johnson

9
อนิจจาdisplay: blockอาจทำให้เกิดปัญหาใน Firefox - เช่นถ้าเซลล์ตารางกำลังขยายคอลัมน์การตั้งค่าให้บล็อกจะยุบเซลล์ลงไปที่คอลัมน์แรก
ดา

13

เนื่องจากทุกเว็บเบราว์เซอร์รวมถึง Internet Explorer 7, 8 และ 9 จัดการตำแหน่งได้อย่างถูกต้อง: สัมพันธ์กับองค์ประกอบที่แสดงบนโต๊ะและมีเพียง FireFox เท่านั้นที่จัดการสิ่งนี้ไม่ถูกต้องทางออกที่ดีที่สุดของคุณคือการใช้ JavaScript shim คุณไม่จำเป็นต้องจัดเรียง DOM ของคุณใหม่สำหรับเบราว์เซอร์ที่เสียเพียงครั้งเดียว ผู้คนใช้ JavaScript ตลอดเวลาเมื่อ IE เกิดความผิดพลาดและเบราว์เซอร์อื่นทั้งหมดทำให้ถูกต้อง

นี่คือ jsfiddle ที่มีคำอธิบายประกอบอย่างสมบูรณ์พร้อมอธิบาย HTML, CSS และ JavaScript ทั้งหมด

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

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

นี่คือ JavaScript ด้านล่าง แต่จะไม่ทำให้เกิดความเข้าใจผิด โปรดตรวจสอบลิงก์ jsfiddle ด้านบน

$(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 ถูกลบใน jQuery 1.9
Matus

อ๋อ ดังนั้นแทนที่ด้วยวิธีการตรวจหาเบราว์เซอร์ที่คุณชื่นชอบ
mrbinky3000

1
เบราว์เซอร์ไม่ผิดพลาด สเปคบอกว่าผลไม่ได้กำหนด
WGH

4
@WGH ไม่ได้ทำให้การแก้ปัญหาน้อยลง ขอบคุณสำหรับ downvote
mrbinky3000

1
เฮ้ฉันเพิ่งสร้างโปลิฟิลจากความมุ่งมั่นของคุณลองดูสิ! :) github.com/Grawl/gecko-table-position-polyfill
ДаниилПронин

11

เริ่มต้นด้วย Firefox 30 คุณจะสามารถใช้positionกับส่วนประกอบตาราง คุณสามารถลองด้วยตัวคุณเองด้วยบิลด์ตอนกลางคืนปัจจุบัน (ทำงานเป็นแบบสแตนด์อโลน): http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/

กรณีทดสอบ ( 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>

คุณสามารถติดตามการเปลี่ยนแปลงของนักพัฒนาต่อได้ที่นี่ (หัวข้อมีอายุ 13 ปี ): https://bugzilla.mozilla.org/show_bug.cgi?id=63895

ตัดสินจากประวัติการวางจำหน่ายเมื่อเร็ว ๆนี้จะสามารถใช้งานได้ทันทีพฤษภาคม 2014 ฉันแทบจะไม่สามารถมีความตื่นเต้นของฉัน!

แก้ไข (6/10/14): Firefox 30 เปิดตัวในวันนี้ ในไม่ช้าการวางตำแหน่งของตารางจะไม่มีปัญหาในเบราว์เซอร์เดสก์ท็อปหลัก


7

ในฐานะของ Firefox 3.6.13 ตำแหน่ง: สัมพัทธ์ / สัมบูรณ์ดูเหมือนจะไม่ทำงานบนองค์ประกอบตาราง ดูเหมือนว่าพฤติกรรม Firefox จะยืนยาว ดูต่อไปนี้: http://csscreator.com/node/31771

ลิงก์ CSS Creator โพสต์การอ้างอิง W3C ต่อไปนี้:

ผลของ 'ตำแหน่ง: สัมพัทธ์' บนตารางกลุ่ม, ส่วนหัวของตาราง, กลุ่มท้ายตาราง, ตารางแถว, กลุ่มตารางคอลัมน์, กลุ่มคอลัมน์, ตารางเซลล์, และตารางคำอธิบายภาพ ไม่ได้กำหนด http://www.w3.org/TR/CSS21/visuren.html#positioning-scheme


ดูคำตอบของจัสติน ใช้งานได้หากคุณเปลี่ยนการdisplayตั้งค่า ซึ่งทำให้รู้สึก (ถึงระดับ CSS ทำให้รู้สึก)
TJ Crowder

8
ใช่มัน "ใช้งานได้" ยกเว้นว่าจะใช้กับเซลล์ทำลายตารางของคุณโดยสิ้นเชิง ...
Simon East

3

ลองใช้display:inline-blockมันใช้งานได้สำหรับฉันใน Firefox 11 ทำให้ฉันมีความสามารถในการกำหนดตำแหน่งภายใน td / th โดยไม่ทำลายเค้าโครงของตาราง ที่ร่วมกับposition:relativetd / th ควรทำให้สิ่งต่าง ๆ ทำงานได้ เพิ่งได้รับมันทำงานด้วยตัวเอง


1

ฉันมีtable-cellองค์ประกอบ (ซึ่งจริง ๆ แล้วDIVไม่ใช่TD)

ฉันแทนที่

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

(ซึ่งทำงานใน Chrome) ด้วย

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

แน่นอนว่าการเติมเต็มมักจะเพิ่มความกว้างในรูปแบบกล่อง - แต่ตารางดูเหมือนจะมีความคิดของตัวเองเมื่อมันมาถึงความกว้างแน่นอน - ดังนั้นสิ่งนี้จะใช้ได้ในบางกรณี


0

การเพิ่มส่วนแสดงผล: บล็อกองค์ประกอบหลักทำให้การทำงานใน firefox นี้ ฉันต้องเพิ่มด้านบน: 0px; ซ้าย: 0px; ไปที่องค์ประกอบหลักเพื่อให้ Chrome ทำงาน IE7, IE8, & IE9 ทำงานได้ดีเช่นกัน

<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

ชนิดของโซลูชันที่ยอมรับ แต่ไม่ใช่ถ้าคุณเพิ่มคอลัมน์อื่นที่มีเนื้อหามากกว่านั้นในคอลัมน์อื่น หากคุณเพิ่มลงheight:100%ในtrของคุณtd & div มันก็น่าจะใช้ได้

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

ปัญหาเดียวก็คือการแก้ไขปัญหาความสูงคอลัมน์ใน FF เท่านั้นไม่ใช่ใน Chrome และ IE มันใกล้เข้ามาแล้ว แต่ก็ไม่สมบูรณ์แบบ

ฉันอัพเดทซอจาก ม.ค. ซึ่งไม่ได้ทำงานกับคำตอบที่ยอมรับเพื่อแสดงว่าทำงานได้ http://jsfiddle.net/gvcLoz20/

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