Зробіть, щоб DIV заповнив всю комірку таблиці


163

Я це питання бачив і трохи гуглив , але поки що нічого не спрацювало. Я вважаю, що це 2010 рік (ці питання / відповіді старі і, без відповіді), і у нас CSS3! Чи є спосіб отримати div, щоб заповнити ширину та висоту всієї комірки таблиці за допомогою CSS?

Я не знаю, яка ширина та / або висота комірки випереджає час, і встановити ширину та висоту Div на 100% не працює.

Крім того, мені потрібна причина діви в тому, що мені потрібно абсолютно розташувати деякі елементи поза клітиною, і position: relativeне стосується tds, тому мені потрібен обгортковий дів.


Чи є сам контейнер столу певної висоти? Чи таблиця охоплює вікно перегляду сторінки?
meder omuraliev

4
Дійсно, що встановити висоту та ширину на 100% не працює. Це повинно зробити діва повною шириною та висотою батьківського тегу. Можливо, це не працює через відносне позиціонування. Мені цікаво бачити рішення, коли хтось його знайде.
Марцін

@meder дані в таблиці динамічні, тому я ніколи не буду знати висоту. ширина заповнює екран, так.
Джейсон

1
Ви можете поглянути на це питання: stackoverflow.com/questions/2841484/…
Gert Grenander

3
@Marcin Якщо висота комірки таблиці (тобто контейнера) явно не вказана, то відсотковий відсоток висоти на внутрішньому DIV насправді обчислюється як "auto" - відповідно до специфікації.
MrWhite

Відповіді:


48

Наступний код працює в режимі сумісності IE 7 IE 8 та Chrome (не перевірений в іншому місці):

<table style="width:100px"> <!-- Not actually necessary; just makes the example text shorter -->
   <tr><td>test</td><td>test</td></tr>
   <tr>
      <td style="padding:0;">
         <div style="height:100%; width:100%; background-color:#abc; position:relative;">
            <img style="left:90px; position:absolute;" src="../Content/Images/attachment.png"/>
            test of really long content that causes the height of the cell to increase dynamically
         </div>
      </td>
      <td>test</td>
   </tr>
</table>

Ви сказали , що в початковому питанні , що установка widthі heightщоб 100%не працювати, хоча, що змушує мене підозрювати , що є деякі інші правила перекриваючи його. Ви перевірили обчислений стиль у Chrome чи Firebug, щоб перевірити, чи дійсно застосовуються правила ширини / висоти?

Редагувати

Який я дурний! Величина divрозміру тексту, а не тексту td. Ви можете виправити це в Chrome, зробивши div display:inline-block, але це не працює на IE. Це доводить складніше ...


зітхання ... хороший дзвінок щодо перевірки, чи застосовуються інші стилі. Мабуть, у мене були деякі правила прокладки, які заважали моєму діву охопити всю клітинку таблиці. як тільки я позбувся цього, у мене не було проблем. Мені було цікаво, тому що мій код виглядає так само, як і ваш (використовуючи класи, звичайно), але коли я пішов далі по ланцюжку, ось і ось, набивання. спасибі за вашу допомогу.
Джейсон

6
спробуйте цей приклад: jsfiddle.net/2K2tG зауважте, як комірка w / зображення червона, а не #abc. ширина / висота 100% нічого не робить
Джейсон

THX для цієї статті; я давно шукав цього
Іонут Флавій Погачян

4
Як вказував Джейсон, висота: 100% нічого не робить .... це не вирішує проблему. Дякуємо за редагування, хоча згадуємо inline-block.
Метт Браун

3
Так, це працює з Chrome, але, на жаль, не для Firefox ... jsfiddle.net/38Ngn/1
Плутон

66

div height = 100% у комірці таблиці працюватиме лише тоді, коли таблиця має атрибут висоти.

<table border="1" style="height:300px; width: 100px;">
 <tr><td>cell1</td><td>cell2</td></tr>
 <tr>
   <td>
     <div style="height: 100%; width: 100%; background-color:pink;"></div>
   </td>
   <td>long text long text long text long text long text long text</td>
 </tr>
</table>

UPD у FireFox слід також встановити height=100%значення батьківського TDелемента


59
це так дивно. дурно, що це 2012 рік, і ця помилка ще не виправлена
дилянізована

2
і через це ми платимо більше
Іонут Флавій Погачян

Хороший трюк, але працював лише на Chromium для мене. IE9 та firefox 19 не в змозі розтягнути діви.
Мартін

1
замість висоти пікселя я використав 100% висоту та мінімальну висоту: 1 пікс.
andrea.spot.

1
Якщо ви також встановите tdвисоту, що містить 100%, вона повинна працювати у FF. Це правильна відповідь.
HartleySan

58

Мені довелося встановити підроблену висоту на <tr>та висоту: успадкувати для<td>s

tr має height: 1px(все одно ігнорується)

Потім встановіть td height: inherit

Потім встановіть діва на height: 100%

Це працювало для мене в IE edge і Chrome:

<table style="width:200px;">
    <tr style="height: 1px;">
        <td style="height: inherit; border: 1px solid #000; width: 100px;">
            <div>
              Something big with multi lines and makes table bigger
            </div>
        </td>
        <td style="height: inherit; border: 1px solid #000; width: 100px;">
            <div style="background-color: red; height: 100%;">
                full-height div
            </div>
        </td>
    </tr>
</table>


Я не знаю, чи завжди це працює, але це працювало для мене в IE 11.
Jo Maffei

7
Мені просто потрібно td { height: 1px }для Chrome.
Кріс Щасливий

Дуже дякую! У цьому мені допомогли таблиця html та компонент Angular як вміст комірок.
Фелікс Лемке

15

Якщо ви хочете, щоб 100-відсотковий поділ всередині клітинки таблиці полягав у тому, щоб мати можливість фонового кольору поширюватися на повний зріст, але все-таки мати можливість проміжків між клітинками, ви можете надати <td>собі колір фону та використовувати CSS властивість інтервалу інтервалу для створення поля між клітинками.

Однак, якщо вам справді потрібен розділовий наріст висоти 100%, тоді, як згадували інші, вам потрібно призначити фіксовану висоту <table>або використовувати Javascript.


1
Ви можете розмістити клітинку, використовуючи border-spacing:5pxелемент "таблиця" ed, але я згоден, використання DIV всередині комірок набагато елегантніше та загалом краще.
vsync

дякую за пропозицію, працює чудово. просто не забудьте застосувати border-collapse: separateдо таблиці, інакше це не матиме жодного ефекту. +1
katzenhut

border-collapse: separateза замовчуванням, але так, це гарна порада.
Метт Браун

12

Отож, оскільки всі публікують своє рішення, і жодне було недобре для мене, ось моє (протестовано на Chrome & Firefox).

table { height: 1px; }
tr { height: 100%; }
td { height: 100%; }
td > div { height: 100%; }

Fiddle: https://jsfiddle.net/nh6g5fzv/


1
Ви, сер чи мадам, заслуговуєте на золоту зірку. Це ганяло мене.
tylertrotter

6

Оскільки кожен інший веб-переглядач (включаючи IE 7, 8 і 9) обробляє position:relativeклітинку таблиці правильно, і лише Firefox помиляється з нею, найкращим варіантом буде використання JavaScript shim. Вам не слід змінювати свій DOM для одного невдалого веб-переглядача. Люди користуються лайками весь час, коли IE отримує щось не так і всі інші браузери розуміють це правильно.

Ось фрагмент із усім кодованим кодом. У моєму прикладі JavaScript, HTML та CSS використовують чуйну практику веб-дизайну, але це не потрібно, якщо ви цього не хочете. (Чуйний означає, що він адаптується до ширини вашого браузера.)

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

Ось сам код, але це не має сенсу без контексту, тому відвідайте URL-адресу jsfiddle вище. (Повний фрагмент також має багато коментарів як у CSS, так і у Javascript.)

$(function() {
    // FireFox Shim
    if ($.browser.mozilla) {
        $('#test').wrapInner('<div class="ffpad"></div>');
        function ffpad() {
            var $ffpad = $('.ffpad'),
                $parent = $('.ffpad').parent(),
                w, h;
            $ffpad.height(0);
            if ($parent.css('display') == 'table-cell') {               
                h = $parent.outerHeight();
                $ffpad.height(h);
            }
        }
        $(window).on('resize', function() {
            ffpad();
        });
        ffpad();
    }
});

2
Хоча це була гарна відповідь, не копіюйте та не вставляйте цей код. $ .browser застаріло з часу jQuery 1.8 і було видалено в 1.9. Для отримання додаткової інформації: api.jquery.com/jQuery.browser
cmegown

Мені подобається ця відповідь, але, як сказав @cmegown, $ .browser зараз застарілий. Що я особисто зробив би натомість (спробую це - я не впевнений, що на 100% це спрацює) - змінити позиціонування елемента з статичного на абсолютне (або навпаки) і побачити, чи є зміна положення елемента порівняно з вікном. Це повинно працювати лише за наявності елемента top:0; left: 0;.
Микола Іванов Ніколов

Я можу підтвердити, що це працювало для мене - я отримую елемент offset (), а потім змінюю його на позицію абсолютного і отримую його зсув () знову, і якщо це не те саме, я завершую його в позицію: Relativ Div. Це працює лише тому, що при абсолютному позиціонуванні я не очікую, що мій елемент змінить своє позиціонування (оскільки це верх: 0; зліва: 0;)
Микола Іванов Ніколов

7
Firefox не «зрозуміє неправильно». Відносно позиціонування комірки таблиці не визначено у специфікації CSS. ( посилання )
користувач2867288

Зараз працює без javascript навіть у Firefox (26). Крім того, це поки що єдина відповідь, яка працювала на мене ...
Томаш Зато - Відновіть Моніку

4

Я пропоную рішення з використанням експериментальний Flexbox для імітації макета таблиці, який дозволить елементу вмісту комірки вертикально заповнити свою батьківську клітинку:

Демо

.table{ display:flex; border:2px solid red; }
.table > *{ flex: 1; border:2px solid blue; position:relative; }
.fill{ background:lightgreen; height:100%; position:absolute; left:0; right:0; }

/* Reset */
*{ padding:0; margin:0; }
body{ padding:10px; }
<div class='table'>
  <aside><div class='fill'>Green should be 100% height</div></aside>
  <aside></aside>
  <aside>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas odio, vitae scelerisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Mauris ante ligula, facilisis sed ornare eu, lobortis in odio. Praesent convallis urna a lacus interdum ut hendrerit risus congue. Nunc sagittis dictum nisi, sed ullamcorper ipsum dignissim ac. In at libero sed nunc venenatis imperdiet sed ornare turpis. Donec vitae dui eget tellus gravida venenatis. Integer fringilla congue eros non fermentum. Sed dapibus pulvinar nibh tempor porta. Cras ac leo purus. Mauris quis diam velit. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus imperdiet, nulla et dictum interdum, nisi lorem egestas odio, vitae scelerisque enim ligula venenatis dolor. Maecenas nisl est, ultrices nec congue eget, auctor vitae massa. Fusce luctus vestibulum augue ut aliquet. Mauris ante ligula, facilisis sed ornare eu, lobortis in odio. Praesent convallis urna a lacus interdum ut hendrerit risus conguet.</p>
  </aside>
</div>


3

після кількох днів пошуку я з’ясував можливе виправлення цієї проблеми.

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Documento sin título</title>
</head>

<body style="height:100%">
<!-- for Firefox and Chrome compatibility set height:100% in the containing TABLE, the TR parent and the TD itself. -->
<table width="400" border="1" cellspacing="0" cellpadding="0" style="height:100%;">  
  <tr>
    <td>whatever</td>
    <td>whatever</td>
    <td>whatever</td>
  </tr>
  <tr style="height:100%;">
    <td>whatever dynamic height<br /><br /><br />more content
</td>
    <td>whatever</td>

    <!-- display,background-color and radius properties in TD BELOW could be placed in an <!--[if IE]> commentary If desired.
    This way TD would remain as display:table-cell; in FF and Chrome and would keep working correctly.    
    If you don't place the properties in IE commentary it will still work in FF and Chorme with a TD display:block;

    The Trick for IE is setting the cell to display:block; Setting radius is only an example of whay you may want a DIV 100%height inside a Cell.
    -->

    <td style="height:100%; width:100%; display:block; background-color:#3C3;border-radius: 0px 0px 1em 0px;">

    <div style="width:100%;height:100%;background-color:#3C3;-webkit-border-radius: 0px 0px 0.6em 0px;border-radius: 0px 0px 0.6em 0px;">
    Content inside DIV TAG
    </div>
     </td>
  </tr>
</table>
</body>
</html>

Іспанська мова: El truco es establecer la Tabla, el TR y el TD a висота: 100%. Є сумісний сумісний FireFox і Chrome. Internet Explorer ignora eso, por lo que ponemos la etiqueta TD como block. Пропонується ознайомитись із дослідником.

Англійське пояснення: у коментарях до коду


3

якщо <table> <tr> <td> <div>всі height: 100%;встановлені, діва заповнює динамічну висоту комірок у всіх браузерах.


1

Добре ніхто про це не згадував, тому я подумав, що опублікую цей трюк:

.tablecell {
    display:table-cell;
}
.tablecell div {
    width:100%;
    height:100%;
    overflow:auto;
}

переповнення: автоматичне використання цього контейнера, діва в комірці, робить для мене трюк. Без нього діва не використовує всю висоту.


1

Якщо комірка таблиці має потрібний вам розмір, просто додайте цей клас css та призначте його своєму div:

.block {
   height: -webkit-calc(100vh);
   height: -moz-calc(100vh);
   height: calc(100vh);
   width: 100%;
}

Якщо ви хочете, щоб комірка таблиці також заповнювала батьківську, призначте клас і для комірки таблиці. Я сподіваюся, що це допомагає.


1

трохи запізнився на вечірку, але ось моє рішення:

<td style="padding: 0; position: relative;">
   <div style="width: 100%; height: 100%; position: absolute; overflow: auto;">
     AaaaaaaaaaaaaaaaaaBBBBBBBbbbbbbbCCCCCCCCCccccc<br>
     DDDDDDDddddEEEEEEEEdddfffffffffgggggggggggggggggggg
   </div>
</td>

1

Оскільки мені не вистачає репутації, щоб розмістити коментар, я хочу додати повне рішення для крос-браузера, яке поєднало підходи @Madeorsk та @ Saadat з деякою незначною модифікацією! (Тестовано на Chrome, Firefox, Safari, IE та Edge станом на 2/10/2020)

table { height: 1px; }
tr { height: 100%; }
td { height: 100%; }
td > div { 
   height: -webkit-calc(100vh);
   height: -moz-calc(100vh);
   height: calc(100%);
   width: 100%;
    background: pink;  // This will show that it works!
} 

Однак якщо ви схожі на мене, ви також хочете контролювати вертикальне вирівнювання, і в цих випадках мені подобається використовувати flexbox:

td > div {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: flex-end;
}

0

Я думаю, що найкращим рішенням буде використання JavaScript.

Але я не впевнений, що вам потрібно це зробити, щоб вирішити проблему розташування елементів на <td>зовнішній стороні комірки. Для цього ви могли зробити щось подібне:

<div style="position:relative">
    <table>
        <tr>
            <td>
                <div style="position:absolute;bottom:-100px">hello world</div>
            </td>
        </tr>
    </table>
</div>

Не в курсі, звичайно, але з класами та ідентифікаторами.


Дякуємо за відповідь. Це працює, якщо мені потрібно розмістити щось відносно таблиці . Мені потрібно розмістити щось поза окремою клітиною, де розташування клітини невідоме.
Джейсон

Ви можете розширити, що містить ця таблиця? і що це за 100% ширина / висота?
meder omuraliev

0

Щоб зробити висоту: 100% робота для внутрішнього діва, ви повинні встановити висоту для батьківського td. Для мого конкретного випадку він працював з використанням висоти: 100%. Це зробило внутрішню висоту Div розтягнутим, тоді як інші елементи таблиці не дозволили td стати занадто великим. Звичайно, ви можете використовувати інші значення, ніж 100%

Якщо ви також хочете, щоб комірка таблиці мала фіксовану висоту, щоб вона не збільшувалась на основі вмісту (щоб внутрішній дів прокручувався або приховував переповнення), тобто тоді у вас немає вибору, але виконайте деякі js-трюки. Батьківський td повинен мати висоту, вказану у відносній одиниці (не%). І вам, швидше за все, не залишиться іншого вибору, окрім як розрахувати цю висоту за допомогою js. Для цього також знадобиться макет таблиці: фіксований стиль для елемента таблиці


0

Я стикаюся з подібними проблемами часто і завжди використовувати тільки table-layout: fixed;на tableелементі і height: 100%;на внутрішніх справах.


0

Я в кінцевому підсумку не знайшов нічого, що працювало б у всіх моїх браузерах та всіх DocTypes / режимах візуалізації браузера, за винятком використання jQuery. Отже ось що я придумав.
Він навіть враховує ширину рядків.

function InitDivHeights() {
    var spacing = 10; // <-- Tune this value to match your tr/td spacing and padding.
    var rows = $('#MyTable tr');
    var heights = [];
    for (var i = 0; i < rows.length; i++)
        heights[i] = $(rows[i]).height();
    for (var i = 0; i < rows.length; i++) {
        var row = $(rows[i]);
        var cells = $('td', row);
        for (var j = 0; j < cells.length; j++) {
            var cell = $(cells[j]);
            var rowspan = cell.attr('rowspan') || 1;
            var newHeight = 0;
            for (var k = 0; (k < rowspan && i + k < heights.length); k++)
                newHeight += heights[i + k];
            $('div', cell).height(newHeight - spacing);
        }
    }
}
$(document).ready(InitDivHeights);

Тестовано в IE11 (Edge mode), FF42, Chrome44 +. Не тестується з вкладеними таблицями.


ну, зараз це легко за допомогою флешбоксу. це старе питання!
Джейсон

@ Джейсон спасибі, але нам це було потрібно для роботи в IE10 / IE11, які обидва мають часткову / глючну підтримку flexbox відповідно до caniuse.com/#feat=flexbox, а також github.com/philipwalton/flexbugs . Можливо, пізніше ...
Петро B


0

Якщо розташований елемент та його батьківський елемент не мають ширини та висоти, тоді встановіть

padding: 0;

в його батьківському стихії,


0

Це, мабуть, не рекомендується.

Я зрозумів, що вирішення може працювати, якщо ваш div не містить тексту та має рівномірний фон.

display: 'list-item'

дає діву бажану висоту та ширину, але з великим недоліком наявності кулі списку. Оскільки в div є однорідний фоновий колір, я позбувся кулі з такими стилями:

list-style-position: 'inside',
color: *background-color*,

-1

Я не впевнений, що ви хочете зробити, але ви можете спробувати це:

<td width="661" valign="top"><div>Content for New Div Tag Goes Here</div></td>


-1

Наступне має працювати. Ви повинні встановити висоту батьківської комірки. https://jsfiddle.net/nrvd3vgd/

<table style="width:200px; border: 1px solid #000;">
    <tr>
        <td style="height:100px;"></td>
    </tr>
    <tr>
        <td style="height:200px;">
            <div style="height:100%; background: #f00;"></div>
        </td>
    </tr>
</table>

-1

Спробуйте це:

<td style="position:relative;">
    <div style="position:absolute;top:0;bottom:0;width:100%;"></div>
</td>

-2

Спробуйте помістити display: блок таблиці всередину комірки


1
Що ви маєте на увазі під "відображення: блок таблиці"? Будь ласка, подумайте про перегляд та форматування своєї відповіді
Pmpr

-2

Я не дивлюся тут старий CSS-трюк для < div > inside < td >. Звідси нагадую: просто встановити деяке мінімальне значення для ширини , але те, що вам потрібно для мінімальної ширини . Наприклад:

<div style="width: 3px; min-width: 99%;">

В TD ширина «с, в цьому випадку, це до вас.


-9

Це моє рішення для розширення 100% висоти та 100% ширини в HTML <td>

якщо ви видалите перший рядок у своєму коді, ви можете його виправити ...

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

тому що цей doctype не дозволяє в деяких файлах використовувати 100% відсотків всередині <td>, але якщо ви видалите цю лінію, тіло не вдається розширити фон на 100% висоту і 100% ширину, тому я знайшов це, DOCTYPEщо вирішує проблему

<!DOCTYPE html PUBLIC "-//IETF//DTD HTML 2.0//EN">

цей ДОКТИП дозволяє вам розширити фон у вашому тілі на 100% висоту і 100% ширину, а також ви зможете взяти всі 100% висоти та 100% ширини в <td>


3
Краще не возитися з вченням. Ви, здається, не знаєте всіх наслідків. Зміна Doctypes може мати багато побічних ефектів (так це робить більшість речей у світі CSS, плачевно).
Рольф
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.