Чи підтримує 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

Найпростішим і правильним способом було б загортати вміст комірки у діл та додавати положення: відносно цього діла.

приклад:

<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}повністю руйнує макет.
Веслі Мерч

+1 Це відповідь і для мене. display: blockнедостатньо виправлення складних макетів таблиць. Додатковий дів - це рішення, яке є більш надійним.
DA.

5
але з цим рішенням "ширина" та "висота" все ще не можна використовувати
4esn0k

@ 4esn0k Ви знайшли рішення, де можна використовувати ширину та висоту?
Ніл

9
На жаль, ваше рішення не працює, якщо ви додасте інший стовпець з більшою кількістю вмісту, ніж в іншому. Тож я не розумію прапор "прийнятої відповіді" та велику оцінку, яку отримують голоси вгору. Будь ласка , перевірте jsfiddle.net/ukR3q
Jan

35

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

display: block;

32
Недоліком налаштування дисплея: блок здається, що він дійсно може зіпсуватися з форматуванням таблиці, якщо він застосований безпосередньо до елемента. Тому що це міняє його з комірки таблиці ... чи я божевільний?
Бен Джонсон

3
@Ben: Ну так. Налаштування 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 shims весь час, коли 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();

    }

});

$ .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 року. Я ледве стримую своє хвилювання!

EDIT (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
Так, це "працює" за винятком того, що застосовуючи його до клітинок, повністю руйнує ваш стіл ... Нібито безглуздо в цьому випадку.
Саймон Іст

3

Спробуйте використовувати display:inline-blockце працювало для мене у Firefox 11, даючи мені можливість позиціонування в межах td / th, не руйнуючи компонування таблиці. Це в поєднанні з position:relativetd / th повинно змусити роботу працювати. Просто працював сам.


1

У мене був table-cellелемент (який насправді був DIVне a 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/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.