<div>を<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です。

どのように私はそれについて行くことを提案しますか?


回答:


175

TDに1pxの高さを与えると、子divには高さのある親があり、%を計算します。コンテンツは1pxよりも大きいため、tdはdivと同様に自動的に大きくなります。ちょっとガベージハックですが、うまくいくと思います。


7
Webkitでは問題なく動作するようですが、IE9は完全に機能しなくなります。
Daniel Imms

divもinline-blockに設定した場合にのみ、IE11で機能します。ありがとう!
ダニーC

5
Firefoxでも機能するソリューションは次のとおりです。stackoverflow.com
36575846

FirefoxでもChromeでも機能させるには、min-height: 1px;代わりに使用する必要がありましたheight: 1px;
Matt Leonowicz

CSS 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で計算することができるので、jQueryでそれを行うことができました。

2
私はあまりうまくいかなかったので、別のアプローチをとることにしました。しかし、私はあなたの答えが一番良いので受け入れます。

3
ほら、CSSが私のアプローチを変えさせてくれた回数に1ドルしかなかったとしたら:)
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:leftの提案が機能しないようです。上記の2番目の解決策は機能するように見えるため、この回答はそれを削除することで改善される可能性があります。
Wouter

1
Firefoxにはありません。Chromeでのみ動作するようです。
YLombardi 2016

8
このスニペットは、少なくとも最近ではChromiumでも機能しません(私は63.0.3239.84を使用しています)。
Michael

0

本当にJSでこれを行う必要があります。これが解決策です。私はクラス名を使用しませんでしたが、「フルハイト」のtdクラス名内でdivを呼び出しました:-) jQueryを使用したことは明らかです。これはjQuery(document).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()
    }
});

}

代わりに、docReadyからloadedFullHeights()を呼び出します。これは実際に念のため使用したものです。あなたはあなたが知っている前に考えるようになりました!

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には、クラスを使用した背景画像セットがすでにあります。したがって、そのオプションは実行できません。divの高さを100%に設定してみましたが、うまくいきません。含まれている<dl>の可変高さにラップするだけです。したがって、divが高さを満たす必要があることを「理解」するために何かが必要です。そして高さ:100%はそれをしません。(少なくとも1人ではない)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.