Unterstützt Firefox Position: relativ zu Tabellenelementen?

169

Wenn ich versuche, position: relative/ zu verwendenposition: absolute auf einem <th>oder <td>in Firefox zu verwenden, scheint es nicht zu funktionieren.

Ben Johnson
quelle
3
Nein, ich denke, kein Browser unterstützt das richtig. Es ist nicht legal in einem HTML-Standard AFAIK
Pekka
2
@ Pekka: HTML kommt nicht dazu, das ist CSS. Und erstaunlicherweise funktioniert es. :-)
TJ Crowder
15
Funktioniert in WebKit und IE, soweit ich das beurteilen kann. Firefox scheint der einzige zu sein, der es in Tabellenzellen nicht mag. Und ja, ich versuche, Elemente innerhalb des <td> zu positionieren, ohne mich auf Floats verlassen zu müssen.
Ben Johnson
2
Schauen Sie sich noch einmal Justins Antwort an. In Firefox funktioniert es einwandfrei, wenn Sie Firefox mitteilen, dass Sie es als Block und nicht als Tabellenelement behandeln.
TJ Crowder
1
Eine jsfiddle, die das Problem in dieser Frage demonstriert: jsfiddle.net/M5P93 Funktioniert in IE, Safari, Chrome; Firefox schlägt fehl.
Chris Moschini

Antworten:

167

Der einfachste und am besten geeignete Weg wäre, den Inhalt der Zelle in ein Div zu wickeln und eine Position hinzuzufügen: relativ zu diesem Div.

Beispiel:

<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>
David Jonas
quelle
11
+1 Dies ist die einzige Lösung, die für mich funktioniert hat. Die Verwendung tr {display:block}ruiniert das Layout vollständig.
Wesley Murch
+1 Dies ist auch für mich die Antwort. display: blockEs reicht nicht aus, komplexe Tabellenlayouts zu korrigieren. Das zusätzliche Div ist eine Lösung, die zuverlässiger ist.
DA.
5
Aber mit dieser Lösung können "Breite" und "Höhe" immer noch nicht verwendet werden
4esn0k
@ 4esn0k hast du eine Lösung gefunden, bei der du Breite und Höhe verwenden kannst?
Neil
9
Leider funktioniert Ihre Lösung nicht , wenn Sie eine weitere Spalte mit mehr Inhalt als in der anderen hinzufügen. Daher verstehe ich die Flagge "Akzeptierte Antwort" und die große Wertschätzung der abgegebenen Stimmen nicht. Bitte überprüfen Sie jsfiddle.net/ukR3q
Jan
35

Das sollte kein Problem sein. Denken Sie daran, auch festzulegen:

display: block;
Justin Niessner
quelle
32
Der Nachteil beim Festlegen von display: block scheint zu sein, dass es die Tabellenformatierung wirklich beeinträchtigen kann, wenn es direkt auf das Element angewendet wird. Weil es sich von Tischzelle ändert ... oder bin ich verrückt?
Ben Johnson
3
@ Ben: Nun ja. Das Festlegen positioneiner Tabellenzelle ändert per Definition die Tabellenformatierung erheblich. Sie nehmen den Zellenblock aus dem Fluss heraus (außer dort position: relative, wo er im Fluss bleibt, aber von ihm versetzt wird).
TJ Crowder
2
@ Ben - Nein, nicht verrückt. Sie müssen auf jeden Fall noch etwas arbeiten, damit die Dinge so aussehen, wie Sie es möchten. Der Punkt ist nur, dass es möglich ist.
Justin Niessner
1
@TJ Es wird keine Position hinzugefügt: Relativ, das das visuelle Erscheinungsbild ändert, es ändert das th / td von Tabellenzelle zu Block. Wiederum schön zu wissen, dass es funktioniert, aber in vielen Fällen wird das Erstellen von Elementen auf Blockebene die Tabellenformatierung wirklich beeinträchtigen. Danke Justin!
Ben Johnson
9
Leider display: blockkann dies auch zu Problemen in Firefox führen. Wenn sich die Tabellenzelle über Spalten erstreckt, wird die Zelle durch Setzen auf Blockieren auf die erste Spalte reduziert.
DA.
13

Da jeder Webbrowser, einschließlich Internet Explorer 7, 8 und 9, die Position korrekt behandelt: relativ zu einem Tabellenanzeigeelement und nur FireFox dies falsch behandelt, ist es am besten, ein JavaScript-Shim zu verwenden. Sie sollten Ihr DOM nicht nur für einen fehlerhaften Browser neu anordnen müssen. Die Leute verwenden ständig JavaScript-Shims, wenn der IE etwas falsch macht und alle anderen Browser es richtig machen.

Hier ist eine vollständig kommentierte jsfiddle mit allen erklärten HTML-, CSS- und JavaScript-Elementen.

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

In meinem obigen jsfiddle-Beispiel werden "Responsive Web Design" -Techniken verwendet, um zu zeigen, dass es mit einem responsiven Layout funktioniert. Ihr Code muss jedoch nicht reagieren.

Hier ist das JavaScript unten, aber es wird aus dem Kontext nicht so viel Sinn machen. Bitte überprüfen Sie den jsfiddle-Link oben.

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

    }

});
mrbinky3000
quelle
$ .browser wurde in jQuery 1.9
Matus
ja. Ersetzen Sie dies durch Ihre bevorzugte Browser-Erkennungsmethode.
mrbinky3000
1
Der Browser ist nicht fehlerhaft. Die Spezifikation besagt, dass der Effekt undefiniert ist.
WGH
4
@WGH Macht die Lösung nicht weniger richtig. Danke für die Ablehnung.
mrbinky3000
1
Hey, ich habe gerade eine Polyfüllung aus deinem Commit erstellt, sieh sie dir an! :) github.com/Grawl/gecko-table-position-polyfill
22аниил Пронин
11

Ab Firefox 30 können Sie positionTabellenkomponenten verwenden. Sie können es mit dem aktuellen nächtlichen Build selbst versuchen (funktioniert als Standalone): http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/

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

Sie können die Diskussion der Entwickler über die Änderungen hier weiter verfolgen (das Thema ist 13 Jahre alt): https://bugzilla.mozilla.org/show_bug.cgi?id=63895

Gemessen an der jüngsten Veröffentlichungshistorie könnte dies bereits im Mai 2014 verfügbar sein. Ich kann meine Aufregung kaum eindämmen!

BEARBEITEN (10.06.14): Firefox 30 wurde heute veröffentlicht. Bald wird die Tabellenpositionierung in großen Desktop-Browsern kein Problem mehr sein

aebabis
quelle
7

Ab Firefox 3.6.13 scheint position: relative / absolute bei Tabellenelementen nicht zu funktionieren. Dies scheint ein langjähriges Firefox-Verhalten zu sein. Siehe Folgendes: http://csscreator.com/node/31771

Der CSS Creator-Link enthält die folgende W3C-Referenz:

Die Auswirkung von 'position: relative' auf Tabellenzeilengruppen-, Tabellenkopfzeilengruppen-, Tabellenfußzeilengruppen-, Tabellenzeilen-, Tabellenspaltengruppen-, Tabellenspalten-, Tabellenzellen- und Tabellenbeschriftungselemente ist nicht definiert. http://www.w3.org/TR/CSS21/visuren.html#positioning-scheme

Ben Johnson
quelle
Siehe Justins Antwort. Es funktioniert, vorausgesetzt, Sie ändern die displayEinstellung. Was Sinn macht (in dem Maße, in dem CSS Sinn macht).
TJ Crowder
8
Ja, es "funktioniert", außer dass das Anwenden auf Zellen Ihren Tisch komplett zerstört ... In diesem Fall irgendwie sinnlos.
Simon East
3

Versuchen Sie, display:inline-blockes in Firefox 11 zu verwenden, damit ich es innerhalb von td / th positionieren kann, ohne das Layout der Tabelle zu zerstören. Das in Verbindung mit position:relativeeinem td / th sollte die Dinge zum Laufen bringen. Ich habe es gerade selbst zum Laufen gebracht.

Jonathan Dorsey
quelle
1

Ich hatte ein table-cellElement (das eigentlich DIVkein warTD )

ich ersetzte

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

(was in Chrome funktioniert hat) mit

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

Natürlich wird die Polsterung normalerweise im Box-Modell zur Breite hinzugefügt - aber Tabellen scheinen immer einen eigenen Sinn zu haben, wenn es um absolute Breiten geht - daher funktioniert dies in einigen Fällen.

Simon_Weaver
quelle
0

Durch Hinzufügen von display: block zum übergeordneten Element funktioniert dies in Firefox. Ich musste auch top hinzufügen: 0px; links: 0px; auf das übergeordnete Element, damit Chrome funktioniert. IE7, IE8 und IE9 funktionieren ebenfalls.

<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>
GrantE
quelle
0

Die akzeptierte Lösung funktioniert, aber nicht, wenn Sie eine weitere Spalte mit mehr Inhalt als in der anderen hinzufügen. Wenn Sie height:100%zu Ihrem tr , td & div hinzufügen , sollte es funktionieren.

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

Das einzige Problem ist, dass dies nur das Problem mit der Spaltenhöhe in FF behebt, nicht in Chrome und IE. Es ist also einen Schritt näher, aber nicht perfekt.

Ich habe die Geige von Jan aktualisiert, die nicht mit der akzeptierten Antwort funktioniert hat, um zu zeigen, dass sie funktioniert. http://jsfiddle.net/gvcLoz20/

Ben
quelle