CSS表示:幅が100%に設定されている場合、テーブル行が拡張されない


95

少し問題があります。私はFireFox 3.6を使用しており、次のDOM構造があります。

<div class="view-row">
    <div class="view-type">Type</div>
    <div class="view-name">Name</div>                
</div>

そして次のCSS:

.view-row {
width:100%;
display:table-row;
}

.view-name {
display: table-cell;
float:right;
}

.view-type {
display: table-cell;
}

脱ぐdisplay:table-rowと正しくview-row表示され、幅は100%になります。戻すと縮みます。私はこれをJS Binに載せました:

http://jsbin.com/ifiyo

どうしたの?

回答:


90

display:table-row等を使用している場合は、適切なマークアップが必要です。これには、包含テーブルが含まれます。それがなければ、あなたの元の質問は基本的に同等の悪いマークアップを提供します:

<tr style="width:100%">
    <td>Type</td>
    <td style="float:right">Name</td>
</tr>

上の表はどこですか?あなただけの(trがどちらかに含まれている必要がありどこからともなく行を持つことができないtabletheadtbodyなど、)

代わりに、で外側の要素を追加display:tableし、包含要素に100%の幅を置きます。内側の2つのセルは自動的に50/50になり、テキストを2番目のセルの右に揃えます。floatsテーブル要素を忘れます。それは非常に多くの頭痛を引き起こすでしょう。

マークアップ:

<div class="view-table">
    <div class="view-row">
        <div class="view-type">Type</div>
        <div class="view-name">Name</div>                
    </div>
</div>

CSS:

.view-table
{
    display:table;
    width:100%;
}
.view-row,
{
    display:table-row;
}
.view-row > div
{
    display: table-cell;
}
.view-name 
{
    text-align:right;
}

11
+5フロートを取り除くのに!
偶然の確率

37
-1説明が間違っているため。CSS2.1仕様によれば、問題のマークアップ/ CSSが機能するはずです。
user123444555621

8
ブラウザーには、テーブルの欠落に関する問題はありません(Firefox 3.0に ...)実際の問題は、テーブルの行の幅設定が完全​​に無視されることです。(つまり、問題のマークアップ/ CSSが実際に期待どおりに機能しないため、上記の私のコメントは間違っていました;))
user123444555621

3
この答えは間違っています。質問者のマークアップは正しいです。Pumbaa80が言うように、問題は幅がテーブルレベルではなく行レベルでなければならないことを想定することです。幅はテーブルレベルでのみ解釈されます。行は完全に省略できます。以下の私の完全な回答を参照してください。
アミンアリアナ

1
私はうまくいく答えについてコメントしていませんでした。CSSにテーブル行を含める必要があるというコメントにコメントしました。あなたはしません。あなたの個人的な信念のために何かが疑似的に有効であると言うことは、非常に独断的/厳格なことです。特にCSSが完全に有効な場合。
ビルロスマス

56

テストされた答え:

.view-row cssで、次のように変更します。

display:table-row;

に:

display:table

そして「フロート」を取り除きます。すべてが期待どおりに機能します。

コメントで提案されているように、ラッピングテーブルは必要ありません。CSSでは、暗黙的なツリー構造のレベル(この場合は行)を省略できます。コードが機能しないのは、「幅」がテーブル行レベルではなくテーブルレベルでしか解釈できないためです。「テーブル」があり、そのすぐ下に「テーブルセル」がある場合、それらは暗黙的に並んでいると解釈されます。

作業例:

<div class="view">
    <div>Type</div>
    <div>Name</div>                
</div>

CSS付き:

.view {
  width:100%;
  display:table;
}

.view > div {
  width:50%;
  display: table-cell;
}

あなたの答えは、<table><td></td></table>それ自体ではW3Cによる無効なHTMLマークアップになるCSSの同等物を示唆しています。それは検証されますが、なぜこのマークアップを模倣するようにブラウザに指示することを提案するのですか?
KP。

16
これはCSSルール(w3.org/TR/CSS2/tables.html#anonymous-boxes)によって正しいです。不要なコード行を削除することにより、保守が容易になります(たとえば、KPによって提案された不要な<view-row> div)。これは私を助けました...私はそれを使っています。+1
ビルロスマス2012

1
floatステートメントを取り除くだけで十分ではないでしょうか?.view divは、表示を維持できます:テーブル行プロパティ。
表意文字'19

1
それは良いです、~~しかしIE9では私の知る限り動作しません。~~私は間違っています。それは素晴らしい!:)
f1lt3r

もちろん表示:1行以上ある場合、テーブルは役に立ちません。それらはすべてひどく整列していません
edc65

16

CSS3仕様によると、レイアウトをテーブルスタイルの要素でラップする必要はありません。ブラウザは、含まれている要素が存在しない場合にその存在を推測します。


4
CSS 2.1、セクション17.2.1、トップ3.2でもまったく同じことが指定されています。以下のHBOX / VBOXの例がまさに問題のケースです。したがって、ブラウザは気にしないように見えます。
user123444555621

1

.view-typeクラスを譲るfloat:left;float:right;.view-name

編集:<div class="view-row">たとえば、div を別のdivでラップします<div class="table">

次のCSSを設定します:

.table {
    display:table;
    width:100%;}

正しい結果を得るには、テーブル構造を使用する必要があります。


私はff3.6、つまり8、chrome、operaでテストしました。ここjsbin.com/ifiyo/4に並べて表示できます
Sotiris

私は右端に名前、左端に入力する名前を探していました...表示:インラインで両方を表示し、表示を取り出す場合:テーブル行は機能しますが、もっと良い方法があると考えていましたtable-row / cellプロパティを使用してそれを行います。
チャンスのチャンス

0

テーブル内に直接テーブルセルをネストできます。テーブルがあります。テーブル行のいずれかを開始しても機能しません。次のHTMLでお試しください。

<html>
  <head>
    <style type="text/css">
.table {
  display: table;
  width: 100%;
}
.tr {
  display: table-row;
  width: 100%;
}
.td {
  display: table-cell;
}
    </style>
  </head>
  <body>

    <div class="table">
      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>
    </div>

      <div class="tr">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
      </div>

    <div class="table">
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
        <div class="td">
          X
        </div>
    </div>

  </body>
</html>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.