Нет, я думаю, что ни один браузер не поддерживает это должным образом. Это не законно ни в одном стандарте 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><divstyle="position:relative">
This will be positioned normally
<divstyle="position:absolute;top:5px;left:5px;">
This will be positioned at 5,5 relative to the cell
</div></div></td>
+1 Это единственное решение, которое сработало для меня. Использование tr {display:block}полностью разрушает макет.
Уэсли Мёрч
+1 Это ответ и для меня. display: blockнедостаточно исправлений для сложных таблиц. Дополнительный div - это более надежное решение.
DA.
5
но с этим решением «ширина» и «высота» все еще не могут быть использованы
4esn0k
@ 4esn0k вы нашли решение, где вы можете использовать ширину и высоту?
Нил
9
К сожалению, ваше решение не будет работать, если вы добавите еще один столбец с большим содержанием, чем в другом. Поэтому я не понимаю флаг «принятый ответ» и высокую оценку голосов. Пожалуйста, проверьте jsfiddle.net/ukR3q
Янв
35
Это не должно быть проблемой. Не забудьте также установить:
Недостатком настройки 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.
В приведенном выше примере с 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();}});
Судя по истории последних выпусков , это может быть доступно уже в мае 2014 года. Я едва сдерживаю свое волнение!
РЕДАКТИРОВАТЬ (6/10/14): Firefox 30 был выпущен сегодня. Вскоре позиционирование таблицы не будет проблемой в основных браузерах настольных компьютеров
Начиная с 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тд / й должно заставить вещи работать. Просто получил это работает сам.
Конечно, отступы обычно добавляются к ширине в блочной модели, но у таблиц всегда есть собственный разум, когда дело доходит до абсолютной ширины, так что это будет работать в некоторых случаях.
Добавление display: block к родительскому элементу сделало это работающим в Firefox. Я также должен был добавить top: 0px; Слева направо: 0px; в родительский элемент для Chrome для работы. IE7, IE8 и IE9 также работают.
<tdstyle="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><tdstyle="position:absolute;top:5px;left:100px;">
//child element info
</td></tr></table></td>
Приемлемое решение работает, но не в том случае, если вы добавляете еще один столбец с большим содержанием, чем в другом. Если вы добавите height:100%в свой tr , td & div, то он должен работать.
<trstyle="height:100%"><tdstyle="height:100%"><divstyle="position:relative;height:100%">
This will be positioned normally
<divstyle="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/
Ответы:
Самый простой и правильный способ - обернуть содержимое ячейки в div и добавить позицию: относительно этого div.
пример:
источник
tr {display:block}
полностью разрушает макет.display: block
недостаточно исправлений для сложных таблиц. Дополнительный div - это более надежное решение.Это не должно быть проблемой. Не забудьте также установить:
источник
position
ячейки таблицы, по определению, серьезно меняет форматирование таблицы. Вы берете блок ячейки из потока (за исключением тогоposition: relative
, где он остается в потоке, но смещается от него).display: block
может также вызвать проблемы в Firefox, а именно, если ячейка таблицы охватывает столбцы, ее установка на блок свернет ячейку до первого столбца.Поскольку каждый веб-браузер, включая Internet Explorer 7, 8 и 9, правильно обрабатывает положение: относительно элемента отображения таблицы и только FireFox обрабатывает это неправильно, лучше всего использовать JavaScript-прокладку. Вам не нужно переставлять DOM только для одного неисправного браузера. Люди используют JavaScript-прокладки все время, когда в IE что-то не так, а во всех других браузерах это правильно.
Вот полностью аннотированный jsfiddle со всем объясненным HTML, CSS и JavaScript.
http://jsfiddle.net/mrbinky3000/MfWuV/33/
В приведенном выше примере с jsfiddle используются методы «адаптивного веб-дизайна», чтобы показать, что он будет работать с адаптивным макетом. Тем не менее, ваш код не должен быть отзывчивым.
Ниже приведен код JavaScript, но он не будет иметь особого смысла вне контекста. Пожалуйста, проверьте ссылку jsfiddle выше.
источник
Начиная с Firefox 30, вы сможете использовать
position
компоненты таблицы. Вы можете попробовать сами с текущей ночной сборкой (работает автономно): http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/Тестовый пример ( http://jsfiddle.net/acbabis/hpWZk/ ):
Вы можете продолжить следить за обсуждением изменений разработчиками здесь (теме 13 лет ): https://bugzilla.mozilla.org/show_bug.cgi?id=63895
Судя по истории последних выпусков , это может быть доступно уже в мае 2014 года. Я едва сдерживаю свое волнение!
РЕДАКТИРОВАТЬ (6/10/14): Firefox 30 был выпущен сегодня. Вскоре позиционирование таблицы не будет проблемой в основных браузерах настольных компьютеров
источник
Начиная с Firefox 3.6.13, положение: относительное / абсолютное не похоже на элементы таблицы. Это, кажется, давнишнее поведение Firefox. Смотрите следующее: http://csscreator.com/node/31771
Ссылка CSS Creator публикует следующую ссылку на W3C:
источник
display
настройку. Что имеет смысл (в той степени, в которой CSS имеет смысл).Попробуйте использовать
display:inline-block
его для меня в Firefox 11, что дает мне возможность позиционирования в пределах тд / т, не разрушая расположение таблицы. Это в сочетании сposition:relative
тд / й должно заставить вещи работать. Просто получил это работает сам.источник
У меня был
table-cell
элемент (который был на самом делеDIV
неTD
)Я заменил
(который работал в Chrome) с
Конечно, отступы обычно добавляются к ширине в блочной модели, но у таблиц всегда есть собственный разум, когда дело доходит до абсолютной ширины, так что это будет работать в некоторых случаях.
источник
Добавление display: block к родительскому элементу сделало это работающим в Firefox. Я также должен был добавить top: 0px; Слева направо: 0px; в родительский элемент для Chrome для работы. IE7, IE8 и IE9 также работают.
источник
Приемлемое решение работает, но не в том случае, если вы добавляете еще один столбец с большим содержанием, чем в другом. Если вы добавите
height:100%
в свой tr , td & div, то он должен работать.Единственная проблема состоит в том, что это только устраняет проблему высоты столбца в FF, а не в Chrome и IE. Так что это на шаг ближе, но не идеально.
Я обновил скрипку от Яна, которая не работала с принятым ответом, чтобы показать, что она работает. http://jsfiddle.net/gvcLoz20/
источник