テーブルを使用せずにこのHTMLレイアウトを実行できますか?


102

わかりました、1〜2週間前に単純なレイアウトの問題がありました。つまり、ページのセクションにはヘッダーが必要です。

+---------------------------------------------------------+
| Title                                            Button |
+---------------------------------------------------------+

かなりシンプルなもの。テーブルの憎しみはWebの世界で引き継がれているようですが、テーブルの代わりにHTMLフォームに定義リスト(DL、DD、DT)タグを使用する理由を尋ねたときに思い出しました これで、テーブルとdivs / CSSの一般的なトピックが以前に説明されました。次に例を示します。

したがって、これはレイアウト用のCSSとテーブルについての一般的な議論を意図したものではありません。これは単に1つの問題の解決策です。私はCSSを使用して上記のさまざまな解決策を試しました:

  • ボタンまたはボタンを含むdivの右にフロートします。
  • ボタンの相対位置。そして
  • 相対+絶対位置。

これらの解決策はどれも、さまざまな理由で満足できるものではありませんでした。たとえば、相対的な配置により、コンテンツの下にドロップダウンメニューが表示されるというZ-indexの問題が発生しました。

だから私は戻って行くことになりました:

<style type="text/css">
.group-header { background-color: yellow; width: 100%; }
.group-header td { padding: 8px; }
.group-title { text-align: left; font-weight: bold; }
.group-buttons { text-align: right; }
</style>
<table class="group-header">
<tr>
  <td class="group-title">Title</td>
  <td class="group-buttons"><input type="button" name="Button"></td>
</tr>
</table>

そして、それは完全に機能します。それは簡単で、後方互換性があり(おそらくIE5でも動作します)、動作します。配置やフロートをいじる必要はありません。

それで、誰もテーブルなしで同等のことをすることができますか?

要件は次のとおりです。

  • 下位互換性: FF2およびIE6に対応
  • 合理的に一貫している:異なるブラウザー間;
  • 垂直方向中央:ボタンとタイトルの高さが異なります。そして
  • 柔軟性:配置(パディングやマージン)とスタイル設定を合理的に正確に制御できます。

余談ですが、今日、興味深い記事をいくつか見つけました。

編集:フロートの問題について詳しく説明しましょう。この種の作品:

<html>
  <head>
    <title>Layout</title>
    <style type="text/css">
      .group-header, .group-content { width: 500px; margin: 0 auto; }
      .group-header { border: 1px solid red; background: yellow; overflow: hidden; }
      .group-content { border: 1px solid black; background: #DDD; }
      .group-title { float: left; padding: 8px; }
      .group-buttons { float: right; padding: 8px; }
    </style>
  </head>
  <body>
    <div class="group-header">
      <div class="group-title">This is my title</div>
      <div class="group-buttons"><input type="button" value="Collapse"></div>
    </div>
    <div class="group-content">
      <p>And it works perfectly. It's simple, as backward compatibile as it gets (that'll work probably even on IE5) and it just works. No messing about with positioning or floats.</p>
      <p>So can anyone do the equivalent without tables that is backwards compatible to at least FF2 and IE6?</p>
      <p>On a side note, I came across a couple of interesting articles today:</p>
    </div>
  </body>
</html>

おかげAntのPのためのoverflow: hidden部品(まだ、なぜけれども得ることはありません)。ここで問題が発生します。タイトルとボタンを垂直方向に中央揃えにしたいとします。要素の高さが異なるため、これには問題があります。これと比較してください:

<html>
  <head>
    <title>Layout</title>
    <style type="text/css">
      .group-header, .group-content { width: 500px; margin: 0 auto; }
      .group-header { border: 1px solid red; background: yellow; overflow: hidden; }
      .group-content { border: 1px solid black; background: #DDD; }
      .group-header td { vertical-align: middle; }
      .group-title { padding: 8px; }
      .group-buttons { text-align: right; }
    </style>
  </head>
  <body>
    <table class="group-header">
    <tr>
      <td class="group-title">This is my title</td>
      <td class="group-buttons"><input type="button" value="Collapse"></td>
    </tr>
    </table>
    <div class="group-content">
      <p>And it works perfectly. It's simple, as backward compatibile as it gets (that'll work probably even on IE5) and it just works. No messing about with positioning or floats.</p>
      <p>So can anyone do the equivalent without tables that is backwards compatible to at least FF2 and IE6?</p>
      <p>On a side note, I came across a couple of interesting articles today:</p>
    </div>
  </body>
</html>

完璧に動作します。


11
「vimにはどの色を使用すればよいですか?」私の特定のCSSレイアウトの問題は反対票を投じられます。
cletus 2009


どんな場合でも、テーブルなしで何でも好きなことができます。また、なぜ@SamBがこの2年前の質問にぶつかったのですか?DOH +
動的

3
@ yes123:まあ、構文の強調表示が間違っていた...
SamB

回答:


50

迅速かつ正確に作業を行うために利用できるツールを使用することに問題はありません。

この場合、テーブルは完全に機能しました。

私は個人的にはこのためにテーブルを使用したでしょう。

入れ子になったテーブルは避けた方がいいと思います。


21
表形式のデータではなくプレゼンテーションレイアウトにテーブルを使用している場合を除きます。これは、最初は淡い方が簡単だからです。その場合、暗くて危険な道に向かいます。
1つのクレヨン

9
Amazonでさえ、特定のケースでテーブルを使用します。そしてstackoverflow.comもそうです。彼らが実際にうまく機能する場合、私はすべてcssソリューションを求めています。
Nosredna 2009

11
アマゾンも、現在はスタックオーバーフローも、ウェブデザインの頂点ではありません。
ボビー・ジャック

31
そうではないかもしれませんが、彼らは何万人ものユーザーに役立つ実用的なソリューションです。

22
この反テーブルのミームは、単なる古いバカです。柔軟な制約ベースのレイアウトのための唯一の2次元レイアウトマネージャはテーブルです。そして、それが1つの複雑なもの(無数のcol / rowspansを含む)であっても、ネストされたものであっても、ほとんど違いはありません。しかし、現実と事実は、必ずしも熱狂に対する十分な武器ではないようです。
StaxMan 2009年

28

左と右にフロートし、両方をクリアするように設定すれば完了です。テーブルは必要ありません。

編集:私はこれについて多くの賛成票を得たことを知っており、私は正しいと信じていました。ただし、テーブルが必要な場合もあります。CSSですべてを試すことができ、それは最新のブラウザーで動作しますが、古いブラウザーをサポートしたい場合は...繰り返さないでください。ここで、関連するスタックオーバーフロースレッド怒りをブログに掲載しています。

Edit2:古いブラウザはもうそれほど面白くないので、新しいプロジェクトにはTwitterブートストラップを使用しています。ほとんどのレイアウトのニーズに最適で、CSSを使用します。


2
垂直方向のセンタリングを処理しないため、-1。
SamB

1
左側にロゴがあり、右側にいくつかのテキストメニューがあるという同様の問題がありました。メニューは、ロゴのベースラインに合わせる必要がありました。メニューにfloat:rightを使用しても機能しませんでした。それはそれらを右上隅に送り、ロゴのベースラインと垂直に揃わなくなりました。
ジャン=フランソワ・ビーチャム

1
タイトルの行の高さをボタンの高さと同じに設定すると、垂直方向の中央揃えを解決できると思います。
igors 2013年

1
@ igors、+ 1、あなたは正しい。この質問は2009年からのものであることに
注意してください

17

これは一種のトリックの質問です:に到達するまで、それはひどくシンプルに見えます

タイトルとボタンを垂直方向に中央揃えにしたいとします。

確かに、CSSでは垂直方向の中央揃えは難しいと述べておきたい。人々が投稿し、SOで無限に見える場合、「CSSでXを実行できますか」という答えはほとんど常に「はい」であり、彼らの騒動は正当化されないようです。この場合、はい、その1つは難しいことです。

誰かが質問全体を「CSSで垂直方向のセンタリングに問題があるか?」に編集する必要があります。


11
それは、「テーブル嫌い」の引数に関する私の問題の一種です。CSSは、テーブルが実行できるすべてのことを実行できます...かなり単純で一般的で合理的なケース(垂直方向の中央揃えなど)を除きます。CSSは選挙の約束がうまくいかなかったようです。
cletus 2009

4
私のポイントは、垂直方向のセンタリングは本当に難しいことだけです。
AmbroseChapel 2009

3
CSSはテーブルを置き換えるものではありません。これは、テーブルがなくても一般的なレイアウトの問題のほとんどを解決できるようにするためのものです。テーブルが機能する場合は、そりハンマーの代わりにペンを使用して描画するのと同じように、テーブルを使用します。
アーロンディグラ2009年

16

タイトルを左に、フロートボタンを右に、そして(ここまで私が最近知らなかった部分です)-両方のコンテナーを作成します{overflow:hidden}

とにかく、これでz-indexの問題を回避できます。それが機能せず、IE5サポートが本当に必要な場合は、先に進んで表を使用してください。


+1おっと、オーバーフローが隠されているのは何ですか?それは違いを生みます。なぜだかわかりません。
cletus 2009

正直なところ、私もそれを理解できず、仕様でそれについての言及を見つけることができませんでした。だれかが「正しい」方法だと誰かが言ったのですが、別の質問に答えた後、クリアされた要素を使用してそれを行うことを提案しました。私には良い考えのようです。

フロート化された要素は、その後に続くコンテンツが適切に流れるようにクリアする必要があります。オーバーフロー:非表示; コンテナの高さのみを扱います。
ザックザヒューマン

2
「overflow:hidden」は、高さの「拡張」とクリアの両方を達成するためのハックです。次の要素はそのボックスをクリアします(少なくとも、仕様のその部分を正しく実装するブラウザでは)。
ボビー・ジャック、

1
垂直方向のセンタリングを処理しない場合は-1、の場合は+2 overflow:hidden
SamB

7

純粋なCSSでは、実用的な答えは、いつかを使用すること"display:table-cell"です。残念ながら、これは現在のAグレードのブラウザーでは機能しません。そのため、とにかく同じ結果を得るだけの場合は、テーブルを使用することもできます。少なくとも、あなたはそれが過去まで十分に機能することを確信するでしょう。

正直なところ、簡単な場合はテーブルを使用してください。害はありません。

テーブル要素のセマンティクスとアクセシビリティが本当に重要な場合は、テーブルを非セマンティクスにするための作業草案があります。

http://www.w3.org/TR/wai-aria/#presentation

私はこれがちょうど全体を巻き起こすだろうXHTML 1.1を超えた特別なDTD、必要と考えるtext/htmlapplication/xmlそれでは、そこに行くわけにはいきません、議論を。

さて、あなたの未解決のCSS問題に...

2つの要素を中央に垂直に配置するには、いくつかの鈍いCSSハッカーを使用して、いくつかの異なる方法で行うことができます。

次の制約内に収まる場合は、比較的簡単な方法があります。

  • 2つの要素の高さは固定されています。
  • コンテナの高さは固定です。
  • 要素は、重複しないように十分に狭くなります(または、固定幅に設定できます)。

次に、負のマージンを持つ絶対配置を使用できます。

.group-header { height: 50px; position: relative; }
.group-title, .group-buttons { position: absolute; top: 50%; }
# Assuming the height of .group-title is a known 34px
.group-title { left: 0; margin-top: -17px; }
# Assuming the height of .group-buttons is a known 38px
.group-buttons { right: 0; margin-top: -19px; }

しかし、これはほとんどの場合無意味です...要素の高さがすでにわかっている場合は、フロートを使用して、必要に応じて要素を配置するための十分なマージンを追加できます。

これは、テキストベースラインを使用して、2つの列をインラインブロックとして垂直に配置する別の方法です。ここでの欠点は、列の固定幅を設定して、左端からの幅を埋める必要があることです。要素をテキストベースラインにロックしておく必要があるため、2番目の列にfloat:rightを使用することはできません。(代わりに、最初の列を押し上げるのに十分な幅にする必要があります。)

<html>
  <head>
    <title>Layout</title>
    <style type="text/css">
      .group-header, .group-content { width: 500px; margin: 0 auto; }
      .group-header { border: 1px solid red; background: yellow; }
      .valign { display: inline-block; vertical-align: middle; }
      .group-content { border: 1px solid black; background: #DDD; }
      .group-title { padding: 8px; width: 384px; }
      .group-buttons { padding: 8px; width: 84px; text-align: right; }
    </style>
    <!--[if lt IE 8]>
    <style type="text/css">
      .valign { display: inline; margin-top: -2px; padding-top: 1px; }
    </style>
    <![endif]-->
  </head>
  <body>
    <div class="group-header">
      <div class="valign">
        <div class="group-title">This is my title.</div>
      </div><!-- avoid whitespace between these! --><div class="valign">
        <div class="group-buttons"><input type="button" value="Collapse"></div>
      </div>
    </div>
    <div class="group-content">
      <p>And it works perfectly, but mind the hacks.</p>
    </div>
  </body>
</html>

HTML:各列の周囲に.valignラッパーを追加します。(それがあなたを幸せにするなら、それらをより「セマンティック」な名前にしてください。)これらは、間に空白を入れずに維持する必要があります。(私はそれが悪いことを知っていますが、それはあなたがマークアップで「純粋」であり、それをプレゼンテーション層から分離するためにあなたが得るものです...ハ!)

CSS:vertical-align:middleブロックをgroup-header要素のテキストベースラインに揃えるために使用します。各ブロックの異なる高さは、垂直方向の中央に留まり、コンテナの高さを押し出します。要素の幅は、幅に合わせて計算する必要があります。ここでは、400と100から水平パディングを差し引いたものです。

IEの修正: Internet Explorerは、ネイティブインライン要素(divではなくspanなど)のインラインブロックのみを表示します。ただし、div hasLayoutを指定してインラインで表示すると、インラインブロックと同じように動作します。マージン調整は、上部の1pxのギャップを修正することです(表示する.group-titleに背景色を追加してみてください)。


1
表示がうーん:table-Xタグには、テーブルタグを使用せずに、テーブルを使用してレイアウトを行う目的があるようです。
ダヌビアンセーラー2013

3

この例ではテーブルを使用しないことをお勧めします。これはテーブルデータではないためです。ボタンを右端に配置することは、単なるプレゼンテーションです。これは、テーブル構造を複製するために行うことです(サイトの階層のどこにいるかに合わせて、別のH#に変更してください)。

<style>
  .group-header { background: yellow; zoom: 1; padding: 8px; }
  .group-header:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
  /* set width appropriately to allow room for button */
  .group-header h3 { float: left; width: 300px; }
  /* set line-height or margins to align with h3 baseline or middle */
  .group-header input { float: right; }
</style>

<div class="group-header">
  <h3>This is my title</h3>
  <input type="button" value="Collapse"/>
</div>

真ん中に真の垂直方向の配置が必要な場合(つまり、テキストがボタンをラップする場合でも、テキストの両方の行に対して中央揃えになっている場合)、表を作成するかposition: absolute、余白を調整する必要があります。position: relativeドロップダウンメニュー(または多くの場合はその親)に追加して、ボタンと同じ順序付けレベルにして、Z-indexでボタンの上に配置することができます。

width: 100%divはブロックレベルの要素なので、div は必要ありません。またzoom: 1、divはIEにclearfixがあるように動作します(他のブラウザーは実際のclearfixを取得します)。配置を簡単にするためにボタンにラッパーdivまたはspanが必要な場合もありますが、対象をもう少し具体的に指定する場合は、これらの無関係なクラスはすべて必要ありません。


:after疑似クラスのため、ソリューションはIE6では機能しません。
セバスチャンホイッツ2009

1
これは、IE 6でのおかげで仕事をするzoom: 1.group-header能動素子の後:hasLayoutをトリガし、それが持っていたかのようにIE 6原因同じように動作し、。
1つのクレヨン

2

divでdouble floatを実行し、clearfixを使用します。http://www.webtoolkit.info/css-clearfix.html パディング/マージンの制限はありますか?

<div class="clearfix">
   <div style="float:left">Title</div>
   <input type="button" value="Button" style="float:right" />
</div>

垂直方向のセンタリング要件があります(および少し余分なパディング)。あなたが投稿した後で私はそれを明確にしたと思います。
cletus 2009

2
<div class="group-header">
    <input type="button" name="Button" value="Button" style="float:right" />
    <span>Title</span>
</div>

1

Flexboxを使用することにしたのは、物事が非常に簡単になったためです。

基本的には、整列して追加する子の親に移動する必要がありますdisplay:box(もちろん接頭辞付き)。横に配置するには、justify-contentを使用します。この場合のように、最後に揃える必要のある要素がある場合、その間のスペースは適切です(リンクを参照)...

次に、垂直方向の配置の問題。2つの要素の親を作成したので、フレックスボックスを整列させます。簡単に使えるようになりましたalign-items: center

次に、以前に必要なスタイルを追加し、ヘッダーのタイトルとボタンからフロートを削除し、パディングを追加しました。

.group-header, .group-content {
    width: 500px;
    margin: 0 auto;
}
.group-header{
    border: 1px solid red;
    background: yellow;
    overflow: hidden;
    display: -webkit-box;
    display: -moz-box;
    display: box;
    display: -webkit-flex;
    display: -moz-flex;
    display: -ms-flexbox;
    display: flex;
    -webkit-justify-content: space-between;
    -moz-justify-content: space-between;
    -ms-justify-content: space-between;
    -o-justify-content: space-between;
    justify-content: space-between;
    webkit-align-items: center;
    -moz-align-items: center;
    -ms-align-items: center;
    -o-align-items: center;
    align-items: center;
    padding: 8px 0;
}
.group-content{
    border: 1px solid black;
    background: #DDD;
}
.group-title {
    padding-left: 8px;
}
.group-buttons {
    padding-right: 8px
}

デモを見る


1

テーブルの読み込みが完了するまでテーブルが表示されないという単純な理由から(実際にはどれほど高速であっても、CSSメソッドよりも低速です)、表形式のデータには実際にテーブルのみを使用する必要があることに同意します。しかし、私はこれが最も簡単で最もエレガントな解決策だと感じています:

<html>
    <head>
        <title>stack header</title>
        <style type="text/css">
            #stackheader {
                background-color: #666;
                color: #FFF;
                width: 410px;
                height: 50px;
            }
            #title {
                color: #FFF;
                float: left;
                padding: 15px 0 0 15px;
            }
            #button {
                color: #FFF;
                float: right;
                padding: 15px 15px 0 0;
            }
        </style>
    </head>

    <body>
        <div id="stackheader">
        <div id="title">Title</div>
        <div id="button">Button</div>
        </div>
    </body>
</html>

ボタンの機能と追加の詳細は、この基本的なフォームからスタイルを設定できます。悪いタグの謝罪。

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