



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp









生徒記事に表を入れたんですけど、見た目が地味でダサいんです…。それにスマホで見ると横にはみ出しちゃって。CSSでどうにかなりますか?
ペン博士なるほど、その悩みめちゃくちゃ多いよ!素の
| やりたいこと | 使う値 | 補足 |
|---|---|---|
| 罫線を1本にまとめたい | collapse | 最もシンプル。基本の表向き |
| 角丸を効かせたい | separate | overflow:hiddenと併用する |
| セル間に余白を空けたい | separate | border-spacingで調整 |
| カード化したい | separate | border-spacing: 0 12px; など |
角丸ヘッダーは女性向けサイトや飲食・美容などのやわらかいブランドに特に合います。逆に、金融・法律・技術資料のような堅実さを求められる場面では、角ばったcollapseの表のほうがしっくりきます。デザインは「かわいいかどうか」ではなく、サイトの雰囲気に合うかどうかで選びましょう。
表全体にうっすら影を付けると、背景から浮き上がって見えるカードのような表になります。白背景のページに置くと立体感が出て、洗練された印象になります。
table {
border-collapse: separate;
border-spacing: 0;
width: 100%;
background: #fff;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.08);
}
th,
td {
padding: 14px 18px;
border-bottom: 1px solid #eee;
}
tbody tr:last-child td,
tbody tr:last-child th {
border-bottom: none;
}
ポイントはbox-shadowです。書式は「横方向・縦方向・ぼかし・色」の順で、影は薄く、下方向に落とすのが自然に見えるコツです。rgba(0,0,0,0.08)のように透明度を下げた黒を使うと、どんな背景色にもなじみます。
縦の罫線をなくし、横の罫線(border-bottom)だけにすると、すっきりモダンな見た目になります。最後の行の下線は:last-childで消しておくと、影のふちと二重にならず美しく仕上がります。
box-shadowは使い方を間違えると一気に安っぽくなります。自然に見せるコツは3つ。1つ目は透明度を下げた黒(rgba)を使うこと。真っ黒の影はきつく見えるので、rgba(0,0,0,0.08)くらいの薄さにします。2つ目はぼかしを大きめに取ること。ぼかしが小さいと輪郭がくっきりして硬い印象になります。3つ目は影を真下(またはやや下)に落とすことです。光は上から当たる前提なので、影が下にあると自然に見えます。この3点を守るだけで、影の質がぐっと上がります。
影付きの表は、ホバーで影を強めると「持ち上がる」ような動きが加わり、さらに立体的になります。
table {
transition: box-shadow 0.3s ease, transform 0.3s ease;
}
table:hover {
box-shadow: 0 14px 34px rgba(0, 0, 0, 0.14);
transform: translateY(-3px);
}
transform: translateY(-3px);で少し上に持ち上げ、同時に影を濃く大きくすることで、表全体がふわっと浮く動きになります。単体のカードとして見せたい表に向いた演出です。ただし表がたくさん並ぶページでは動きが多すぎて疲れるので、ここぞという1つの表に絞って使いましょう。
数値がたくさん並ぶスペック表や成績表など、データの正確さを重視する表には、あえて縦の罫線も残す設計が向いています。ストライプと縦罫線を組み合わせて、きっちり読める表を作りましょう。
table {
width: 100%;
border-collapse: collapse;
}
th,
td {
padding: 10px 14px;
border: 1px solid #d0d7de;
text-align: center;
}
thead th {
background: #384252;
color: #fff;
}
tbody tr:nth-child(even) {
background: #f4f6f8;
}
td:first-child,
th:first-child {
text-align: left;
}
数値は中央寄せか右寄せにすると桁が揃って読みやすくなります。ここでは全体を中央寄せにしつつ、先頭列(項目名)だけtext-align: left;で左寄せに戻しています。項目名は文章、数値は数字と、役割で寄せ方を変えるのがプロっぽい仕上げです。
見出しの背景を濃い紺色にすると、白い数字がくっきり見えて「資料らしい」堅実な印象になります。ゼブラの色も控えめにして、罫線とケンカしないようにするのがポイントです。
数値がメインの表では、小数点や桁を縦に揃えると一気に読みやすくなります。金額のように桁が変わる数値は右寄せ(text-align: right;)にすると、位が縦に揃って比較しやすくなります。さらにfont-variant-numeric: tabular-nums;を指定すると、数字の幅が均等になり、フォントによっては桁ズレがきれいに直ります。数値表を作るときに覚えておくと役立つ小技です。
行の見出し(左端)と列の見出し(上端)で色を変えると、表の構造が直感的に伝わります。縦横どちらから見ればいいかが一目で分かる、親切なデザインです。
thead th {
background: #2f6fed;
color: #fff;
}
tbody th[scope="row"] {
background: #eaf1ff;
color: #1b3c78;
font-weight: bold;
}
td {
background: #fff;
}
ここで効いてくるのが、土台のHTMLで書いたth scope="row"です。行の先頭セルをきちんと<th>にしておいたおかげで、tbody th[scope="row"]という指定で「行見出しだけ」に色を付けられます。マークアップを正しくしておくと、CSSがこんなに楽になるという好例です。
列見出しは濃い色、行見出しは薄い色、と濃淡で階層を付けると、うるさくならずに構造が伝わります。色は3色くらいまでに抑えておくと、まとまりのある表になります。
罫線で区切るのではなく、行と行の間に余白を空けて、1行を独立したカードのように見せるデザインです。おしゃれなポートフォリオサイトやサービス紹介ページでよく見かけます。
table {
width: 100%;
border-collapse: separate;
border-spacing: 0 12px;
}
thead th {
padding: 8px 18px;
color: #888;
font-size: 13px;
text-align: left;
}
tbody tr {
background: #fff;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.06);
}
tbody td,
tbody th {
padding: 16px 18px;
}
tbody tr td:first-child,
tbody tr th:first-child {
border-radius: 10px 0 0 10px;
}
tbody tr td:last-child {
border-radius: 0 10px 10px 0;
}
カギはborder-spacing: 0 12px;です。横方向の隙間は0、縦方向の隙間は12pxという意味で、行と行の間だけに余白を作れます。border-collapse: separate;とセットで使うのを忘れないでください。
各行(tr)に背景色と影を付けることで、1行がまるごとカードに見えます。行の左右の端をborder-radiusで丸めると、より柔らかいカード感が出ます。罫線を一切使わない、今どきのデザインです。
ここからが多くの人がつまずくスマホ対策です。まずは一番手軽で、どんな表にも使える「横スクロール」から。表を囲んだ要素にoverflow-x: auto;をかけるだけで、はみ出した表をスワイプで見られるようになります。
土台のHTMLで<table>を<figure class="table-wrap">で囲んでおいたのを覚えていますか? その囲み要素にスクロールを効かせます。
.table-wrap {
width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.table-wrap table {
min-width: 600px;
border-collapse: collapse;
}
overflow-x: auto;は「横方向にはみ出したら、スクロールできるようにする」という指定です。ポイントは表本体にmin-widthを設定すること。これがないと表が無理に縮んで文字が潰れてしまいます。最低幅を決めておけば、それ以下では素直に横スクロールに切り替わります。
-webkit-overflow-scrolling: touch;は、iPhoneなどでスクロールを滑らかにするための補助です。この横スクロール方式は列数が多くて縦積みしにくい比較表・スペック表に特に向いています。実装が簡単で崩れにくいので、迷ったらまずこれを使いましょう。
横スクロールの弱点は、スクロールできること自体に気づいてもらえない点です。対策として、右端に薄いグラデーションの影を出して「まだ続きがあるよ」と示したり、表の上に「※横にスクロールできます」と一言添えたりすると親切です。
.table-wrap {
position: relative;
}
.table-wrap::after {
content: "";
position: absolute;
top: 0;
right: 0;
width: 24px;
height: 100%;
background: linear-gradient(to right, rgba(255,255,255,0), rgba(255,255,255,0.9));
pointer-events: none;
}
::afterで表の右端にグラデーションのふちを重ね、続きがあることを視覚的に伝えています。pointer-events: none;を入れておくと、この飾りがスクロール操作を邪魔しません。
横スクロールする表で「項目名の列(左端)だけは常に見えていてほしい」という場面はよくあります。この場合は、左端のセルにposition: sticky;とleft: 0;を指定します。縦のヘッダー固定を横方向に応用したテクニックです。スクロールしても左端の列が貼り付いたままになるので、どの行を見ているか見失いません。固定した列には必ず背景色を付け、スクロールで流れてくる中身が透けないようにしましょう。列数が多い比較表で特に役立つ実務テクニックです。
もう1つのスマホ対策が縦積み(レスポンシブテーブル)です。スマホでは各セルを縦に並べ替え、「項目名:値」という形で表示します。横スクロール不要で全部見えるのが利点で、料金プランやプロフィール表など列が少ない表に向いています。
実装のコツは、各<td>にdata-label属性で項目名を持たせておくことです。まずHTML側を用意します。
<table class="stack-table">
<thead>
<tr>
<th scope="col">プラン</th>
<th scope="col">月額</th>
<th scope="col">容量</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="プラン">スタンダード</td>
<td data-label="月額">980円</td>
<td data-label="容量">50GB</td>
</tr>
</tbody>
</table>
次にCSSです。スマホ幅のときだけ縦積みに切り替えたいので、@media(メディアクエリ)の中に書きます。
@media (max-width: 600px) {
.stack-table thead {
display: none;
}
.stack-table tr {
display: block;
margin-bottom: 16px;
border: 1px solid #e0e0e0;
border-radius: 8px;
overflow: hidden;
}
.stack-table td {
display: flex;
justify-content: space-between;
padding: 10px 14px;
border-bottom: 1px solid #eee;
}
.stack-table td::before {
content: attr(data-label);
font-weight: bold;
color: #555;
margin-right: 12px;
}
.stack-table td:last-child {
border-bottom: none;
}
}
仕組みを分解します。まずtheadをdisplay: none;で隠します。縦積みでは各セルの横に項目名が付くので、上の見出し行はいらなくなるからです。次に各<tr>をdisplay: block;にしてカードのように積み、<td>をdisplay: flex;にして「項目名」と「値」を左右に振り分けています。
最大のポイントがcontent: attr(data-label);です。これは「data-label属性に書いた文字を、そのままここに表示する」という指定です。おかげでHTMLに書いた「プラン」「月額」などの項目名が、スマホでは各値の左に自動で並びます。見出しを隠しても、data-labelが項目名の代わりを果たすというわけです。
縦積みは便利ですが、2つ気をつける点があります。1つ目はdata-labelの入れ忘れです。1つでもセルにdata-labelを付け忘れると、そのセルだけ項目名が表示されず、何の値か分からなくなります。すべての<td>に漏れなく付けることを、公開前に必ず確認しましょう。
2つ目は空のセルの扱いです。値が空のセルは、縦積みにすると「項目名だけ」が表示されて不自然になります。データがないセルには「ー」や「非対応」などの文字を入れておくと、縦積みでも自然に見えます。空欄を空欄のまま放置しないのが、きれいな縦積み表のコツです。
2つの方式を紹介しましたが、迷ったときは列の数で決めるのが簡単です。列が5個以上ある表は縦積みにすると1行がとても長くなってしまうため、横スクロールが向いています。列が2〜4個の表なら、縦積みにしても1件がコンパクトに収まり、スクロール不要で全部見えるので親切です。詳しい判断基準は後半の実務章の表でもまとめているので、あわせて確認してください。
行数がとても多い表では、下にスクロールすると見出しが画面外に消えて「この数字が何の項目か分からない」状態になりがちです。見出し行を画面の上に貼り付けて固定するデザインで、これを解決できます。
.sticky-table {
max-height: 400px;
overflow-y: auto;
}
.sticky-table thead th {
position: sticky;
top: 0;
background: #384252;
color: #fff;
z-index: 1;
}
カギはposition: sticky;とtop: 0;です。「普段は普通の位置にいて、スクロールで上端に来たらそこで貼り付く」という便利な指定です。ここでは表を囲む要素に高さ(max-height)と縦スクロール(overflow-y: auto;)を付け、その中で見出しだけを固定しています。
注意点として、固定した見出しには必ず背景色を付けること。背景が透明だと、下の行が透けて重なり読めなくなります。また、下の行より前面に出すためにz-indexを指定しておくと安心です。
料金プランの比較表は、Webサイトで最も重要な表の1つです。おすすめプランを目立たせるデザインにすると、ユーザーの選択を後押しできます。特定の列だけ色を変えたり、少し大きく見せたりするのが定番のテクニックです。
.price-table {
width: 100%;
border-collapse: separate;
border-spacing: 8px;
text-align: center;
}
.price-table th,
.price-table td {
padding: 18px 14px;
background: #fff;
border-radius: 10px;
}
.price-table .recommend {
background: #fff7e6;
box-shadow: 0 6px 20px rgba(255, 170, 0, 0.25);
position: relative;
}
.price-table .recommend::before {
content: "おすすめ";
position: absolute;
top: -12px;
left: 50%;
transform: translateX(-50%);
background: #ffbf00;
color: #fff;
font-size: 12px;
padding: 3px 12px;
border-radius: 999px;
}
class="recommend"を付けたセルにだけ、薄い黄色の背景とオレンジの影を当てています。1つだけ色を変えて特別感を出すのが、価格表の鉄則です。さらに::beforeで「おすすめ」バッジをセルの上にはみ出すように配置し、視線を集めています。
価格表は数値の比較がメインなので、全体を中央寄せにして桁を揃えると見やすくなります。金額は他より少し大きなフォントにする、円マークだけ小さくする、といった細かな調整でぐっと本格的になります。
機能の有無を比べる比較表では、「○」「×」の記号がよく使われます。ただし記号だけだと味気なく、色の見分けが難しい人には伝わりにくいことがあります。おすすめは、対応している項目には色付きのチェックマーク、非対応にはグレーのバツ、といったように色と形の両方で違いを付けることです。CSSでtd.okには緑、td.ngには薄いグレーを当てるだけでも、ぐっと見やすくなります。記号だけに頼らず、色・太さ・背景で差を付けるのが親切な比較表のコツです。
また、比較表は縦(項目)と横(サービス)のどちらを軸にするかで読みやすさが変わります。一般的には、比べたいもの(サービスや商品)を横に並べ、比較項目を縦に並べると、上から下へ順に読み比べられて分かりやすくなります。列が多くなりすぎる場合は、スマホで横スクロールにする前提で設計しておきましょう。
罫線を一切使わず、余白と背景色だけで区切りを表現するミニマルなデザインです。線がないぶん軽やかで洗練された印象になり、コーポレートサイトやポートフォリオによく合います。
table {
width: 100%;
border-collapse: collapse;
}
th,
td {
padding: 16px 20px;
border: none;
text-align: left;
}
thead th {
color: #999;
font-size: 13px;
letter-spacing: 0.05em;
text-transform: uppercase;
border-bottom: 2px solid #f0f0f0;
}
tbody tr {
border-bottom: 1px solid #f5f5f5;
}
罫線を全部消すと区切りが分からなくなるので、見出しの下線と行の間の薄い線だけを残しています。線の色は背景とほとんど同じくらい薄くするのがコツで、#f5f5f5のような極薄グレーにすると「線がある」と気づかれない自然な区切りになります。見出しの文字を小さめのグレーにし、letter-spacingで少し字間を空けると、雑誌のような上品さが出ます。
見出し行の背景にグラデーションをかけると、単色よりも華やかで印象的な表になります。キャンペーンページやサービス紹介など、目を引きたい場面に向いています。
thead th {
background: linear-gradient(135deg, #6a8dff, #9b5cff);
color: #fff;
padding: 16px;
border: none;
}
table {
border-collapse: separate;
border-spacing: 0;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 6px 20px rgba(107, 92, 255, 0.15);
}
tbody td {
padding: 14px 16px;
border-bottom: 1px solid #eee;
}
linear-gradient(135deg, 色A, 色B)は、指定した角度(135度=左上から右下)に向かって色Aから色Bへ変化させる指定です。同系色の2色を選ぶと上品に、離れた色を選ぶと派手にまとまります。表全体に角丸と影を添えると、ヘッダーのグラデーションが引き立ち、まとまりのある華やかな表になります。ただし装飾が強いぶん、データを冷静に読ませたい資料には不向きです。使う場面を選びましょう。
ここまで多くのデザインを紹介してきましたが、実務ではこれらを組み合わせて使うことがほとんどです。ただし、あれもこれもと足しすぎると、かえって読みにくくなります。組み合わせるときの基本方針を押さえておきましょう。
ストライプ+ホバー、角丸+影、のように装飾は2〜3個の組み合わせに絞るのが読みやすさの目安です。ストライプ・縦罫線・影・カード化・グラデーションを全部盛りにすると、情報より装飾が目立ってしまい、肝心の中身が頭に入りません。「この表で一番伝えたいことは何か」を考え、それを助ける装飾だけを残すのがコツです。引き算の意識が、洗練された表を作ります。
1つの表だけおしゃれでも、サイト内の表ごとにデザインがバラバラだと、かえって素人っぽく見えます。色・角丸・余白のルールをサイト全体で統一すると、まとまりのあるプロっぽい印象になります。具体的には、見出しの色は1色に決める、角丸の半径は揃える、余白の値は共通にする、といったルールを最初に決めておくとよいでしょう。CSSを1か所にまとめて書き、各表ではクラス名を付けるだけにしておくと、この統一が楽になります。
表は資料として印刷されることもあります。背景色に頼ったデザインは印刷すると色が飛んで見にくくなることがあるので、印刷を想定するなら罫線ベースのデザインも用意しておくと安心です。また、近年はダークモード対応も求められます。@media (prefers-color-scheme: dark)を使えば、暗い背景のときだけ表の色を切り替えられます。すべての表で対応する必要はありませんが、頭の片隅に置いておくと、より親切な表が作れます。
おしゃれさと同じくらい大切なのがアクセシビリティです。目で見て分かる表でも、読み上げソフトを使う人や、色の見分けが難しい人にとって使いにくいと、本当に「良い表」とは言えません。難しいことはなく、いくつかのポイントを押さえるだけで対応できます。
そもそもアクセシビリティとは、年齢や障害の有無、使っている機器にかかわらず、誰もが同じように情報にアクセスできる状態を指します。表は「見出しとデータの対応関係」を持つ構造なので、この関係が読み上げソフトに正しく伝わるかどうかが特に重要になります。逆に言えば、正しいHTMLで組んでおけば、追加のコストをほとんどかけずにアクセシブルな表が作れます。おしゃれさとアクセシビリティは対立するものではなく、正しい土台の上に装飾を乗せれば両立できる、と考えてください。
土台のHTMLで解説したとおり、見出しセルは<th>にし、scopeを付けることが基本です。これがあると、読み上げソフトはセルを読むときに対応する見出しも一緒に読んでくれます。たとえば「980円」だけでなく「スタンダード、月額、980円」と読まれるので、どの数字か迷いません。見た目には表れませんが、必ず入れておきたい配慮です。
<caption>で表のタイトルを付けておくと、読み上げソフトが最初に「これは○○の表です」と教えてくれます。ページ内に表が複数あるとき特に効果的です。見た目上は非表示にしたい場合でも、要素は残して視覚的にだけ隠すのが正しいやり方です。
/* captionを見た目上だけ隠す(読み上げには残る) */
caption {
position: absolute;
width: 1px;
height: 1px;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
}
display: none;で消すと読み上げソフトからも消えてしまいます。上のように1pxに縮めて画面外に追いやる書き方(スクリーンリーダー用の非表示テクニック)を使えば、見た目には出さず、読み上げには残せます。
見出しの背景色と文字色は、十分なコントラストを確保しましょう。薄いグレーの背景に薄い文字だと読みにくく、色の見分けが難しい人にはさらに厳しくなります。目安として、背景が濃ければ文字は白、背景が薄ければ文字は濃いグレー〜黒、と覚えておくと失敗しません。
コントラストが十分かどうかは感覚に頼らず、チェックツールで確認できます。ブラウザの開発者ツールには、文字色と背景色のコントラスト比を自動で計算し、基準を満たしているか教えてくれる機能があります。一般的な本文サイズの文字なら、コントラスト比4.5以上が目安とされています。おしゃれさを優先して色を薄くしたくなる場面もありますが、読めなければ意味がありません。迷ったらツールで数値を確認する習慣をつけましょう。
また、「重要なセルを色だけで示さない」ことも大切です。おすすめプランを黄色にするなら、色に加えて「おすすめ」の文字バッジも付ける。エラーの行を赤にするなら、アイコンや「要確認」の文字も添える。色が見えない人にも情報が届くようにしておきましょう。
表にwidth: 100%;を当てて親要素いっぱいに広げるのは基本ですが、中に長い英単語やURLがあると、そこがはみ出してレイアウトが崩れることがあります。対策として、セルに折り返しの指定を入れておくと安心です。
td {
word-break: break-word;
overflow-wrap: anywhere;
}
word-breakやoverflow-wrapは「長い文字列を途中で折り返してよい」という指定です。これを入れておくと、URLや長い英単語がセルの幅で折り返され、表が横に伸びてページを壊すのを防げます。レスポンシブ表では特に効いてきます。
表の中にリンクやボタンを置く場合は、キーボードだけで操作する人への配慮も忘れないようにしましょう。マウスを使わずTabキーで移動する人にとって、今どこを選択しているかが分かる「フォーカスの枠」はとても重要です。a:focusやbutton:focusにoutline(枠線)を残しておき、うっかりoutline: none;で消してしまわないよう注意してください。おしゃれさのために枠を消すと、キーボード利用者が迷子になります。
最後に、根本的な話をひとつ。見た目を整えるためだけに<table>を使わないことも、広い意味でのアクセシビリティです。かつては段組みレイアウトに表が使われていましたが、これは読み上げソフトを混乱させます。表は「行と列に意味があるデータ」を表すためのものです。レイアウト目的ならCSSのFlexboxやGridを使い、表は本来のデータ整理に使う、と役割を分けましょう。この使い分けが、結果的に検索エンジンにも正しく内容を伝えることにつながります。
ここからは、実際にブログやメディアで表を使うときの現場の判断基準を、編集部の実践をもとに紹介します。デザインのコードは揃っても、「どの表をどう使うか」で読みやすさは大きく変わります。
WordPressには標準で「テーブル」ブロックがあり、簡単な表ならこれで十分です。ただし、凝ったデザインや細かいレスポンシブ制御をしたいなら、HTMLブロックで自分でマークアップするほうが自由がききます。編集部では、社内の記事全体で表の見た目を統一したいとき、テーマの追加CSSに表用のスタイルをまとめて書き、記事側ではクラス名を付けるだけにしています。こうすると、あとから全記事の表のデザインを一括で変えられます。
具体的な運用としては、まず「よく使う表のパターン」を2〜3種類に絞ります。たとえば「基本表」「料金比較表」「スマホ縦積み表」の3つです。それぞれにクラス名(.tbl-basic、.tbl-price、.tbl-stackなど)を決め、CSSは追加CSSに1回だけ書いておきます。記事を書くときは、HTMLブロックで<table>にそのクラスを付けるだけ。パターンを絞ってCSSを共通化することで、記事ごとにデザインを考える手間がなくなり、サイト全体の見た目も揃います。これは表に限らず、あらゆるパーツで有効な考え方です。
記事の本文幅は限られているため、列が3〜4個を超える表はPCでもはみ出しがちです。編集部では表は必ずoverflow-x: auto;の囲みに入れることをルールにしています。こうしておけば、想定より列が増えても本文レイアウトが崩れる事故を防げます。表を作るときは「囲みで包む」を最初のひと手間として習慣にしておくと安心です。
スマホ対応で「横スクロール」と「縦積み」のどちらを選ぶか、編集部では次の基準で決めています。判断に迷ったときの目安にしてください。
| 表の特徴 | おすすめの方式 | 理由 |
|---|---|---|
| 列が5個以上ある比較表・スペック表 | 横スクロール | 縦積みにすると1行が長くなりすぎて読みにくい |
| 列が2〜4個の料金表・プロフィール表 | 縦積み(data-label) | 全体が一目で見え、スクロール不要で親切 |
| 数値の大小を横並びで比べたい表 | 横スクロール | 並べて比較する体験を保てる |
| 1行ずつじっくり読ませたい表 | 縦積み(カード風) | 1件ごとにまとまって読みやすい |
迷ったら「並べて比べる表は横スクロール、1件ずつ読む表は縦積み」と覚えておくと、だいたい正解を選べます。両方を無理に組み合わせず、その表に合った1つの方式に絞るのが崩れないコツです。
もう一歩踏み込むと、判断のカギは「読者がその表で何をしたいか」にあります。料金プランの表なら、読者は複数のプランを見比べて「自分に合うのはどれか」を決めたいはずです。この場合は横に並んでいたほうが比較しやすいので、スマホでも横スクロールで並びを保つのが親切です。一方、店舗一覧や求人一覧のように1件ずつ独立した情報を読ませたい表なら、縦積みのカード化が向いています。1件ごとに区切られていたほうが、情報が混ざらず頭に入るからです。デザインの正解は表の中身ではなく「読者の目的」で決まる、と意識すると迷いが減ります。
記事を公開する前に、編集部では次の項目を毎回確認しています。自分でもこのチェックリストを使うと、表まわりのミスを大きく減らせます。
<th>になっているか(<td>で代用していないか)scope属性は付いているかdata-labelの項目名がすべてのセルに入っているか特にスマホ実機での確認は欠かせません。ブラウザの開発者ツールで縮小表示するだけでは気づけない崩れが、実機では見つかることが多いです。公開前のひと手間として習慣にしましょう。
正しくマークアップされた表は、検索エンジンやAIにも内容が伝わりやすくなるというメリットがあります。<th>と<td>で見出しとデータをきちんと区別し、<caption>で表の主題を示しておくと、検索エンジンは「これは○○を比較した表だ」と理解しやすくなります。近年はAIが記事を要約・引用する場面も増えており、構造が整った表ほど正確に読み取ってもらえます。見た目のためだけでなく、情報を正しく伝える意味でも、正しいマークアップは効いてきます。CSSで飾る前に、まず構造を正しくする——この順番を守ることが、読者にもエンジンにも優しい表を作る近道です。
たまに、デザインを作り込むために表全体を画像として貼る人がいますが、これはおすすめしません。画像の表は、スマホで拡大しないと読めず、読み上げソフトも内容を読めず、検索エンジンも中身を理解できません。この記事で紹介したように、CSSを使えばテキストのままでも十分おしゃれな表が作れます。特別な理由がない限り、表は必ずテキスト(HTMLの<table>)で作りましょう。手間は少し増えますが、読みやすさ・アクセシビリティ・SEOのすべてで有利になります。
最も手軽なのは、表を<div>や<figure>で囲み、その囲みにoverflow-x: auto;を当てる方法です。これで、はみ出した分は横スクロールで見られるようになり、本文レイアウトの崩れも防げます。表本体にmin-widthを指定して、縮みすぎて文字が潰れるのを防ぐのも忘れないでください。列が少ない表なら、data-labelを使った縦積みに切り替えるのも有効です。
なぜ「はみ出す」ことが起きるのかというと、表は中身の文字数に合わせて幅が広がる性質を持っているからです。列が5つも6つもある表は、スマホの画面幅(一般に375px前後)にはとても収まりません。ここで無理に画面内へ押し込もうとすると、文字が改行だらけになって縦に間延びしたり、逆にセルが潰れて読めなくなったりします。だからこそ、「無理に収めず、はみ出した分はスクロールで見せる」という発想が実務では定番になっています。囲みでスクロールさせるやり方は、どんな表にも効くいちばん安全な保険だと覚えておいてください。
HTMLの中で改行したい位置に<br>を入れれば、その場所で改行されます。文章の長さに応じて自動で折り返してほしいだけなら、そのセルの幅が決まっていれば自動で折り返されます。長い英単語やURLがはみ出す場合は、CSSでword-break: break-word;やoverflow-wrap: anywhere;を当てると、途中でも折り返してくれます。
表にtable-layout: fixed;を指定してください。これを付けると、列幅がセルの中身ではなく指定した幅で決まるようになります。あわせて各<th>や<col>にwidthを指定すれば、狙った幅に固定できます。
table {
table-layout: fixed;
width: 100%;
}
th:nth-child(1) { width: 30%; }
th:nth-child(2) { width: 20%; }
th:nth-child(3) { width: 50%; }
すべてのセルの罫線を消すには、th, td { border: none; }と指定します。ただし罫線を全部消すと行の区切りが分からなくなるので、代わりにストライプ(1行おきの背景色)や、横線だけを残す(border-bottomのみ)方法と組み合わせるのがおすすめです。区切りをなくすのではなく、罫線以外の方法で区切りを示すと考えてください。
可能です。まず全体の罫線を消してから、border-leftやborder-rightだけを指定すると縦線だけの表になります。たとえばtd, th { border-right: 1px solid #ddd; }とし、右端のセルだけ:last-childで消せば、内側にだけ縦罫線が並びます。数値を列ごとに区切って見せたいときに便利です。
スマホやタブレットには基本的にマウスホバーがないため、:hoverの効果はPC向けの補助的な演出と考えてください。タップした瞬間に一瞬反応することはありますが、狙った動きにはなりません。スマホでの見やすさは、ホバーではなくストライプや十分な余白、縦積みレイアウトで確保するのが正解です。
できます。見出しセルにposition: sticky;とtop: 0;を指定します。表を囲む要素に高さとoverflow-y: auto;を付け、その中で見出しを固定するのが基本です。詳しくは本文の「固定ヘッダー」の章で解説しています。固定した見出しには必ず背景色を付けるのを忘れないでください。透明だと下の行が透けてしまいます。
問題ありません。<td>の中には画像・ボタン・リンクなど自由に入れられます。ただしセルの高さが不揃いになりやすいので、画像はサイズを揃える、ボタンはvertical-align: middle;で高さを合わせるなど、少し調整すると見た目が整います。比較表に「申し込む」ボタンを並べるときなどによく使うテクニックです。
HTMLのcolspanとrowspanという属性を使います。<td colspan="2">と書けば横に2列分をまたぐセルになり、<td rowspan="2">なら縦に2行分をまたぎます。見出しをグループ化したいときなどに便利です。ただし、結合が多い複雑な表はスマホでの縦積みが難しくなるので、レスポンシブ対応が必要な表ではなるべく結合を減らすのがおすすめです。
補足すると、セル結合はCSSではなくHTMLの属性で行う点に注意してください。CSSだけで「2列分の見た目」を作ろうとすると崩れやすく、読み上げソフトにも正しく伝わりません。結合はあくまでcolspan/rowspanで構造として表現し、CSSは色や余白などの見た目調整に専念させるのが正しい役割分担です。また、結合したセルが多い表は後から列を1つ増やす・減らすといった修正がとても大変になります。運用中に項目が増えそうな表は、最初から結合を最小限にしておくと長く使えます。
できます。table, th, td { background: transparent; }と指定すれば、セルの背景が透明になり、ページの背景色や背景画像が透けて見えます。おしゃれな背景の上に表を重ねたいときに使えます。ただし背景の上で文字が読みにくくならないかは必ず確認してください。背景が複雑な場合は、うっすら半透明の白(rgba(255,255,255,0.7)など)を敷くと、読みやすさと透け感を両立できます。
表の幅をwidthで指定し、左右のマージンをautoにすると中央に置けます。たとえばtable { width: 600px; margin: 0 auto; }とすれば、幅600pxの表がページ中央に配置されます。小さめの表を本文の中央に置きたいときに使えます。ただしスマホではwidth: 100%;に切り替わるよう、max-widthで指定しておくと安全です(max-width: 600px; width: 100%;)。
もちろん大丈夫です。むしろ実務では組み合わせて使うのが普通です。たとえば「基本の整形+ストライプ+ホバー」や「角丸ヘッダー+影」のように重ねると、より完成度が上がります。ただし装飾は2〜3個までに絞るのがコツで、全部盛りにすると情報より装飾が目立ち、かえって読みにくくなります。本文の「組み合わせるときの考え方」の章で詳しく解説しているので、あわせて読んでみてください。
できます。@media(メディアクエリ)を使えば、画面幅に応じて別々のCSSを適用できます。たとえば「PCでは横並びの比較表、スマホでは縦積みのカード表」というように、同じHTMLのまま見た目だけを切り替えられます。本文の縦積みデザインがまさにこの仕組みです。1つのHTMLで両対応できるので、PC用・スマホ用に別々の表を用意する必要はありません。1つの正しいマークアップを、CSSで見せ方だけ変えるのが基本の考え方です。
文字サイズはfont-size、行の高さはline-height、セルの余白はpaddingで調整します。読みやすい表にする最大のコツは、実は装飾よりも余白(padding)を十分に取ることです。目安として、セルの上下に10〜14px、左右に14〜18px程度の余白を確保すると、詰まった印象が一気に解消されます。データが多くて縦に長くなる表なら、行の高さをやや詰めて一覧性を上げるなど、表の目的に合わせて調整してください。数字を扱う列はtext-align: right;で右揃えにすると、桁が揃って格段に読みやすくなります。
表に共通のクラス名(たとえばclass="my-table")を付け、そのクラスに対してCSSを書いておけば、同じクラスを付けるだけでどのページの表にも同じデザインが適用されます。CSSを1か所にまとめておけば、色やデザインを変えたくなったときも1か所直すだけで全ページに反映されます。ページごとに<style>を書き散らすのではなく、共通のスタイルシート(CSSファイル)に集約するのが、後々の修正を楽にするコツです。
この記事では、CSSでおしゃれな表を作る方法を、基本の整形からストライプ・ホバー・角丸・影・カード化・レスポンシブまで、コピペで使えるデザイン集として紹介しました。どれも外部ライブラリ不要で、CSSを数行足すだけで実装できます。まずは気になったデザインをそのまま貼り付け、色や余白を自分のサイトに合わせて微調整するところから始めてみてください。
大切なのは、見た目のおしゃれさと読みやすさ・アクセシビリティ・スマホ対応を両立させることです。特にスマホでの崩れは読者の離脱に直結するので、公開前に実機で必ず確認しましょう。
最後に、上達のいちばんの近道は「まず1つ貼って動かしてみる」ことです。この記事のコードは、そのままコピーすれば動くように書いています。頭で理解しようとする前に、気に入ったデザインを1つ選んで自分のページに貼り、色や余白の数字を少しずつ変えてみてください。変えた瞬間に見た目がどう変わるかを目で確かめることで、CSSのプロパティが体で覚えられます。手を動かした回数だけ、表づくりは上達します。今日紹介したデザインを土台に、あなたのサイトに合った「地味じゃない表」を作っていきましょう。
・基本はborder-collapseとpadding:罫線をまとめ、余白をしっかり取るだけで素の表は見違える。装飾はそのあと。
・スマホ対策は横スクロールか縦積みの2択:列が多ければoverflow-x: auto;、少なければdata-labelで縦積み。表に合わせて1つに絞る。
・見た目と同じくらいアクセシビリティ:th scope・caption・十分なコントラストで、誰にとっても伝わる表にする。
表づくりのようなCSSの実装力は、正しい順序で手を動かして学べば未経験からでも必ず身につきます。「コピペはできるけど、なぜそう書くのか分からない」から一歩進みたい方は、体系立てて学べる環境を使うのが近道です。WithCodeなら、HTML/CSSの基礎からLP制作まで、実際に手を動かしながら学べます。

副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
WithCodeでWeb制作を習得後、フリーランスエンジニアとして活動。HTML/CSS・JavaScript・WordPress案件を中心に年間20件以上の制作実績を持つ。「難しい技術をわかりやすく」をモットーに、初心者〜中級者向けの技術記事を執筆。副業・フリーランス独立を目指す方に向けた情報発信に注力している。
公式サイト より
今すぐ
無料カウンセリング
を予約!