O Firefox suporta a posição: relativa em elementos da tabela?

169

Quando tento usar position: relative/ position: absoluteno <th>ou <td>no Firefox, isso não parece funcionar.

Ben Johnson
fonte
3
Não, acho que nenhum navegador suporta isso corretamente. Não é legal em qualquer padrão HTML AFAIK
Pekka
2
@ Pekka: HTML não entra, é CSS. E, surpreendentemente, funciona. :-)
TJ Crowder
15
Funciona no WebKit e IE, tanto quanto eu posso dizer. O Firefox parece ser o único que não gosta nas células da tabela. E sim, estou tentando posicionar elementos dentro do <td> sem precisar depender de carros alegóricos.
Ben Johnson
2
Mais uma vez, olhe a resposta de Justin. Funciona perfeitamente no Firefox se você disser ao Firefox que o está tratando como um bloco e não como um elemento da tabela.
TJ Crowder
1
Um jsfiddle demonstrando o problema nesta pergunta: jsfiddle.net/M5P93 Funciona no IE, Safari, Chrome; Firefox falha.
Chris Moschini

Respostas:

167

A maneira mais fácil e adequada seria envolver o conteúdo da célula em uma div e adicionar uma posição: relativa a essa div.

exemplo:

<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>
DavidJonas
fonte
11
+1 Esta é a única solução que funcionou para mim. Usando tr {display:block}completamente arruina o layout.
Wesley Murch
+1 Esta é a resposta para mim também. display: blocknão é suficiente para corrigir layouts de tabela complexos. A div extra é a solução mais confiável.
DA.
5
mas, com esta solução "width" e "height" ainda não pode ser usado
4esn0k
@ 4esn0k você encontrou uma solução em que pode usar largura e altura?
30512 Neil
9
Infelizmente, sua solução não funcionará se você adicionar outra coluna com mais conteúdo do que na outra. Portanto, não entendo a bandeira da "resposta aceita" e a grande apreciação dada pelos votos. Por favor, verifique jsfiddle.net/ukR3q
Jan
35

Isso não deve ser problema. Lembre-se de definir também:

display: block;
Justin Niessner
fonte
32
A desvantagem de configurar display: block parece ser que ele pode realmente mexer com a formatação da tabela, se aplicada diretamente ao elemento. Porque está mudando de célula da tabela ... ou eu sou louco?
Ben Johnson
3
@ Ben: Bem, sim. Definir positionuma célula da tabela está, por definição, alterando seriamente a formatação da tabela. Você tira o bloco da célula do fluxo (exceto position: relativeonde ele permanece no fluxo, mas compensa).
TJ Crowder
2
@ Ben - Não, não é louco. Definitivamente, você terá que trabalhar mais para obter as coisas da maneira que deseja. A questão é apenas que é possível.
Justin Niessner
1
@TJ Não está adicionando posição: parente que está mudando a aparência visual, está mudando o th / td da célula da tabela para o bloco. Novamente, é bom saber que funciona, mas em muitos casos a criação de elementos no nível do bloco realmente interfere na formatação da tabela. Obrigado Justin!
Ben Johnson
9
infelizmente, display: blocktambém pode causar problemas no Firefox - ou seja, se a célula da tabela estiver estendendo colunas, a configuração para bloquear reduzirá a célula para a primeira coluna.
DA.
13

Como todo navegador da Web, incluindo o Internet Explorer 7, 8 e 9, lida corretamente com a posição: em um elemento de exibição de tabela e apenas o FireFox lida com isso incorretamente, sua melhor aposta é usar um calço JavaScript. Você não precisa reorganizar seu DOM apenas por um navegador com defeito. As pessoas usam calços JavaScript o tempo todo quando o IE comete algo errado e todos os outros navegadores fazem o certo.

Aqui está um jsfiddle completamente anotado com todo o HTML, CSS e JavaScript explicados.

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

Meu exemplo do jsfiddle acima usa técnicas de "Responsive Web Design" apenas para mostrar que ele funcionará com um layout responsivo. No entanto, seu código não precisa ser responsivo.

Aqui está o JavaScript abaixo, mas não fará muito sentido fora do contexto. Por favor, verifique o link jsfiddle acima.

$(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
fonte
$ .browser foi removido no jQuery 1.9
Matus
Sim. então substitua pelo seu método favorito de detecção de navegador.
mrbinky3000
1
O navegador não está com defeito. A especificação diz que o efeito é indefinido.
WGH 03/08/19
4
@WGH Não torna a solução menos correta. Obrigado pelo voto negativo.
precisa saber é o seguinte
1
Ei, acabei de criar um polyfill a partir do seu commit, olha só! :) github.com/Grawl/gecko-table-position-polyfill
Даниил Пронин
11

A partir do Firefox 30, você poderá usar os positioncomponentes da tabela. Você pode tentar por si mesmo com a compilação noturna atual (funciona como independente): http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/

Caso de teste ( 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>

Você pode continuar acompanhando a discussão dos desenvolvedores sobre as alterações aqui (o tópico tem 13 anos ): https://bugzilla.mozilla.org/show_bug.cgi?id=63895

A julgar pelo histórico recente de lançamentos , isso pode estar disponível a partir de maio de 2014. Mal posso conter minha emoção!

EDIT (10/06/14): O Firefox 30 foi lançado hoje. Em breve, o posicionamento da tabela não será um problema nos principais navegadores de desktop

aebabis
fonte
7

No Firefox 3.6.13, a posição: relativo / absoluto não parece funcionar nos elementos da tabela. Este parece ser o comportamento do Firefox de longa data. Veja o seguinte: http://csscreator.com/node/31771

O link do CSS Creator publica a seguinte referência W3C:

O efeito de 'posição: relativo' nos elementos de grupo de linhas da tabela, grupo de cabeçalho da tabela, grupo de rodapé da tabela, linha de tabela, grupo de colunas da tabela, coluna da tabela, célula da tabela e legenda da tabela está indefinido. http://www.w3.org/TR/CSS21/visuren.html#positioning-scheme

Ben Johnson
fonte
Veja a resposta de Justin. Funciona, desde que você altere a displayconfiguração. O que faz sentido (na medida em que CSS faz sentido).
TJ Crowder
8
Sim, "funciona", exceto que a aplicação a células destrói completamente sua mesa ... Meio inútil nesse caso.
Simon East
3

Tente usá- display:inline-blocklo funcionou para mim no Firefox 11, fornecendo-me capacidade de posicionamento dentro do td / th sem destruir o layout da tabela. Isso, em conjunto com position:relativeum td / th, deve fazer as coisas funcionarem. Só tenho que trabalhar.

Jonathan Dorsey
fonte
1

Eu tinha um table-cellelemento (que na verdade DIVnão era um TD)

Eu troquei

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

(que funcionou no Chrome) com

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

É claro que o preenchimento geralmente é adicionado à largura no modelo de caixa - mas as tabelas sempre parecem ter uma mente própria quando se trata de larguras absolutas -, portanto, isso funcionará em alguns casos.

Simon_Weaver
fonte
0

Adicionando display: block ao elemento pai, isso funcionou no firefox. Eu também tive que adicionar top: 0px; esquerda: 0px; ao elemento pai para o Chrome funcionar. IE7, IE8 e IE9 também estão funcionando.

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

A solução aceita meio que funciona, mas não se você adicionar outra coluna com mais conteúdo do que na outra. Se você adicionar height:100%ao seu tr , td & div, ele deverá funcionar.

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

O único problema é que isso corrige apenas o problema de altura da coluna no FF, não no Chrome e no IE. Portanto, é um passo mais perto, mas não é perfeito.

Atualizei um violino de Jan que não estava funcionando com a resposta aceita para mostrar que estava funcionando. http://jsfiddle.net/gvcLoz20/

Ben
fonte