HTML/CSS
初心者でもスッキリ分かる!nth-childとnth-of-typeの基本と実践例
2025.12.15
Webサイトで情報を整理して見やすく表示したいときに便利なのがtableタグです。商品一覧、料金表、スケジュール表など、日常的に目にする「表」を作ることができます。この記事では、HTML初心者の方向けに、tableタグの基本構造からCSSを使った最低限の装飾を、料金表のサンプルで解説します。まずは基本をしっかり押さえて、tableタグの扱いに慣れていきましょう。
tableタグを用いて表のサンプルを用意しました。今回はこれを基に解説していきます。
| サービス料金表 | ||
|---|---|---|
| アイコン | プラン名 | 料金 |
![]() |
スタンダード | 1,000円 |
![]() |
プレミアムA | 2,500円 |
| プレミアムB | 3,000円 | |
<table class="sample-table">
<tr>
<th colspan="3" class="title-cell">サービス料金表</th>
</tr>
<tr>
<th>アイコン</th>
<th>プラン名</th>
<th>料金</th>
</tr>
<tr>
<td><img src="image/icon_a.png" alt="アイコン"></td>
<td>スタンダード</td>
<td>1,000円</td>
</tr>
<tr>
<td rowspan="2"><img src="image/icon_b.png" alt="アイコン"></td>
<td>プレミアムA</td>
<td>2,500円</td>
</tr>
<tr>
<td>プレミアムB</td>
<td>3,000円</td>
</tr>
</table>
CSS
.sample-table {
margin: 30px 0;
width: 100%;
border-collapse: collapse;
background-color: #fafafa;
}
.sample-table th,
.sample-table td {
width: 40%;
border: 1px solid #ccc;
padding: 10px;
text-align: center;
vertical-align: middle;
background-color: #dbffdb;
}
.sample-table th:nth-of-type(1),
.sample-table td:nth-of-type(1){
width: 20%;
}
.sample-table .title-cell {
background-color: #4caf50;
color: #fff;
font-size: 1.2em;
}
.sample-table img{
height: 40px;
}
前の章で紹介した見本がどのように組み立てられているのか、構造に沿って解説していきます。実際の手順とセットで理解すると、どんな表でも応用ができるようになります。tableタグは、table → tr(行) → th(見出しセル) / td(データセル) という基本構造で成り立っています。それを踏まえてtableタグ内を一行ずつみていきます。また、視認性のためCSSが予め設定されています。
<table class="sample-table">
<tr>
<th colspan="3" class="title-cell">サービス料金表</th>
</tr>
</table>
| サービス料金表 |
|---|
この行は表全体のタイトル(見出し帯)になるので見出しとなるthを使います。さらに、thにcolspan=”3″を付けて横3列分を1つのセルに結合しています。また、ここで「3列分」と宣言しているため、この後に続く行は各行が3列分のセル構成である前提になります。
<table class="sample-table">
<tr>
<th colspan="3" class="title-cell">サービス料金表</th>
</tr>
<tr>
<th>アイコン</th>
<th>プラン名</th>
<th>料金</th>
</tr>
</table>
| サービス料金表 | ||
|---|---|---|
| アイコン | プラン名 | 料金 |
次に各列の見出しをthで並べていきます。ここで列の「意味」を決めるので、今回は1列目=アイコン、2列目=プラン名、3列目=料金の順に合わせて値を入れます。こうすることで、1行目3列分の結合セルとの整合性がとれます。
<table class="sample-table">
<tr>
<th colspan="3" class="title-cell">サービス料金表</th>
</tr>
<tr>
<th>アイコン</th>
<th>プラン名</th>
<th>料金</th>
</tr>
<tr>
<td><img src="image/icon_a.png" alt="アイコン"></td>
<td>スタンダード</td>
<td>1,000円</td>
</tr>
</table>
| サービス料金表 | ||
|---|---|---|
| アイコン | プラン名 | 料金 |
![]() |
スタンダード | 1,000円 |
通常のデータ行です。tdを3つ並べて、上の見出し行と列の対応を保っています。今回はセル内に画像が使われているのでセル内にimgタグが入っています。このように、セルには画像やリンクなどテキスト以外の要素も入れることができます。
<table class="sample-table">
<tr>
<th colspan="3" class="title-cell">サービス料金表</th>
</tr>
<tr>
<th>アイコン</th>
<th>プラン名</th>
<th>料金</th>
</tr>
<tr>
<td><img src="image/icon_a.png" alt="アイコン"></td>
<td>スタンダード</td>
<td>1,000円</td>
</tr>
<tr>
<td rowspan="2"><img src="image/icon_b.png" alt="アイコン"></td>
<td>プレミアムA</td>
<td>2,500円</td>
</tr>
</table>
| サービス料金表 | ||
|---|---|---|
| アイコン | プラン名 | 料金 |
![]() |
スタンダード | 1,000円 |
![]() |
プレミアムA | 2,500円 |
ここでrowspan=”2″を使い、1列目のtdタグをこの行と次行(2行分)を結合させる設定をしておきます。今回は一列目に画像があるので、「同じアイコンが4行目と5行目の両行にまたがる」ようなレイアウトになります。また、rowspanを使うと次の(下の)行ではその列分のtdタグを書かないことに注意してください。具体的には、次行で1列目のtdタグを省略します。
<table class="sample-table">
<tr>
<th colspan="3" class="title-cell">サービス料金表</th>
</tr>
<tr>
<th>アイコン</th>
<th>プラン名</th>
<th>料金</th>
</tr>
<tr>
<td><img src="image/icon_a.png" alt="アイコン"></td>
<td>スタンダード</td>
<td>1,000円</td>
</tr>
<tr>
<td rowspan="2"><img src="image/icon_b.png" alt="アイコン"></td>
<td>プレミアムA</td>
<td>2,500円</td>
</tr>
<tr>
<td>プレミアムB</td>
<td>3,000円</td>
</tr>
</table>
| サービス料金表 | ||
|---|---|---|
| アイコン | プラン名 | 料金 |
![]() |
スタンダード | 1,000円 |
![]() |
プレミアムA | 2,500円 |
| プレミアムB | 3,000円 | |
前行のrowspan=”2″により、1列目はすでに上の行と結合されているため、ここには 2列目・3列目のみを書きます。行内のセル数が見かけ上「2つ」でも、表全体の列数は変わらず3列分として扱われるます。このようにcolspan/rowspanを混ぜると列数や行数の数え方が複雑になります。常に列数の総合性を意識してください。
完成見本では次のようなCSSを使用しました。
.sample-table {
margin: 30px 0;
width: 100%;
border-collapse: collapse;
background-color: #fafafa;
}
.sample-table th,
.sample-table td {
width: 40%;
border: 1px solid #ccc;
padding: 10px;
text-align: center;
vertical-align: middle;
background-color: #dbffdb;
}
.sample-table th:nth-of-type(1),
.sample-table td:nth-of-type(1){
width: 20%;
}
.sample-table .title-cell {
background-color: #4caf50;
color: #fff;
font-size: 1.2em;
}
.sample-table img{
height: 40px;
}
この中でもsample-tableクラスのborder-collapseはtableでは必須の専用のプロパティで、セル間の罫線を設定します。今回はborder-collapseで設定できる代表的な値を2つ紹介します。
collapseは隣り合うセルの罫線を一本にまとめる設定です。今回の見本でcollapseが使われているように、線を均一にした表を作る際にオススメです。
| サービス料金表 | ||
|---|---|---|
| アイコン | プラン名 | 料金 |
![]() |
スタンダード | 1,000円 |
![]() |
プレミアムA | 2,500円 |
| プレミアムB | 3,000円 | |
separateは、各セルが独立した箱として扱われる設定です。セル同士の枠線が独立するため、線が重なる部分があると太く見えることがあります。また、プロパティ値がseparateの場合、枠線が独立するためセル間に余白(セル間距離)を作ることができます。その際に利用できるプロパティにborder-spacingというものがあり表内で余白を持たせたいときや二重線を表したいときに便利です。
.sample-table {
margin: 30px 0;
width: 100%;
border-collapse: separate;
border-spacing: 10px;
background-color: #fafafa;
}
| サービス料金表 | ||
|---|---|---|
| アイコン | プラン名 | 料金 |
![]() |
スタンダード | 1,000円 |
![]() |
プレミアムA | 2,500円 |
| プレミアムB | 3,000円 | |
tableタグは表組みだけでなく、レスポンシブに対応しても要素が崩れにくく、縦横のレイアウトを簡単に整えられる点でも便利な要素です。勝手にレイアウトが変わらないためカレンダーや電卓など横幅を変えても位置が崩れないものを表示したいときなどに有効です。こうしたメリットを活かすことで、表以外でも扱うことができるタグです。
投稿一覧に戻る