Поддерживает ли Firefox положение: относительно элементов таблицы?

169

Когда я пытаюсь использовать position: relative/ position: absoluteна <th>или <td>в Firefox, это не работает.

Бен Джонсон
источник
3
Нет, я думаю, что ни один браузер не поддерживает это должным образом. Это не законно ни в одном стандарте HTML AFAIK
Pekka
2
@Pekka: HTML не входит в это, это CSS. И удивительно, это работает. :-)
TJ Crowder
15
Насколько я могу судить, работает в WebKit и IE. Firefox, кажется, единственный, кому не нравится это на планшетах. И да, я пытаюсь расположить элементы внутри <td>, не полагаясь на поплавки.
Бен Джонсон
2
Снова, посмотрите на ответ Джастина. Он отлично работает в Firefox, если вы скажете Firefox, что вы рассматриваете его как блок, а не как элемент таблицы.
TJ Crowder
1
Jsfiddle, демонстрирующий проблему в этом вопросе: jsfiddle.net/M5P93 Работает в IE, Safari, Chrome; Firefox не работает.
Крис Москини

Ответы:

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>
DavidJonas
источник
11
+1 Это единственное решение, которое сработало для меня. Использование tr {display:block}полностью разрушает макет.
Уэсли Мёрч
+1 Это ответ и для меня. display: blockнедостаточно исправлений для сложных таблиц. Дополнительный div - это более надежное решение.
DA.
5
но с этим решением «ширина» и «высота» все еще не могут быть использованы
4esn0k
@ 4esn0k вы нашли решение, где вы можете использовать ширину и высоту?
Нил
9
К сожалению, ваше решение не будет работать, если вы добавите еще один столбец с большим содержанием, чем в другом. Поэтому я не понимаю флаг «принятый ответ» и высокую оценку голосов. Пожалуйста, проверьте jsfiddle.net/ukR3q
Янв
35

Это не должно быть проблемой. Не забудьте также установить:

display: block;
Джастин Нисснер
источник
32
Недостатком настройки display: block является то, что он действительно может мешать форматированию таблицы, если он применяется непосредственно к элементу. Потому что это меняет его из таблицы клеток ... или я сумасшедший?
Бен Джонсон
3
@ Бен: Ну да. Установка positionячейки таблицы, по определению, серьезно меняет форматирование таблицы. Вы берете блок ячейки из потока (за исключением того position: relative, где он остается в потоке, но смещается от него).
TJ Crowder
2
@Ben - Нет, не сумасшедший. Вам определенно придется проделать дополнительную работу, чтобы все выглядело так, как вы хотите. Дело лишь в том, что это возможно.
Джастин Нисснер
1
@TJ Это не добавление позиции: относительное - это изменение внешнего вида, это изменение th / td от ячейки таблицы к блоку. Опять же, приятно знать, что это работает, но во многих случаях создание элементов блочного уровня действительно мешает форматированию таблицы. Спасибо, Джастин!
Бен Джонсон
9
увы, это display: blockможет также вызвать проблемы в Firefox, а именно, если ячейка таблицы охватывает столбцы, ее установка на блок свернет ячейку до первого столбца.
DA.
13

Поскольку каждый веб-браузер, включая Internet Explorer 7, 8 и 9, правильно обрабатывает положение: относительно элемента отображения таблицы и только FireFox обрабатывает это неправильно, лучше всего использовать JavaScript-прокладку. Вам не нужно переставлять DOM только для одного неисправного браузера. Люди используют JavaScript-прокладки все время, когда в IE что-то не так, а во всех других браузерах это правильно.

Вот полностью аннотированный jsfiddle со всем объясненным HTML, CSS и JavaScript.

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

В приведенном выше примере с jsfiddle используются методы «адаптивного веб-дизайна», чтобы показать, что он будет работать с адаптивным макетом. Тем не менее, ваш код не должен быть отзывчивым.

Ниже приведен код 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();

    }

});
mrbinky3000
источник
$ .browser был удален в jQuery 1.9
Матус
Ага. поэтому замените ваш любимый метод обнаружения браузера.
mrbinky3000
1
Браузер не неисправен. В спецификации сказано, что эффект не определен.
WGH
4
@WGH Не делает решение менее правильным. Спасибо за отрицание.
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 был выпущен сегодня. Вскоре позиционирование таблицы не будет проблемой в основных браузерах настольных компьютеров

aebabis
источник
7

Начиная с Firefox 3.6.13, положение: относительное / абсолютное не похоже на элементы таблицы. Это, кажется, давнишнее поведение Firefox. Смотрите следующее: http://csscreator.com/node/31771

Ссылка CSS Creator публикует следующую ссылку на W3C:

Влияние 'position :lative' на элементы table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell и заголовок таблицы не определено http://www.w3.org/TR/CSS21/visuren.html#positioning-scheme

Бен Джонсон
источник
Смотри ответ Джастина. Это работает, если вы измените displayнастройку. Что имеет смысл (в той степени, в которой CSS имеет смысл).
TJ Crowder
8
Да, это "работает", за исключением того, что применение его к клеткам полностью разрушает ваш стол ... В этом случае бессмысленно.
Саймон Ист
3

Попробуйте использовать display:inline-blockего для меня в Firefox 11, что дает мне возможность позиционирования в пределах тд / т, не разрушая расположение таблицы. Это в сочетании с position:relativeтд / й должно заставить вещи работать. Просто получил это работает сам.

Джонатан Дорси
источник
1

У меня был table-cellэлемент (который был на самом деле DIVне TD)

Я заменил

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

(который работал в Chrome) с

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

Конечно, отступы обычно добавляются к ширине в блочной модели, но у таблиц всегда есть собственный разум, когда дело доходит до абсолютной ширины, так что это будет работать в некоторых случаях.

Simon_Weaver
источник
0

Добавление display: block к родительскому элементу сделало это работающим в Firefox. Я также должен был добавить top: 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>
GRANTE
источник
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/

Бен
источник