ホームページに表(テーブル)を作るとき、以下のような悩みを抱えたことはありませんか?
「枠線をつけたいのに出てこない…」 「きれいな罫線(けいせん)で表を見やすくしたい」 「どうして他のサイトみたいにおしゃれな表にならないの?」 「スマホで見ても崩れない表を作りたい」
実はHTMLのテーブルは、書いただけでは枠線が表示されません。これは多くの初心者がつまずくポイントです。しかし、適切な方法を知れば、誰でも簡単に見やすくて美しい表を作ることができます。
この記事では、HTMLで表に枠線をつける基本的な方法から、CSSを使ってもっときれいに枠線を調整するやり方、さらにレスポンシブ対応やアクセシビリティまで、初心者にもわかりやすく詳しく解説します。
これを読めば、見やすいテーブルを自分で自由に作れるようになりますよ。
HTMLテーブルの基礎知識

テーブルの基本構造
まず、HTMLテーブルの基本的な構造を理解しましょう:
<table>
<thead>
<tr>
<th>見出し1</th>
<th>見出し2</th>
</tr>
</thead>
<tbody>
<tr>
<td>データ1</td>
<td>データ2</td>
</tr>
</tbody>
</table>
主要なHTMLタグ
タグ | 意味 | 用途 |
---|---|---|
<table> | 表全体 | テーブルの土台 |
<thead> | ヘッダー部分 | 見出し行をグループ化 |
<tbody> | ボディ部分 | データ行をグループ化 |
<tr> | 行(table row) | 横の行を作成 |
<th> | 見出しセル | 列や行の見出し |
<td> | データセル | 実際のデータ |
なぜ枠線が表示されないのか
HTMLテーブルは、デフォルトでは以下の理由で枠線が表示されません:
- ブラウザのデフォルトCSS:枠線なしが標準設定
- HTML5の思想:構造と見た目の分離
- アクセシビリティ重視:必要な場合のみ視覚的装飾を追加
HTMLだけで表に枠線をつける方法(border属性)
border属性の基本的な使い方
最もシンプルな方法は、HTMLの<table>
タグにborder
属性を追加することです:
<table border="1">
<tr>
<th>商品名</th>
<th>価格</th>
<th>在庫</th>
</tr>
<tr>
<td>りんご</td>
<td>100円</td>
<td>50個</td>
</tr>
<tr>
<td>みかん</td>
<td>80円</td>
<td>30個</td>
</tr>
</table>
border属性の値と効果
値 | 効果 |
---|---|
border="0" | 枠線なし(デフォルト) |
border="1" | 1ピクセルの枠線 |
border="2" | 2ピクセルの枠線 |
border="3" | 3ピクセルの枠線 |
border属性の問題点と制限
HTML5での非推奨
<!-- ❌ HTML5では推奨されない -->
<table border="1">
<!-- ✅ HTML5での推奨方法 -->
<table style="border: 1px solid black;">
カスタマイズの限界
border属性では以下のカスタマイズができません:
- 枠線の色の指定
- 枠線のスタイル(点線、二重線など)
- 個別セルの枠線制御
- レスポンシブ対応
いつborder属性を使うべきか
以下の場合に限り、border属性の使用が適切です:
- プロトタイプ作成時:素早く枠線を確認したい
- メール配信用HTML:古いメールクライアント対応
- レガシーシステム:CSS使用が制限されている
CSSで表に枠線をつける方法
CSSの基本的な書き方
現代のWebサイトでは、CSSを使用して表の枠線をスタイリングするのが標準的な方法です:
<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
border: 1px solid black;
}
</style>
</head>
<body>
<table>
<tr>
<th>商品名</th>
<th>価格</th>
<th>在庫</th>
</tr>
<tr>
<td>バナナ</td>
<td>120円</td>
<td>25個</td>
</tr>
<tr>
<td>オレンジ</td>
<td>90円</td>
<td>40個</td>
</tr>
</table>
</body>
</html>
borderプロパティの詳細
基本構文
border: [太さ] [スタイル] [色];
太さの指定方法
border: 1px solid black; /* 1ピクセル */
border: 2px solid black; /* 2ピクセル */
border: 0.5em solid black; /* 0.5文字分 */
border: thin solid black; /* 細い線 */
border: medium solid black; /* 中程度の線 */
border: thick solid black; /* 太い線 */
スタイルの種類
スタイル | 見た目 | 用途 |
---|---|---|
solid | 実線 | 一般的な表 |
dashed | 破線 | カジュアルな表 |
dotted | 点線 | 軽い区切り |
double | 二重線 | 重要な区切り |
groove | 溝のような線 | 立体感 |
ridge | 尾根のような線 | 立体感 |
inset | くぼんだ線 | 押し込まれた感じ |
outset | 出っ張った線 | 浮き上がった感じ |
色の指定方法
/* 色名での指定 */
border: 1px solid red;
border: 1px solid blue;
/* 16進数での指定 */
border: 1px solid #ff0000; /* 赤 */
border: 1px solid #0000ff; /* 青 */
/* RGB値での指定 */
border: 1px solid rgb(255, 0, 0); /* 赤 */
border: 1px solid rgba(255, 0, 0, 0.5); /* 半透明の赤 */
/* HSL値での指定 */
border: 1px solid hsl(0, 100%, 50%); /* 赤 */
枠線が二重に見える問題の解決
問題の原因
デフォルトでは、各セルに個別に枠線が設定されるため、隣接するセルの境界で線が二重に表示されます:
/* ❌ 二重線になる例 */
table, th, td {
border: 1px solid black;
}
border-collapseによる解決
/* ✅ 正しい方法 */
table {
border-collapse: collapse; /* 重要! */
}
table, th, td {
border: 1px solid black;
}
border-collapseの値
値 | 効果 |
---|---|
collapse | 隣接する枠線を結合(推奨) |
separate | 各セルの枠線を分離(デフォルト) |
外部CSSファイルでの管理
HTMLファイル
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="table-styles.css">
</head>
<body>
<table class="data-table">
<!-- テーブル内容 -->
</table>
</body>
</html>
CSSファイル(table-styles.css)
.data-table {
border-collapse: collapse;
width: 100%;
}
.data-table th,
.data-table td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
.data-table th {
background-color: #f2f2f2;
font-weight: bold;
}
表の枠線をおしゃれにするテクニック

基本的なスタイリング
色と太さの調整
table {
border-collapse: collapse;
width: 100%;
}
th, td {
border: 2px solid #4CAF50; /* 緑色の2px線 */
padding: 12px;
text-align: left;
}
th {
background-color: #4CAF50;
color: white;
}
セルの内側に余白をつける
th, td {
padding: 15px; /* 上下左右に15px */
/* または個別指定 */
padding-top: 10px;
padding-right: 15px;
padding-bottom: 10px;
padding-left: 15px;
}
プロフェッショナルなデザイン例
ビジネス向けテーブル
.business-table {
border-collapse: collapse;
width: 100%;
margin: 20px 0;
font-family: Arial, sans-serif;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
.business-table th {
background-color: #2c3e50;
color: white;
padding: 15px;
text-align: left;
border-bottom: 2px solid #34495e;
}
.business-table td {
padding: 12px 15px;
border-bottom: 1px solid #ddd;
}
.business-table tr:hover {
background-color: #f5f5f5;
}
.business-table tr:nth-child(even) {
background-color: #f9f9f9;
}
ミニマルデザインテーブル
.minimal-table {
border-collapse: collapse;
width: 100%;
background: white;
}
.minimal-table th {
border-bottom: 2px solid #e74c3c;
padding: 20px 15px;
text-align: left;
font-weight: 600;
color: #2c3e50;
}
.minimal-table td {
border-bottom: 1px solid #ecf0f1;
padding: 15px;
color: #34495e;
}
.minimal-table tr:last-child td {
border-bottom: none;
}
インタラクティブな効果
ホバー効果
.interactive-table tr:hover {
background-color: #e8f4fd;
transform: scale(1.01);
transition: all 0.2s ease;
}
クリック可能な行
.clickable-table tr {
cursor: pointer;
transition: background-color 0.2s ease;
}
.clickable-table tr:hover {
background-color: #f0f8ff;
}
.clickable-table tr:active {
background-color: #d6ebf5;
}
部分的な枠線のカスタマイズ
特定の境界線のみを表示
上下の線のみ
.horizontal-lines-only th,
.horizontal-lines-only td {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
border-left: none;
border-right: none;
}
縦線のみ
.vertical-lines-only th,
.vertical-lines-only td {
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-top: none;
border-bottom: none;
}
外枠のみ
.outer-border-only {
border: 2px solid #333;
}
.outer-border-only th,
.outer-border-only td {
border: none;
padding: 10px;
}
特定のセルのスタイリング
重要なセルを強調
.highlight-cell {
border: 2px solid #e74c3c !important;
background-color: #fff5f5;
font-weight: bold;
}
条件付きスタイリング
/* 偶数行の背景色 */
.striped-table tr:nth-child(even) {
background-color: #f8f9fa;
}
/* 奇数行の背景色 */
.striped-table tr:nth-child(odd) {
background-color: white;
}
/* 最初の列を強調 */
.highlight-first-column td:first-child,
.highlight-first-column th:first-child {
background-color: #e3f2fd;
font-weight: bold;
}
レスポンシブ対応

スマートフォンでの表示問題
従来のテーブルは、画面幅が狭いデバイスで以下の問題が発生します:
- 横スクロールが発生
- 文字が小さくなりすぎる
- 枠線が見づらくなる
横スクロール対応
.responsive-table-container {
overflow-x: auto;
margin: 20px 0;
}
.responsive-table {
min-width: 600px;
border-collapse: collapse;
width: 100%;
}
カード形式への変換
@media screen and (max-width: 768px) {
.responsive-card-table,
.responsive-card-table thead,
.responsive-card-table tbody,
.responsive-card-table th,
.responsive-card-table td,
.responsive-card-table tr {
display: block;
}
.responsive-card-table thead tr {
position: absolute;
top: -9999px;
left: -9999px;
}
.responsive-card-table tr {
border: 1px solid #ccc;
margin-bottom: 10px;
padding: 10px;
border-radius: 5px;
}
.responsive-card-table td {
border: none;
position: relative;
padding-left: 50%;
}
.responsive-card-table td:before {
content: attr(data-label) ": ";
position: absolute;
left: 6px;
width: 45%;
font-weight: bold;
}
}
HTML例(data-label属性付き)
<table class="responsive-card-table">
<thead>
<tr>
<th>商品名</th>
<th>価格</th>
<th>在庫</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="商品名">りんご</td>
<td data-label="価格">100円</td>
<td data-label="在庫">50個</td>
</tr>
</tbody>
</table>
アクセシビリティの考慮
適切なマークアップ
<table>
<caption>2024年第1四半期売上実績</caption>
<thead>
<tr>
<th scope="col">月</th>
<th scope="col">売上(万円)</th>
<th scope="col">前年比</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1月</th>
<td>150</td>
<td>+5%</td>
</tr>
</tbody>
</table>
スクリーンリーダー対応
/* フォーカス可能な要素の枠線強調 */
table:focus-within {
outline: 2px solid #4285f4;
outline-offset: 2px;
}
/* 高コントラストモード対応 */
@media (prefers-contrast: high) {
table, th, td {
border-color: currentColor;
}
}
実践的な完成例

シンプルな商品一覧表
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>商品一覧表</title>
<style>
.product-table {
border-collapse: collapse;
width: 100%;
max-width: 800px;
margin: 20px auto;
font-family: 'Helvetica Neue', Arial, sans-serif;
background: white;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
border-radius: 8px;
overflow: hidden;
}
.product-table caption {
padding: 20px;
font-size: 1.5em;
font-weight: bold;
color: #2c3e50;
background-color: #ecf0f1;
}
.product-table th {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 15px;
text-align: left;
font-weight: 600;
border-bottom: 3px solid #5a6cb2;
}
.product-table td {
padding: 12px 15px;
border-bottom: 1px solid #e0e0e0;
color: #333;
}
.product-table tr:hover {
background-color: #f8f9ff;
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
transition: all 0.2s ease;
}
.product-table .price {
font-weight: bold;
color: #27ae60;
}
.product-table .stock-low {
color: #e74c3c;
font-weight: bold;
}
.product-table .stock-ok {
color: #27ae60;
}
/* レスポンシブ対応 */
@media (max-width: 768px) {
.product-table {
font-size: 14px;
}
.product-table th,
.product-table td {
padding: 8px;
}
}
</style>
</head>
<body>
<table class="product-table">
<caption>果物販売店 在庫一覧</caption>
<thead>
<tr>
<th>商品名</th>
<th>価格</th>
<th>在庫数</th>
<th>産地</th>
</tr>
</thead>
<tbody>
<tr>
<td>りんご(ふじ)</td>
<td class="price">120円</td>
<td class="stock-ok">45個</td>
<td>青森県</td>
</tr>
<tr>
<td>みかん</td>
<td class="price">80円</td>
<td class="stock-low">5個</td>
<td>愛媛県</td>
</tr>
<tr>
<td>バナナ</td>
<td class="price">150円</td>
<td class="stock-ok">30房</td>
<td>フィリピン</td>
</tr>
<tr>
<td>ぶどう(巨峰)</td>
<td class="price">300円</td>
<td class="stock-ok">20房</td>
<td>山梨県</td>
</tr>
</tbody>
</table>
</body>
</html>
よくある問題とトラブルシューティング
枠線が表示されない場合
問題1:CSSが適用されていない
症状: 枠線のCSSを書いても表示されない
解決方法:
<!-- ✅ 正しい方法 -->
<head>
<style>
table, th, td {
border: 1px solid black;
}
</style>
</head>
問題2:CSSファイルが読み込まれていない
症状: 外部CSSファイルの枠線が適用されない
解決方法:
<!-- パスを確認 -->
<link rel="stylesheet" href="./css/table-styles.css">
枠線が二重に見える場合
/* ❌ 問題のあるコード */
table, th, td {
border: 1px solid black;
}
/* ✅ 修正版 */
table {
border-collapse: collapse; /* これを追加 */
}
table, th, td {
border: 1px solid black;
}
スマホで表が崩れる場合
/* レスポンシブ対応 */
.table-container {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
table {
min-width: 600px;
}
文字が枠線からはみ出る場合
td {
word-wrap: break-word;
max-width: 200px;
padding: 10px;
}
パフォーマンスとベストプラクティス

効率的なCSS設計
クラスベースの設計
/* ベーステーブルスタイル */
.table {
border-collapse: collapse;
width: 100%;
}
/* バリエーション */
.table--bordered th,
.table--bordered td {
border: 1px solid #ddd;
}
.table--striped tr:nth-child(even) {
background-color: #f9f9f9;
}
.table--hover tr:hover {
background-color: #f5f5f5;
}
使用例
<table class="table table--bordered table--striped table--hover">
<!-- テーブル内容 -->
</table>
パフォーマンス最適化
CSSの最小化
/* 開発版 */
.data-table {
border-collapse: collapse;
width: 100%;
margin: 20px 0;
}
/* 本番版(最小化済み) */
.data-table{border-collapse:collapse;width:100%;margin:20px 0}
不要なスタイルの削除
定期的に使用されていないCSSクラスやスタイルを削除しましょう。
まとめ
HTMLで表に枠線をつける方法について、基本から応用まで詳しく解説しました。
重要なポイント
基本的な方法
- HTML属性:
<table border="1">
(非推奨、緊急時のみ) - CSS推奨:
border
プロパティとborder-collapse: collapse
美しい表の作り方
- 統一感のある色使い:ブランドカラーや読みやすい色の選択
- 適切な余白:
padding
でセル内の余白を調整 - インタラクティブ要素:ホバー効果やストライプ表示
レスポンシブ対応
- 横スクロール:小さな画面での対応
- カード形式:モバイル向けの変換
- 適切なブレークポイント:デバイスに応じた表示切り替え
コメント