Firefox supporta la posizione: relativa sugli elementi della tabella?


169

Quando provo a usare position: relative/ position: absolutesu un <th>o <td>in Firefox non sembra funzionare.


3
No, penso che nessun browser lo supporti correttamente. Non è legale in nessuno standard HTML AFAIK
Pekka,

2
@Pekka: HTML non entra, questo è CSS. E sorprendentemente, funziona. :-)
TJ Crowder,

15
Funziona in WebKit e IE per quanto ne so. Firefox sembra essere l'unico a cui non piace nelle celle da tavolo. E sì, sto cercando di posizionare elementi all'interno di <td> senza dover fare affidamento su float.
Ben Johnson,

2
Ancora una volta, guarda la risposta di Justin. Funziona bene in Firefox se dici a Firefox che lo stai trattando come un blocco piuttosto che come un elemento di tabella.
TJ Crowder,

1
Un jsfiddle che dimostra il problema in questa domanda: jsfiddle.net/M5P93 Funziona in IE, Safari, Chrome; Firefox ha esito negativo.
Chris Moschini,

Risposte:


167

Il modo più semplice e corretto sarebbe avvolgere il contenuto della cella in un div e aggiungere una posizione: relativa a quel div.

esempio:

<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 Questa è l'unica soluzione che ha funzionato per me. L'utilizzo tr {display:block}rovina completamente il layout.
Wesley Murch,

+1 Questa è la risposta anche per me. display: blocknon è sufficiente una correzione su layout di tabella complessi. Il div extra è una soluzione più affidabile.
DA.

5
ma con questa soluzione non è ancora possibile utilizzare "larghezza" e "altezza"
4

@ 4esn0k hai trovato una soluzione in cui puoi usare larghezza e altezza?
Neil,

9
Sfortunatamente, la tua soluzione non funziona se aggiungi un'altra colonna con più contenuti rispetto a quella dell'altra. Quindi non capisco la bandiera della "risposta accettata" e il grande apprezzamento dato dai voti in alto. Si prega di verificare jsfiddle.net/ukR3q
Gen

35

Questo non dovrebbe essere un problema. Ricorda di impostare anche:

display: block;

32
L'aspetto negativo di impostazione display: blocco sembra essere che può davvero pasticciare con la formattazione della tabella se viene applicato direttamente all'elemento. Perché lo sta cambiando da cellula-tabella ... o sono pazzo?
Ben Johnson,

3
@ Ben: Sì, sì. L'impostazione positionsu una cella di una tabella sta, per definizione, cambiando seriamente la formattazione della tabella. Prendi il blocco della cella fuori dal flusso (tranne position: relative, dove rimane nel flusso ma si compensa da esso).
TJ Crowder,

2
@Ben - No, non pazzo. Dovrai sicuramente fare un po 'più di lavoro per ottenere le cose nel modo che desideri. Il punto è semplicemente che è possibile.
Justin Niessner,

1
@TJ Non sta aggiungendo la posizione: un parente sta cambiando l'aspetto visivo, sta cambiando il th / td da cella-tabella a blocco. Ancora una volta, è bello sapere che funziona, ma in molti casi la creazione di elementi a livello di blocco compromette davvero la formattazione della tabella. Grazie Giustino!
Ben Johnson,

9
ahimè, display: blockpuò anche causare problemi in Firefox - vale a dire se la cella della tabella si estende su colonne, impostandola su blocco comprimerà la cella fino alla prima colonna.
DA.

13

Poiché ogni browser Web, incluso Internet Explorer 7, 8 e 9, gestisce correttamente la posizione: relativo su un elemento di visualizzazione tabella e solo FireFox lo gestisce in modo errato, la soluzione migliore è utilizzare uno shim JavaScript. Non dovresti riorganizzare il tuo DOM solo per un browser difettoso. Le persone usano JavaScript shim sempre quando IE sbaglia qualcosa e tutti gli altri browser lo fanno bene.

Ecco un jsfiddle completamente annotato con tutti gli HTML, CSS e JavaScript spiegati.

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

Il mio esempio jsfiddle sopra usa le tecniche di "Responsive Web Design" solo per mostrare che funzionerà con un layout reattivo. Tuttavia, il tuo codice non deve essere reattivo.

Ecco il JavaScript qui sotto, ma non avrà molto senso fuori dal contesto. Controlla il link jsfiddle sopra.

$(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 è stato rimosso in jQuery 1.9
Matus il

Sì. quindi sostituisci con il tuo metodo di rilevamento del browser preferito.
mrbinky3000,

1
Il browser non è difettoso. Le specifiche indicano che l'effetto non è definito.
WGH,

4
@WGH Non rende la soluzione meno giusta. Grazie per il downvote.
mrbinky3000,

1
Ehi, ho appena creato un polyfill dal tuo commit, guardalo! :) github.com/Grawl/gecko-table-position-polyfill
Даниил Пронин

11

A partire da Firefox 30, potrai utilizzare positioni componenti della tabella. Puoi provare tu stesso con l'attuale build notturna (funziona come indipendente): http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/

Test case ( 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>

Puoi continuare a seguire la discussione degli sviluppatori sulle modifiche qui (l'argomento ha 13 anni ): https://bugzilla.mozilla.org/show_bug.cgi?id=63895

A giudicare dalla recente cronologia delle versioni, questo potrebbe essere disponibile a partire da maggio 2014. Riesco a malapena a contenere la mia eccitazione!

EDIT (6/10/14): Firefox 30 è stato rilasciato oggi. Presto, il posizionamento della tabella non sarà più un problema nei principali browser desktop


7

A partire da Firefox 3.6.13, posizione: relativo / assoluto non sembra funzionare sugli elementi della tabella. Questo sembra essere un comportamento di Firefox di vecchia data. Vedere quanto segue: http://csscreator.com/node/31771

Il link CSS Creator pubblica il seguente riferimento W3C:

L'effetto di 'position: relative' sugli elementi table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell e table-caption non è definito. http://www.w3.org/TR/CSS21/visuren.html#positioning-scheme


Vedi la risposta di Justin. Funziona, a condizione che si cambi l' displayimpostazione. Il che ha senso (nella misura in cui CSS ha senso).
TJ Crowder,

8
Sì, "funziona" tranne per il fatto che applicarlo alle celle distrugge completamente il tuo tavolo ... Inutile dire in quel caso.
Simon East,

3

Prova a usarlo display:inline-blockha funzionato per me in Firefox 11 dandomi la capacità di posizionamento entro il td / th senza distruggere il layout della tabella. Che in congiunzione con position:relativeun giorno o l'altro dovrebbe far funzionare le cose. Ho appena funzionato da solo.


1

Ho avuto un table-cellelemento (che in realtà era un DIVnon a TD)

Ho sostituito

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

(che ha funzionato in Chrome) con

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

Ovviamente l'imbottitura di solito viene aggiunta alla larghezza nel modello a scatola - ma le tabelle sembrano sempre avere una propria mente quando si tratta di larghezze assolute - quindi questo funzionerà in alcuni casi.


0

Aggiunta di display: il blocco all'elemento genitore ha funzionato in Firefox Ho anche dovuto aggiungere top: 0px; a sinistra: 0px; all'elemento genitore affinché Chrome funzioni. Anche IE7, IE8 e IE9 funzionano.

<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

Il tipo di soluzione accettata funziona, ma non se aggiungi un'altra colonna con più contenuti rispetto a quella dell'altra. Se aggiungi height:100%a tr , td e div, dovrebbe funzionare.

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

L'unico problema è che questo risolve solo il problema dell'altezza della colonna in FF, non in Chrome e IE. Quindi è un passo avanti, ma non perfetto.

Ho aggiornato un violino di Jan che non funzionava con la risposta accettata per dimostrarlo funzionante. http://jsfiddle.net/gvcLoz20/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.