HTMLテーブルレイアウトの実践的な使い方の詳しい説明

HTMLテーブルレイアウトの実践的な使い方の詳しい説明

テーブルはいつ使用されますか?

最近では、Web ページの全体的なレイアウトにテーブルが使用されることはほとんどなくなりました。ただし、フォーム入力やデータの表示など、特定のデザインに直面した場合は、テーブルが最も適切な選択肢となる場合があります。

表の最も直感的な印象は、複数のセルが整然と配置された要素であり、行と列が明確にわかるということです。これは Excel と関連付けることができます。データ処理と統計における Excel の位置付けから、Web ページ上の表の重要性を理解できます。

簡単に言えば、複数の要素が行と列に配置されていることを直感的に把握できると、テーブルを使用すると作業がはるかに簡単になります。たとえば、caniuse.com では次の表が使用されています。
2015728173924594.png (470×175)

テーブルレイアウト計算

テーブルの使用は簡単ですが、テーブル内の各グリッドの最終状態が希望どおりにならない場合があります。たとえば、一部のセルに改行が含まれている場合、改行のせいで表全体が非常に見苦しくなります。特に、データ表示に使用されるテーブルの場合、幅の割り当ては非常に重要なトピックです。各列に表示される可能性のあるデータに基づいて、テーブルの合計幅を慎重に計算する必要がある場合があります。

これは、テーブルがレイアウトに独自の特性を持っているためです。テーブルは特定の原則に従い、計算を通じて実際のレイアウトを決定します。次に、この記事では実際のテーブル テストの例を使用して、テーブルが独自のレイアウトを計算する方法を説明します。
最初の声明

この記事では、テーブルを使用する最も一般的な方法のみを取り上げており、すべての状況を網羅しているわけではありません。ブラウザによってテーブルの概念の解釈が異なりますが、レイアウトの計算は基本的に同じです (違いがある場合は別途説明します)。

以下で使用されるテスト テーブルはすべて次のようになります (内容は Zero Tracks から取得されます)。
2015728173942365.jpg (535×183)

同時に、テーブルには border-collapse:collapse; と border-spacing:0; が設定されます。これは、テーブルを適用する最も一般的な方法でもあります。Normalize.css はこの部分を初期化定義として使用します。
2つのアルゴリズム

<table> 要素で定義された table-layout CSS プロパティは、レイアウトを計算するときにテーブルで使用されるアルゴリズムを決定します。自動と固定の 2 つの値があります。通常はデフォルト値の auto が使用されます。

これら 2 つのアルゴリズムの違いは、テーブルの幅のレイアウトがテーブル内のデータ コンテンツに関連しているかどうかにあります。この記事では、これら 2 種類の値に対するテーブルのレイアウト計算の原則について説明します。
自動テーブルレイアウト - 自動

自動テーブルレイアウトの特徴は、テーブルの幅レイアウトがテーブル内のすべてのデータ コンテンツに関係していることです。最終的な幅レイアウトを決定する前に、すべてのテーブル コンテンツを取得し、それらを一緒に表示する必要があります。

ポイントは「コンテンツの関連性」にあるようです。テーブルが固定幅 (ここでは 500 ピクセル) を定義し、すべてのセルが幅を定義していない場合 (CSS で定義された幅のみについて説明します) はどうなりますか?結果を見てみましょう:
2015728174002286.jpg (538×116)

上記の表では、空白部分はスペースで埋められています。比較すると、次の点がわかります。

列 2 と 3 の幅は同じです。
最初の列の幅と後続の列の幅の比率は 2:1 のようです。
境界線とパディングを含むすべての列の合計幅は、テーブルで定義された幅と同じになります。

各セルには幅が定義されていないため、幅のレイアウトは特定のコンテンツ データ (テキスト情報) によって完全に決定されます。このような結果をどのように説明すればよいでしょうか?まず、直感的に次のロジックを推測できます。

ステップ 1: 各列から、テキスト コンテンツが最も多い列 (改行なしの条件で、テキストが占める幅が最も広い列) を「代表」として選択します。
ステップ 2 では、各列の「代表者」の幅を比較し、境界線とパディングを含むテーブルの合計幅を、幅の比率に従ってそれらに分配します。

上記のロジックを参考に、先ほどの表をもう一度見てみましょう。何となく意味が分かりませんか?先ほど、幅の比率は 2:1 のようだと述べていましたが、これはどのくらいでしょうか?パディングなしのバージョンを見てみましょう。
2015728174128545.jpg (558×87)

フロントエンド デバッグ ツールを使用して、上のセルの幅を詳しく見てみましょう。この表は前の表とは異なり、比率が 2:1 に非常に近いことがわかります (境界線があるため、このわずかな差がありますが、境界線がないと列を区別できません)。

幅の比率を分析すると、コンテンツの幅、パディング、境界線がすべて考慮されていることがわかります。これは、測定されるのは文字数ではなく、文字が折り返さずに占めることができる幅であることも示しています (ここでの 2:1 は、中国語の文字の幅が等しいという事実に由来します)。パディングを使用するのは、もちろん、テーブルをより美しくするためだけです :)。

幅の定義があると何が起こりますか?幅が定義されたセルがいくつかある表を次に示します。
2015728174212099.jpg (553×142)

対応する HTML コードは次のとおりです。

XML/HTML コードコンテンツをクリップボードにコピー
  1. < クラス= "展示テーブル" >   
  2.      < tr >   
  3.          < th > 1 2 </ th >   
  4.          <番目 スタイル= "幅:200px;" >   </ th >   
  5.          <番目>   </ th >   
  6.      </tr>   
  7.      < tr >   
  8.          < td  スタイル= "幅:5px;" >   </ td >   
  9.          < td > </ td >   
  10.          < td >   </ td >   
  11.      </tr>   
  12.      < tr >   
  13.          < td >   </ td >   
  14.          < td  スタイル= "幅:70px;" >   </ td >   
  15.          < td > 1、2、3、4 </ td >   
  16.      </tr>   
  17. </>   

上記の表には以下の点が記載されています。

5px に設定されたセルの実際の幅は 13px で、これはちょうど 1 つの漢字の幅です。同じ列にある漢字のセルは、最小セル幅の形式でテキストを配置します (したがって、改行されます)。
同じ列に 70 ピクセルの幅の定義があっても、幅が 200 ピクセルのセルは実際には 200 ピクセルの幅でレンダリングされます。
正確な幅が定義されていない 3 番目の列は、最初の列と 2 番目の列を割り当てた後のテーブルの残りの幅になります。

このことから推論されるのは、幅定義のある列と幅定義のない列の両方がある場合です。

セルの定義された幅が、そのコンテンツの最小配置幅 (折り返しのない配置ではなく、セル内にできるだけ多くの行を配置する場合にセルに必要な幅) よりも小さい場合、セルが配置されている列には、コンテンツが最小配置で表示されます。
同じ列内のセルのコンテンツ幅 (改行なし、この用語は次のテキストで使用されます) が列で定義された最大幅よりも小さい場合、列の実際の幅は定義された幅と同じになります。
幅が定義されていない列は、幅が定義された列に割り当てられた後に、最初にテーブルによって幅が割り当てられます (この場合も、それらの比率はコンテンツの幅によって異なります)。

幅の定義がない最前列はケース 1 とみなすことができます。ここでは、幅の定義がある列と、定義がない列があり、これはケース 2 とみなすことができます。すべての列の幅が定義されているケース 3 を次に示します。
2015728174233994.jpg (549×98)

対応する HTML コード:

XML/HTML コードコンテンツをクリップボードにコピー
  1. < クラス= "展示テーブル パディングなしの展示テーブル" >   
  2.      < tr >   
  3.          <番目 スタイル= "幅:50px;" >   </ th >   
  4.          <番目 スタイル= "幅:50px;" >   </ th >   
  5.          <番目 スタイル= "幅:100px;" >   </ th >   
  6.      </tr>   
  7.      < tr >   
  8.          < td >   </ td >   
  9.          < td >   </ td >   
  10.          < td >   </ td >   
  11.      </tr>   
  12.      < tr >   
  13.          < td >   </ td >   
  14.          < td >   </ td >   
  15.          < td >   </ td >   
  16.      </tr>   
  17. </>   

上記の表では、幅によって値を明確に定義できるようにパディングが削除され、3 つの列の幅の比率が 2:1:1 になっています。ここでは別の条件があり、セル内のコンテンツの幅が定義された幅の値を超えないことです。テストの結果、IE7 以下では、コンテンツが定義された幅を超えた場合に他のブラウザとは異なる動作をすることがわかりました。

この表の例から、すべての列に幅定義があり、これらの幅定義の値の合計が表の幅よりも小さい場合、表は幅定義値に対応する幅を割り当てた後、幅の比率に従って残りの幅を割り当て続けることがわかります。

上記は、自動テーブルレイアウトが使用され、テーブル自体が固定幅を定義している 3 つの状況の分析です。テーブル自体に幅を定義しない場合は、状況はさらに増え、テーブルの包含ブロックに関係します(詳細)。今後、適切な機会があれば、再度取り上げます(いわゆる記事の長さには限りがあります...)。
固定テーブルレイアウト - 固定

固定テーブルレイアウトの特徴は、テーブルの幅レイアウトがテーブル内のデータ内容に依存しないことです。テーブルの最初の行の情報を受け取るだけで、最終的な幅レイアウトを決定し、表示を開始できます。

固定テーブルレイアウトは「コンテンツに依存せず」、「最初の行」を強調します。次の表の例をご覧ください。
2015728174250768.jpg (551×165)

対応する HTML コード:

XML/HTML コードコンテンツをクリップボードにコピー
  1. < クラス= "展示テーブル 展示テーブル固定" >   
  2.      < tr >   
  3.          <番目 スタイル= "幅:50px;" > </ th >   
  4.          < th > 1 2 </ th >   
  5.          < th >一、二、三、四</ th >   
  6.      </tr>   
  7.      < tr >   
  8.          < td >エステル・ブライト</ td >   
  9.          < td  = "1000px;" >   </ td >   
  10.          < td >   </ td >   
  11.      </tr>   
  12.      < tr >   
  13.          < td  スタイル= "幅:5px;" >   </ td >   
  14.          < td >   </ td >   
  15.          < td >   </ td >   
  16.      </tr>   
  17. </>   

固定テーブルレイアウトのロジックははるかに単純で、次のように表現されます。

最初の行の情報のみを取得し、最初の行以降のすべてのセルの内容と幅の定義は無視します。
最初の行では、セルの幅が定義されている場合、まず必要な幅が割り当てられ、その後、残りの幅が幅が定義されていないセルに均等に分配されます。
最初の行のセルの幅の割り当てによってテーブルの幅のレイアウトが決定され、最初の行以降のコンテンツによってレイアウトが変更することはありません。

また、固定テーブル レイアウトを使用する場合は、テーブル要素の幅を定義する必要があることにも注意してください。幅が定義されていない場合 (つまり、デフォルト値の auto)、ブラウザーは代わりに自動テーブル レイアウトを使用します。
閉会の辞

実際、<colgroup>、<thead>、<tfoot>、<caption> など、テーブルに関連する他の要素もありますが、最も一般的な使用法では必要ありません。実際、それらはテーブルのレイアウト計算でも考慮されます。これにセル結合のケースを加えると、テーブルレイアウトの計算がいかに複雑になるかが想像できるでしょう。

W3C のドキュメントには、テーブルレイアウトの計算 (自動テーブルレイアウト) はまだ仕様化されていないと記載されています。 W3C によるテーブルレイアウト計算の説明については、「テーブル幅アルゴリズム」を参照してください。
結論

実際のところ、テーブルレイアウトの計算原理についてこのような詳細な推論を行うことはあまり現実的ではありません。ただ、詳細を検討する必要があるときに、この情報を参考にしておくと便利ですが、そのような機会はめったにありません。

ただし、この記事の内容に基づいて、より意味のある結論を導き出すことができます。テーブルが幅を定義し、すべてのセルが幅を定義していない場合、自動レイアウト テーブルはすべてのデータが折り返されないように最善を尽くします。折り返しが外観に影響する状況に遭遇した場合は、幅の割り当てを自分でやり直すのではなく、データを合理化するか、余白を減らす必要があることを意味します。

今回、こういった実際の測定や推論を行う際には、体系的かつ網羅的に一気に提示するよりも、具体的な状況に応じて詳しく説明した方が分かりやすいと感じています。語学の訓練と捉えても良いのでしょうか?

<<:  CSS での三角形の描画と巧妙な応用例の詳細な説明

>>:  Tomcatのクラスロードメカニズムを説明する記事

推薦する

CSS継承方法

次の背景画像を持つ div があるとします。 次の反射効果を作成します。 方法はたくさんありますが、...

JavaScript における Arguments オブジェクトの使用に関する詳細な説明

目次序文議論の基本概念議論の役割実パラメータと仮パラメータの数を取得する実際のパラメータ値を変更する...

React 星評価コンポーネントの実装

要件は、製品の評価データを渡すことであり、ページには対応する星の数が表示されます。 1. 異なる評価...

MySQL 5.7.18 無料インストールバージョンの設定チュートリアル

MySQL 5.7.18 無料インストール版のインストールチュートリアルMySQL は現在、世界で最...

CSSでイメージマッピングを実装する方法

1. はじめにイメージマップを使用すると、画像の領域をホットスポットとして指定できます。この領域にマ...

Docker を使用して MySQL および Redis サービスをデプロイする方法

目次Dockerを使用してMySQLサービスをデプロイする方法DockerでRedisサービスをデプ...

JavaScript の Set データ構造の詳細な説明

目次1. セットとは何か2. セットコンストラクタ2.1) 配列2.2) 文字列2.3) 議論2.4...

nginxを使用してドメイン名ベースの仮想ホストを構成する

1. 仮想ホストとは何ですか?仮想ホストは、特殊なテクノロジーを使用して、実行中のサーバーを論理的に...

MySQL マルチテーブル結合クエリの詳細な説明

目次複数テーブル結合クエリ内部結合左結合右結合サブクエリ要約する複数テーブル結合クエリテーブル間の接...

MySQL 接続で認証失敗エラーが発生する場合の分析と解決方法

[問題の説明]アプリケーション側では、次のエラーが時々表示されます。メソッド 'mysql_...

Docker ベースの Redis 1 マスター、2 スレーブ、3 センチネルの実装

現在、Redis とコンテナについて学習中なので、Docker を使用して Redis マスタースレ...

MySQLテーブルの自動インクリメント列の初期値をリセットする方法

MySQLテーブルの自動インクリメント列の初期値をリセットする方法1. 問題の説明MySQL データ...

IE8はマルチ互換モードを使用してWebページを正常に表示します

IE8には複数の互換モードがあります。 IE プラットフォームの設計者である Chris Wilso...

jsはaudioContextを通じて3Dサウンド効果を実現します

この記事では、audioContextを介して3Dサウンド効果を実現するためのjsの具体的なコードを...

js キャンバスはスライダー検証を実現します

この記事の例では、スライダー検証を実装するためのjsキャンバスの具体的なコードを参考までに共有してい...