Як зробити <div> fill <td> висотою


99

Я переглянув кілька публікацій на StackOverflow, але не зміг знайти відповідь на це досить просте запитання.

У мене є така конструкція HTML:

<table>
  <tr>
    <td class="thatSetsABackground">
      <div class="thatSetsABackgroundWithAnIcon">
        <dl>
          <dt>yada
          </dt>
          <dd>yada
          </dd>
        </dl>
      <div>
    </td>
    <td class="thatSetsABackground">
      <div class="thatSetsABackgroundWithAnIcon">
        <dl>
          <dt>yada
          </dt>
          <dd>yada
          </dd>
        </dl>
      <div>
    </td>
  </tr>
</table>

Що мені потрібно для того, divщоб заповнити висоту td, тому я можу розташувати фон div (значок) у правому нижньому куті td.

Як ви пропонуєте мені це зробити?


Відповіді:


177

Якщо ви надаєте TD-тобі висоту в 1 пікс, то у дочірнього діва буде підвищений батько, щоб обчислити його на% від. Оскільки ваш вміст буде більшим на 1px, td автоматично зростатиме, як і div. Якийсь смітник, але я впевнений, що це спрацює.


7
Хоча, здається, він працює в веб-кайті, IE9 повністю виходить з ладу.
Даніель Іммс

Працюйте для мене в IE11 лише тоді, коли я також встановив div на вбудований блок. Дякую!
Danny C

5
Ось рішення, яке також працює у Firefox: stackoverflow.com/questions/36575846/…
Wouter

Щоб він працював як у Firefox, так і в Chrome, мені довелося використовувати min-height: 1px;замістьheight: 1px;
Matt Leonowicz

🤯 Я не впевнений, подобається мені CSS чи ненавиджу його
noob

35

Висота CSS: 100% працює лише в тому випадку, якщо батьківський елемент має чітко визначену висоту. Наприклад, це діятиме так, як очікувалося:

td {
    height: 200px;
}

td div {
    /* div will now take up full 200px of parent's height */
    height: 100%;
}

Оскільки здається, що ваша <td>буде змінюватись по висоті, що робити, якщо ви додали нижній правий значок із абсолютно розміщеним зображенням на зразок:

.thatSetsABackgroundWithAnIcon {
    /* Makes the <div> a coordinate map for the icon */
    position: relative;

    /* Takes the full height of its parent <td>.  For this to work, the <td>
       must have an explicit height set. */
    height: 100%;
}

.thatSetsABackgroundWithAnIcon .theIcon {        
    position: absolute;
    bottom: 0;
    right: 0;
}

З розміткою комірки таблиці так:

<td class="thatSetsABackground">  
  <div class="thatSetsABackgroundWithAnIcon">    
    <dl>
      <dt>yada
      </dt>
      <dd>yada
      </dd>
    </dl>
    <img class="theIcon" src="foo-icon.png" alt="foo!"/>
  </div>
</td>

Редагувати: за допомогою jQuery встановити висоту div

Якщо ви зберігаєте <div>в якості дитини дитини <td>цей фрагмент jQuery правильно встановить його висоту:

// Loop through all the div.thatSetsABackgroundWithAnIcon on your page
$('div.thatSetsABackgroundWithAnIcon').each(function(){
    var $div = $(this);

    // Set the div's height to its parent td's height
    $div.height($div.closest('td').height());
});

Це могло б спрацювати. Дозвольте мені повернутися до вас, коли я спробував. Я прочитав цю тему і зрозумів, що <div> потребує вказаної висоти, щоб мати можливість масштабувати до 100%. З того, що я прочитав, це було можливо зробити з jQuery, оскільки він може обчислити це для мене.

2
Я насправді працював не так добре, і ми вирішили інший підхід. Але я прийму вашу відповідь, оскільки вона найкраща навколо.

3
Хах, якби я був долар за кількість разів CSS змусило мене змінити свій підхід :)
Pat

5
Я єдиний, хто думає, що "висота CSS: 100% працює лише у тому випадку, коли батьківський елемент має чітко визначену висоту" - це дійсно німе правило? У будь-якому випадку браузер визначає висоту батьківського елемента; немає ніякого способу , ви повинні явно встановити висоту батьківського елемента.
Jez

1
рішення jquery працювало, хоча лише тоді, коли я розмістив його в кінці файлу, дякую
luke_mclachlan

5

Ви можете спробувати змусити ваш div плавати:

.thatSetsABackgroundWithAnIcon{

    float:left;
}

Альтернативно, використовуйте вбудований блок:

.thatSetsABackgroundWithAnIcon{

    display:inline-block;
}

Робочий приклад методу вбудованого блоку:

table,
th,
td {
  border: 1px solid black;
}
<table>
  <tr>
    <td>
      <div style="border:1px solid red; height:100%; display:inline-block;">
        I want cell to be the full height
      </div>
    </td>
    <td>
      This cell
      <br/>is higher
      <br/>than the
      <br/>first one
    </td>
  </tr>
</table>


Float: ліва пропозиція не працює. Цю відповідь можна було б покращити, видаливши її, оскільки, здається, працює друге рішення.
Wouter

1
Це не стосується Firefox. Здається, це працює лише з Chrome.
YLombardi

8
Цей фрагмент також не працює на Chromium, принаймні зараз (я використовую 63.0.3239.84).
Майкл

0

Дійсно доводиться це робити з JS. Ось рішення. Я не використовував імена вашого класу, але я назвав div у назві класу td "full-height" :-) Очевидно, що використовується jQuery. Зверніть увагу, що це було викликано з jQuery (документ) .ready (function () {setFullHeights ();}); Також зверніть увагу, якщо у вас є зображення, вам доведеться спочатку повторити їх через щось на зразок:

function loadedFullHeights(){
var imgCount = jQuery(".full-height").find("img").length;
if(imgCount===0){
    return setFullHeights();
}
var loaded = 0;
jQuery(".full-height").find("img").load(function(){
    loaded++;
    if(loaded ===imgCount){
        setFullHeights()
    }
});

}

І замість цього ви хочете зателефонувати навантаженийFullHeights () з docReady. Це власне те, що я в підсумку використав про всяк випадок. Треба думати заздалегідь, ви знаєте!

function setFullHeights(){
var par;
var height;
var $ = jQuery;
var heights=[];
var i = 0;
$(".full-height").each(function(){
    par =$(this).parent();
    height = $(par).height();
    var tPad = Number($(par).css('padding-top').replace('px',''));
    var bPad = Number($(par).css('padding-bottom').replace('px',''));
    height -= tPad+bPad;
    heights[i]=height;
    i++;
});
for(ii in heights){
    $(".full-height").eq(ii).css('height', heights[ii]+'px');
}

}



-4

Змініть фонове зображення самого <td>.

Або застосуйте деякий css до div:

.thatSetsABackgroundWithAnIcon{
    height:100%;
}

як я пишу в коді. TD вже має набір фонових зображень за допомогою класу. Тож цей варіант нежиттєздатний. Я спробував встановити висоту дива на 100%, але це не працює. Він просто обертається до змінної висоти вміщеного <dl>. Отже, потрібно щось зробити, щоб div "зрозумів", що він повинен заповнити висоту. І висота: 100% цього не робить. (принаймні не один)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.