以前テーブルを分けてスクロールさせる方法をご紹介いたしました。


今回はCSSでレスポンシブなテーブルを表示する方法をご紹介いたします。
サンプル
サンプルではPCで横に見出しがあるタイプのものを、400px以内の表示の時に「th」と「td」を縦に表示させています。
サンプル1では「th」と「td」を縦に並べ、サンプル2では行(tr)ごとに分離して縦に並べています。
サンプル画像
PCでは見出しとデータを横に表示させ、モバイルでは縦に並べています。
縦に表示
html
<table>
<tbody>
<tr>
<th>見出し1</th>
<td>データ1</td>
</tr>
<tr>
<th>見出し2</th>
<td>データ2</td>
</tr>
<tr>
<th>見出し3</th>
<td>データ3</td>
</tr>
<tr>
<th>見出し4</th>
<td>データ4</td>
</tr>
<tr>
<th>見出し5</th>
<td>データ5</td>
</tr>
<tr>
<th>見出し6</th>
<td>データ6</td>
</tr>
</tbody>
</table>
普通のtable要素です。
css
/* 基本プロパティ */
table {
table-layout: fixed;
border-collapse: collapse;
}
table th,
table td {
padding: 3px 5px;
box-sizing: border-box;
border: 1px solid #ccc;
}
table th {
background: #eee;
}
/* モバイル用 */
@media screen and (max-width: 400px) {
table {
width: 100%;
border-top: 1px solid #ccc;
}
table th,
table td {
display: block;
width: 100%;
text-align: center;
}
table th {
border-top: none;
border-bottom: none;
}
}
PCとモバイルで共通で使用する「基本プロパティ」と横幅400px以内で使用する「モバイル用」に分かれています。
解説1
table {
width: 100%;
border-top: 1px solid #ccc;
}
「border-top: 1px solid #ccc;」でテーブルトップのボーダーを表示しています。テーブル自体にボーダートップを指定する理由は、解説3で記述している「table th」の「border-top: none;」から来ています。
解説2
table th,
table td {
display: block;
width: 100%;
text-align: center;
}
「th」と「td」に対して「display: block;」、「width: 100%;」とすることで縦に表示しています。
解説3
table th {
border-top: none;
border-bottom: none;
}
「th」を縦に表示するので「td」と重なるボーダーを消しています。
全ソース
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>
CSSでレスポンシブなテーブルを表示(縦に表示)
</title>
<style type="text/css">
/* 基本プロパティ */
table {
table-layout: fixed;
border-collapse: collapse;
}
table th,
table td {
padding: 3px 5px;
box-sizing: border-box;
border: 1px solid #ccc;
}
table th {
background: #eee;
}
/* モバイル用 */
@media screen and (max-width: 400px) {
table {
width: 100%;
border-top: 1px solid #ccc;
}
table th,
table td {
display: block;
width: 100%;
text-align: center;
}
table th {
border-top: none;
border-bottom: none;
}
}
</style>
</head>
<body>
<h1>
横幅が400px以内の時に縦に並べる
</h1>
<table>
<tbody>
<tr>
<th>見出し1</th>
<td>データ1</td>
</tr>
<tr>
<th>見出し2</th>
<td>データ2</td>
</tr>
<tr>
<th>見出し3</th>
<td>データ3</td>
</tr>
<tr>
<th>見出し4</th>
<td>データ4</td>
</tr>
<tr>
<th>見出し5</th>
<td>データ5</td>
</tr>
<tr>
<th>見出し6</th>
<td>データ6</td>
</tr>
</tbody>
</table>
</body>
</html>
分離して縦に表示
html
<table>
<tbody>
<tr>
<th>見出し1</th>
<td>データ1</td>
</tr>
<tr>
<th>見出し2</th>
<td>データ2</td>
</tr>
<tr>
<th>見出し3</th>
<td>データ3</td>
</tr>
<tr>
<th>見出し4</th>
<td>データ4</td>
</tr>
<tr>
<th>見出し5</th>
<td>データ5</td>
</tr>
<tr>
<th>見出し6</th>
<td>データ6</td>
</tr>
</tbody>
</table>
HTMLはサンプル1と同じです。
css
/* 基本プロパティ */
table {
table-layout: fixed;
border-collapse: collapse;
}
table th,
table td {
padding: 3px 5px;
box-sizing: border-box;
border: 1px solid #ccc;
}
table th {
background: #eee;
}
/* モバイル用 */
@media screen and (max-width: 400px) {
table {
width: 100%;
}
table tr {
display: block;
margin-bottom: 10px;
}
table th,
table td {
display: block;
width: 100%;
text-align: center;
}
table th {
border-bottom: none;
}
}
PCとモバイルで共通で使用する「基本プロパティ」と横幅400px以内で使用する「モバイル用」に分かれています。ほぼサンプル1と同じですが、行を分離するために「table tr」の記述が増えています。
解説1
table tr {
display: block;
margin-bottom: 10px;
}
tableの「tr」(行)に対して「display: block;」、「margin-bottom: 10px;」を指定することによって、行を分離させています。
解説2
table th,
table td {
display: block;
width: 100%;
text-align: center;
}
「th」と「td」に対して「display: block;」、「width: 100%;」とすることで縦に表示しています。
解説3
table th {
border-bottom: none;
}
「th」を縦に表示するので「td」と重なるボーダー、「bottom」を消しています。サンプル1と違い、「th」は「td」と分離するので「border-top: none;」は必要ありません。
全ソース
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>
CSSでレスポンシブなテーブルを表示(分離して縦に表示)
</title>
<style type="text/css">
/* 基本プロパティ */
table {
table-layout: fixed;
border-collapse: collapse;
}
table th {
background: #eee;
}
table th,
table td {
padding: 3px 5px;
box-sizing: border-box;
border: 1px solid #ccc;
}
/* モバイル用 */
@media screen and (max-width: 400px) {
table {
width: 100%;
}
table tr {
display: block;
margin-bottom: 10px;
}
table th,
table td {
display: block;
width: 100%;
text-align: center;
}
table th {
border-bottom: none;
}
}
</style>
</head>
<body>
<h1>
横幅が400px以内の時に行ごとに分離して縦に並べる
</h1>
<table>
<tbody>
<tr>
<th>見出し1</th>
<td>データ1</td>
</tr>
<tr>
<th>見出し2</th>
<td>データ2</td>
</tr>
<tr>
<th>見出し3</th>
<td>データ3</td>
</tr>
<tr>
<th>見出し4</th>
<td>データ4</td>
</tr>
<tr>
<th>見出し5</th>
<td>データ5</td>
</tr>
<tr>
<th>見出し6</th>
<td>データ6</td>
</tr>
</tbody>
</table>
</body>
</html>
まとめ
- 縦に表示する場合、「th」と「td」に「display: block;」、「width: 100%;」を指定する。
- 行(tr)ごとに分離して表示する場合、「tr」に「display: block;」、「margin-bottom」を指定する。
。モバイルで横幅が狭い場合、縦に表示すると少しだけテーブルが見やすくなります。
今回ご紹介したシンプルなテーブルであれば、CSSだけでもモバイルで表示を変えることが可能なのでおすすめです。
コメント