• ベストアンサー

親要素のwidthは子要素のwidthに関係ないのでしょうか?

お世話になります。 HTMLに疎いプログラマです。。。 タイトルの通りですが、質問があります。 たとえば <div>  <table>  </table> </div> のように親要素(div)と子要素(table)があるとします。 この時、<table>がものすごく横長の場合(横スクロールが必要なほど)、その横幅に応じて親要素のdivは横に伸びないのでしょうか? 上記のソースにCSSでborderで線を表示してみたのですが、 <table>は横長になっているにもかかわらず、親の<div>は画面内に収まっているのです。 僕の思惑は、<table>が横に伸びればその親要素である<div>も子要素に応じて横に伸びてほしいのですが、、、。 それができる方法があれば教えて頂きたいです。 それは無理だという仕様であればあきらめます。 どうかお願いいたします。

  • HTML
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • abril
  • ベストアンサー率69% (388/560)
回答No.1

> <table>がものすごく横長の場合(横スクロールが必要なほど)、その横幅に応じて親要素のdivは横に伸びないのでしょうか? 下記の様なサンプルの場合、 ------------------------------------------------------------ 【HTML】 ------------------------------------------------------------ <div class="hoge"> <table class="hoge_child" summary="hoge"> <tr> <th>項目名</th> <td>内容</td> </tr> </table> </div> ------------------------------------------------------------ 【CSS】 ------------------------------------------------------------ div.hoge { width: 100px; border: solid 1px #c00; padding: 10px 0; } table.hoge_child { width: 200px; border-collapse: collapse; border: solid 1px #000; } table.hoge_child th, table.hoge_child td { border: solid 1px #000; } ------------------------------------------------------------ IE6では親要素の"width: 100px;"を無視して子要素の"width: 200px;"に引っ張られて親要素div.hogeも伸びてしまいますが、Firefox等では質問者様がご覧になった様な状態(div.hogeはあくまで"width: 100px;"でレンダリングされ、table.hoge_childはdiv.hogeの枠をはみ出して表示される)になりますね。 環境によって解釈が違います。 親要素の幅を子要素に依存したいのであれば、親要素の幅を決めない事です。div.hogeにwidthが指定されていなければ、div.hogeは子要素table.hoge_childの長さに合わせて伸びますので。

_chihiro_
質問者

お礼

すみません><ブラウザを記していませんでした。 僕が確認したのはFireFox3です。 abrilさんのおっしゃるとおり、IEとFireFoxとで挙動が異なりました。 とても参考になりました。ありがとうございます!

その他の回答 (2)

回答No.3

ANo.2です。もう少しまともな解決法がありました。 divに対して「display:table;」でうまくいくかもしれません。

回答No.2

非常に美しくない手ですが、 <table><tr><td> <div>  <table>  </table> </div> </td></tr></table> で、目的の挙動になるかと思います。 (CSS以前の前時代的解決方法ですが。)

_chihiro_
質問者

お礼

なるほど、だいぶトリッキーな方法もあるのですね。 参考になります。ありがとうございました。

関連するQ&A

  • table要素のwidthの解釈

    tableタグを使って次のようなことをしたいと考えています。 ・table要素の親はdiv要素 ・div要素にはサイズ(width/height)が指定されており、overflow:hiddenとしてある。 ・table要素にはサイズを指定しない ・td要素にはサイズを指定する →つまり、tableのサイズはtdのサイズで決定する HTML/CSSは次の通りです。 ----------------------------------------------------- div { width: 300px; overflow: hidden; } table { table-layout: fixed; } td { width: 170px; } <div> <table><tr> <td>a</td><td>b</td><td>c</td> </tr></table> </div> ----------------------------------------------------- このコードを「DOCTYPE宣言を書かずに」IE8で開くと、想定通りの表示になりますが、 <!DOCTYPE html>と記述すると、tableの横幅が300pxに詰められてしまいます。 td要素のwidth指定が働かず、親のdiv要素のwidthに無理やり押し込められてしまうようです。 また、FirefoxではDOCTYPE宣言無しでも同様の問題が起きてしまいます。 table内の列数は固定ではないので、tableに対してwidth指定はしたくありません。 何か書き方が間違っているのでしょうか。 あるいは、標準準拠モードの仕様では、そもそもできないことをやろうとしているのでしょうか。

  • CSS スタイルを子要素の子要素に継承させたくない

    スタイルシートについてまだ初心者なため質問させてください。 以下のようにテーブルのボーダーのスタイルを子要素(<table><td>)にスタイルを継承(?)させているのですが、この方法だと子要素の子要素(<table><td><table><td>)に対しても継承されてしまいます。 table.border { border-style:solid; border-width: 1px 1px 1px 1px; border-collapse: collapse; } table.border td { border-style:solid; border-width: 1px 1px 1px 1px; } table.border > td {…} という指定の方法もあるようですが、こちらは対応しているブラウザが乏しいようで事実上使用できません。 子要素の子要素に対して以下のクラスを指定しても継承が優先されるためか反映されませんでした。 table.none { border-style:none; } table.none td { border-style:none; } HTMLタグに直接以下のように指定しても同様でした。 <table style="border-style:solid;"> どこかのサイトでは継承をリセットする必要があるような事が書いてあったような気がします。 もちろん継承を利用せず<table>および<td>個々にクラスを指定すれば(不必要なタグには指定しなければ)可能だと思いますが、これだと大きなテーブルの場合に非効率で悩んでいます。 どのようにすれば子要素の子要素にスタイルを継承させないようにできるでしょうか?

    • ベストアンサー
    • CSS
  • borderプロパティによる線の表示でdiv要素とp要素で囲った場合の違い

    下の記述例で質問があります。 CSSソース kbd { margin: 0 0.3em; padding: 0.1em 0.3em; border: 1px solid black; } HTMLソース <div> <kbd>keybord</kbd>と入力してください。 </div> このような記述のとき、IE7ではkbd要素を囲っている下の線が消えてしまいます。 しかし、HTMLソースを、 <div> <p> <kbd>keybord</kbd>と入力してください。 </p> </div> のようにdiv要素内にkbd要素をp要素で囲ってやると下の線が現われます。 div要素ではダメ(下の線が消える)なのに、なぜp要素では下の線が現われるのでしょうか?この違いが分かりません。 回答よろしくお願いします。

    • ベストアンサー
    • HTML
  • divの横幅 自動調整

    PHP + MySQL +html + CSS で動的テーブルを表示するサイトを制作しています。 <div id="○○○"> <table></table> </div> といったように、中のテーブルをdivで囲ってコーディングしています。 外側をdivで囲い横幅を指定してあげて、テーブルに横スクロールバーを表示させているのですが、divで指定した横幅よりもテーブルの横幅が短くなった場合、外のdivの幅がテーブルに合わせて短くならないのですが、このような場合、何か対処法はございますでしょうか。 superTable.jsを使用しており、このjsの使用がテーブルの外側にdivをおき、cssを使ってdiv側にスクロールバーを表示される仕様になっております。 以上、よろしくお願い致します。

    • ベストアンサー
    • CSS
  • 子要素のスクロールが親要素に伝播しないようにしたい

    スクロールバーを持つ子要素 と その親要素であるwindow があり、 子要素のスクロール位置が一番上にある状態で、上に向かってホイールスクロールすると親要素windowのスクロールバーが動いてしまいます。 また、その逆に 子要素のスクロール位置が一番下にある状態で、下に向かってホイールスクロールすると親要素windowのスクロールバーが動いてしまいます。 この挙動をやめたいのですがどのようにすればよいでしょうか。 具体的にはFacebookの右上(外側のサイドバーの上)にあるフレンドのアクティビティを表示している領域の様な動作にしたいです。 下記コードでは実現出来ませんでした。 $("#sample").on('scroll mousewheel', function(event) { event.stopPropagation(); }); ライブラリはjqueryを使っています。 よろしくお願いします。

  • floatした要素を親要素に対して左右ピッタリに収める

    タイトルのとおり、CSSのfloatを使ってある要素を横にレイアウトします。 この要素は増減します。マージンを使って要素の右に隙間を作りますが、一番右にくる要素にも同じマージンがつくので、親要素に対して右端に不要な隙間ができます。 3つ以上の要素をfloatを使って左右一杯に配置するにはどうすればいいのでしょうか。IE6をメインに、safari1.0やfirefoxでも実現できる方法を教えてください。 ソースはこんな感じです。 【HTML】 <div> <p><img src="○○○○" width="150" height="150" /></p> <p><img src="○○○○" width="150" height="150" /></p> <p><img src="○○○○" width="150" height="150" /></p> <p><img src="○○○○" width="150" height="150" /></p> ・ ・ ・ </div> 【CSS】 div{ width:800px;} p{ width:150px; float:left; margin-left:50px;} この場合、4つ目の要素の右にも50pxの空間ができます。 800pxの中に、均等割付けできればと思います。 よろしくお願いいたします。

  • CSSで・・・!

    CSSでDIV要素を使ってレイアウトしているのですが、このNHK公式サイトのメインテーブルの右端にある小さいグラデーションのようにするにはどうすればいいでしょうか。 http://www.nhk.or.jp/ HTMLのTABLEなら、横に2セル作り、1セル目(メイン)の横幅を指定し、2セル目(グラデーション)の横幅を指定(グラデーション画像の横幅)、そしてグラデーション画像を背景に指定すればできますが、CSSではどうすればいいでしょうか。 どなたかお願い致します。

    • ベストアンサー
    • HTML
  • 一部ページのtableのボーダーをCSSで消す方法。

    一部ページのtableのボーダーをCSSで消す方法。 あるページのtableだけボーダーを消したいと思い、 そのページの<table></table> を <div class="item"></div> で囲い以下のようにCSS側に書き込みました。 .item table,th,td{ border:none } が、この命令が<div class="item"></div>で囲まれていない全ページに適応されてしまい、全てのtable要素のボーダーが消えてしまいます。。 所定のページのtable要素のボーダーのみの消し方を教えて頂けないでしょうか? CSS側の記述する順番にも影響があるのでしょうか? 宜しくお願い致します。

    • ベストアンサー
    • HTML
  • Table内TDの子要素を移動させたいのですが・・

    初心者的な質問になるかもしれませんが、宜しくお願いします。 唐突ですが、こんなTable付きのHTMLがあります(ちょっと省略してます)。 <DIV>.....</DIV> ← (*) <Table> <TR> <TD>  ← (1) <SCRIPT ........</SCRIPT> <A HREF="">........</A> <LI> <DIV class ..... </DIV> <DIV class ..... </DIV> <DIV class ..... </DIV> <LI> </TD> <TD>  ← (2) <LI> <DIV class ..... </DIV> <DIV class ..... </DIV> <DIV class ..... </DIV> <LI> </TD> <TD>  ← (3) <LI> <DIV class ..... </DIV> <DIV class ..... </DIV> <DIV class ..... </DIV> <LI> </TD> </TABLE> (1)は複数の子要素があり、(2)と(3)はLI要素(ただし、その中に複数要素がある)です。 この(1)~(3)のTDの子要素部分だけを抽出し、(*)の DIVタグの真下に移動させるようなjquery文を作りたいのですが、 http://d.hatena.ne.jp/replication/20120113/1326382090 等の記事を参考に、 var cells, tblcell; // テーブルタグを探して、1番目のテーブルを取得する var rows = $("table")[0].rows; // 列を1つずつ取り出す $.each(rows, function(i) { cells = rows[i].cells; // 行を1つずつ取り出す $.each(cells, function() { // tdタグの値を書き換える tblcell = $(this).detach(); console.log(tblcell); // tdタグのスタイルシートを書き換える $('div').after(tblcell); }); }); このやり方だとrowの性質上、DIVの下へTD付きでそのまま来てしまいます。 そうではなく、TD直下のHTMLだけをそのままDIVの直下へつなげるように放り込みたいのですが、 中々うまいやり方がみつかりません・・・ なにか、よい方法はございませんでしょうか?

  • 高さを指定せずに子divにスクロールバー

    お世話になっております。 内包されたdivにスクロールバーをつけたいのですが、高さを指定したくない場合はどうすれば良いでしょうか? 何がしたいのかと言えば 高さを規定した親div内に、問題の子divを入れます。 この子divにoverfllow:auto;を効かせて、中のテキストがはみ出した場合にスクロールバーを表示させたいです。 問題はその子divの上部にもほかの要素が加わり、その内容量が動的に変わるので、スクロールバーを出したいdivの高さを指定することができないのです。 高さを指定しなければ、overfllowでスクロールバーを出せません…。 cssで解決する方法は御座いますでしょうか? お詳しい方、何卒ご教授下さい。 だいぶ簡略化したものですが、下記コードがイメージに近いです。 汚いコードですが・・・ <style type="text/css"> <!-- *{margin:0;padding:0;} --> </style> <body> <div style="width:500px;height:150px;border:1px solid #555;margin:10px;"> <p style="width:50px;height:150px;float:left;background:#ccc;">ナビ。float:leftしてます。</p> <div style="width:450px;float:left;"> <p>ここに文章や画像・リストがきます。高さはページごとに変わります。</p> <div style="border:1px solid #aaf;overfllow:scroll;">子divです。わかりやすいよう、overfllowはscrollにしてあります。<br /> (「親divの高さ」-「他の要素の高さ」)<「本文の量」のとき、スクロールバーを表示させたいです。<br /> 高さを規定すべきですが、↑要素の内容量がページごとに変わるため、難しいです。<br /> cssのみで解決することは可能でしょうか?無理であれば、javascript等でも構いません。<br /> 何卒宜しくお願い致します。<br /> 本文本文本文<br />本文本文本文<br />本文本文本文<br />本文本文本文<br /> </div> </div> </div> </body>

    • 締切済み
    • CSS

専門家に質問してみよう