モダンCSSで実装する、テーブル(<table>)のさまざまなスタイルのまとめ

モダンCSSでテーブルをゼブラストライプしたり、テーブルの四隅を角丸にしたり(昔はかなり面倒でした)、列や行を分割したり、ホバーでハイライトやアウトラインを表示したりなど、表のデータを読みやすくするテーブル(<table>)のさまざまなスタイルを紹介します。

テーブル(<table>)のさまざまなスタイルのまとめ

A Guide to Styling Tables
by Mads Stoumann

下記は各ポイントを意訳したものです。
※当ブログでの翻訳記事は、元サイト様にライセンスを得て翻訳しています。

はじめに

私は最近、小さな矛盾に気がつきました。
かなり昔のことですが、CSS Gridが登場する前はグリッドレイアウトを実装するために<table>を使用していました。つまり、テーブルでグリッドをシミュレートしていたことになります。しかし、それは間違っています。テーブルは表形式のデータのためにあるのであって、<div>で表形式のデータを見せることは意味がありません。

この間違った行為の理由は、テーブルのスタイル設定が少し難しいこと、そしてほとんどのCSSフレームワークがデフォルトのテーブルのスタイルにborder-collapse: collapse;を使用しているからです。この記事で解説しますが、collapseされたボーダーは、テーブルのスタイルにとって必ずしも有用ではありません。

この記事では、テーブルのさまざまなスタイルについて解説したいと思います。まずは、<table>の要素をどのように構成し、どのようにスタイルを設定するか解説します。

テーブルを構成するHTMLの要素

テーブルを構成するHTMLの基本的な要素は、<table>の他に次の3つのタグが必要です。

タグ 説明
td テーブルのデータのセル
th テーブルのヘッダのセル
tr テーブルの行

たとえば、下記のようなHTMLになります。

テーブルをより適切に構造化するために、行を次のようにカプセル化することもできます。

タグ 説明
thead テーブルのヘッダ
tbody テーブルのボディ
tfoot テーブルのフッタ

さらに、テーブルに<caption>を追加し、<colgroup>内の<col>で列を定義することもできます。

スタイルを設定しない場合、ブラウザは次のように表示します。

See the Pen
A Guide To Styling Tables 0
by coliss (@coliss)
on CodePen.

デフォルトのUAスタイルは次のとおりです。

ここで、非常にシンプルなスタイルを追加すると、次のようになります。

ブラウザは次のように表示します。

See the Pen
A Guide To Styling Tables 0
by coliss (@coliss)
on CodePen.

テーブルのボーダーが分かれていることに注目してください。見た目はあまり良くないですね。

そこで、折り畳まれたボーダー(collapse)の人気が高いことを理解するために(およびフォントも)、スタイルを追加します。

ブラウザは次のように表示します。

See the Pen
A Guide To Styling Tables 1
by coliss (@coliss)
on CodePen.

テーブル内のデータを読みやすくしてみます。
:is(td, th){}セレクタにpadding: .5ch 1ch;を追加し、<caption>margin-block: 1rlh;を追加すると、ブラウザは次のように表示します。

See the Pen
A Guide To Styling Tables 2
by coliss (@coliss)
on CodePen.

ここまでのCSSをまとめると、次の通りです。

代わりに<caption>をテーブルの下に配置するには、次を使用します。

テーブルをゼブラストライブにするCSS

テーブルの列をゼブラストライプにするには、<col>にスタイルを設定するだけです。

See the Pen
A Guide To Styling Tables 3
by coliss (@coliss)
on CodePen.

行の場合は、<tr>です。

See the Pen
A Guide To Styling Tables 4
by coliss (@coliss)
on CodePen.

テーブルを角丸にするCSS

テーブルを角丸にするのは、すこし面倒です。
<table>border-radiusを単に追加するだけでは実現できないため、最初と最後の行の最初と最後のセルをターゲットにします。

しかし、これでは何も起こりません!
その理由は、ボーダーがcollapseの場合、border-radiusが追加できないからです。

そのため、ボーダーを分割して使用し、collapseのボーダーを模倣する必要があります。

このCSSで、角丸テーブルを実装できます。

See the Pen
A Guide To Styling Tables 5
by coliss (@coliss)
on CodePen.

テーブルの列を分割するCSS

独立した列を維持し、border-spacingプロパティでカラム間にスペースを追加します。

See the Pen
A Guide To Styling Tables 5
by coliss (@coliss)
on CodePen.

これは単なる<table>ですが、比較表として使用するとさらに読みやすくなります。

テーブルの行を分割するCSS

行を独立されるためには、border-spacingプロパティの2番目(y軸)をアップデートするだけです。

See the Pen
A Guide To Styling Tables 7
by coliss (@coliss)
on CodePen.

ホバー・フォーカスでハイライトするCSS

テーブルが大きいと、どこを見ているか把握することが難しいかもしれません。そこで役立つのが、:hoverです。また、キーボードでナビゲート可能なテーブルを使用している場合は、:focus-visbleが必要になります。

次のテーブルでは、ホバー時のスタイルは<col>, <tr><td>の両方に設定されています。

See the Pen
A Guide To Styling Tables 4
by coliss (@coliss)
on CodePen.

行と列のホバー時にハイライトさせるのは簡単です。

<col>のホバーは少し複雑です。

上記のCSSでは、機能しません。
しかし、デベロッパーツールでcol要素を選択し、:hoverを有効にすると機能します。

上記のCSSの代わりに、:hasを使用してセルのホバーをキャプチャし、<col>要素にスタイルを設定します。

このCSSを分析してみましょう。
テーブルの<td>または<th>nth-child(1)であり、現在ホバーされている場合、同じnth-childを持つ<col>を選択し、backgroundを設定します。

そして、このCSSを各列に対して繰り返す必要があります(nth-child(2), nth-child(3)など)。

ホバーでアウトラインを表示するCSS

ホバー時にアウトラインを表示するのも簡単で、セルと行も同じです。ただしオフセットから幅を引く必要があります。

See the Pen
A Guide To Styling Tables 9
by coliss (@coliss)
on CodePen.

列のアウトラインを作成するのは非常に難しいですが、見栄えは良くなります。

セルのborder-width1pxの場合、<col>のホバー時にborder-width2pxに設定できますが、そうするとテーブル全体がずれてしまいます。

そのため、<col>に背景グラデーションでボーダーをシミュレートする方法があります。テーブルのセルが透明であれば、これはうまく機能します。

border-radiusで動作させ、セルの背景を維持するために私はセルごとに疑似要素を使用しました。

そして、col-hoverで行ったことと同様に、ホバー時に同じcol-indexを持つすべてのセルをターゲットにします。

これをすべての列に対して設定します。

データを左右・中央に揃えるCSS

古い仕様では、<col>要素にalignプロパティを追加できましたが、これはもう機能しません。

たとえば、2列目のテキストを中央揃えにして、4列目のテキストを右揃えにしてみましょう。

See the Pen
A Guide To Styling Tables 10
by coliss (@coliss)
on CodePen.

各セルにクラスを追加する代わりに、テーブル全体に列ごとにデータ属性を追加します。

そして、CSSで中央揃えと右揃えを設定します。

あとは、すべての列に対してこれを繰り返します。

終わりに

これでテーブルに関するスタイルのガイドは終わりにしたいと思います。

colspan, rowspan, scope, spanについては説明していませんが、詳しく知りたい場合はMDNを読むことをお勧めします。

最後に、この記事で解説したテーブルすべてのデモをご覧ください。

See the Pen
A Guide To Styling Tables
by coliss (@coliss)
on CodePen.

sponsors

top of page

©2024 coliss