CSSで出来るレスポンシブ対応を考えた table レイアウト
▼2021年最新版
【コピペOK】制作会社が実際に使っている、レスポンシブ対応のtableレイアウト
スマホ対応・レスポンシブが当たり前になってきてるこの時代、コーダーさんにとって table がなかなかやっかいものになってきてますね…
会社概要くらいならまだ良いんですが、情報量が多い table はそのままでは 320px で閲覧した際、なかなか悲惨な事に…
対応方法としては『responsive-table.js』を代表に、様々なやり方がありますが、今回はCSSで出来る事を紹介したいと思います。
目次
2セルの場合の使用した例
2セルでよく作られてる、会社概要やフォームなどで使えるかと思います。
『th』や『td』内に使用してる padding 分をネガティブマージンで相殺もしています。
HTML
<table class="demo01"> <tr> <th>CSS</th> <td>Cascading Style Sheets(CSS、カスケーディング・スタイル・シート、カスケード・スタイル・シート)とは、…省略</td> </tr> <tr> <th>レスポンシブデザイン</th> <td>表示された機器の種類やサイズに応じて…省略</td> </tr> </table>
CSS
section table { width: 100%; }
section th, section td { padding: 10px; border: 1px solid #ddd; }
section th { background: #f4f4f4; }
/*----------------------------------------------------
.demo01
----------------------------------------------------*/
.demo01 th { width: 30%; text-align: left; }
@media only screen and (max-width:480px){
.demo01 { margin: 0 -10px; }
.demo01 th,
.demo01 td{
width: 100%;
display: block;
border-top: none;
}
.demo01 tr:first-child th { border-top: 1px solid #ddd; }
}
横に長い場合 overflow-x と inline-block を使用した例

th 要素が横に長いケースの場合に使える手法です。
横に寄せたり、縦並びにしたりなど、少し指定が複雑ですが、table 表記が多いサイトに使用出来ます。
HTML
<table class="demo02"> <thead> <tr> <th> </th> <th>CSS</th> <th>HTML</th> <th>jQuery</th> <th>PHP</th> <th>Illustrator</th> <th>Photoshop</th> <th>Fireworks</th> </tr> </thead> <tbody> <tr> <td>ユニオン太郎</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> </tr> <tr> ・ ・ ・ </tbody> </table>
CSS
section table { width: 100%; }
section th, section td { padding: 10px; border: 1px solid #ddd; }
section th { background: #f4f4f4; }
/*----------------------------------------------------
.demo02
----------------------------------------------------*/
.demo02 th { width: 13%; }
.demo02 td { text-align: center; }
.demo02 td:first-child { text-align: left; }
@media only screen and (max-width: 800px) {
.demo02 {
display: block;
width: 100%;
margin: 0 -10px;
}
.demo02 thead{
display: block;
float: left;
overflow-x:scroll;
}
.demo02 tbody{
display: block;
width: auto;
overflow-x: auto;
white-space: nowrap;
}
.demo02 th{
display: block;
width:auto;
}
.demo02 tbody tr{
display: inline-block;
margin: 0 -3px;
}
.demo02 td{
display: block;
}
}
リスト風にした場合 list-item を使用した例

td の項目がリスト要素としても並べれそうな場合は、こちらが一番スマートな方法かと思います。
HTML
<table class="demo03"> <tr> <th>Webブラウザ</th> <td>Google Chrome</td> <td>Safari</td> <td>Mozilla Firefox</td> <td>Internet Explorer</td> </tr> <tr> <th>アドビ製品</th> <td>Illustrator</td> <td>Photoshop</td> <td>Lightroom</td> <td>Dreamweaver</td> </tr> </table>
CSS
section table { width: 100%; }
section th, section td { padding: 10px; border: 1px solid #ddd; }
section th { background: #f4f4f4; }
.demo03 th, .demo03 td { width: 20%; text-align: left; }
@media only screen and (max-width: 480px) {
.demo03 { margin: 0 -10px; }
.demo03 tr {
display:block;
margin-bottom: 10px;
}
.demo03 th {
display:block;
width: 100%;
}
.demo03 td {
display: list-item;
width: 90%;
margin-left: 10%;
border:none;
}
}
まとめ
今回の方法は、IE9未満では一部の方法でしか対応できないです…
もしレスポンシブじゃなく、スマホのみでいいなら display:box も使用出来るので、もう少しスマートな記述で済んだりする箇所もございます。
▼2021年最新版
【コピペOK】制作会社が実際に使っている、レスポンシブ対応のtableレイアウト


