(ちょっとメモ)テーブルをレスポンシブ対応させるCSS|サンプル
表示領域の幅が狭くなると、テーブルが 1カラムになるよう CSSで指定しています。
PCのかたは、ウィンドウ幅を小さくしてみてください。
エリア | 店舗名 | 来店総数 | 新規来店 | リピート |
---|---|---|---|---|
合計 | 1150 | 780 | 370 | |
A | 渋谷店 | 100 | 80 | 20 |
神宮前店 | 150 | 100 | 50 | |
青山店 | 200 | 120 | 80 | |
B | 三軒茶屋店 | 100 | 80 | 20 |
二子玉川店 | 150 | 100 | 50 | |
C | 銀座店 | 200 | 120 | 80 |
日本橋店 | 100 | 80 | 20 | |
京橋店 | 150 | 100 | 50 |
サンプルのHTML
<table class="sample1">
<thead>
<tr>
<th>エリア</th>
<th>店舗名</th>
<th>来店総数</th>
<th>新規来店</th>
<th>リピート</th>
</tr>
</thead>
<tfoot>
<tr>
<th colspan="2">合計</th>
<td aria-label="来店総数">1150</td>
<td aria-label="新規来店">780</td>
<td aria-label="リピート">370</td>
</tr>
</tfoot>
<tbody class="areaA">
<tr>
<th rowspan="3">A</th>
<td aria-label="店舗名 ">渋谷店</td>
<td aria-label="来店総数">100</td>
<td aria-label="新規来店">80</td>
<td aria-label="リピート">20</td>
</tr>
<tr>
<td aria-label="店舗名 ">神宮前店</td>
<td aria-label="来店総数">150</td>
<td aria-label="新規来店">100</td>
<td aria-label="リピート">50</td>
</tr>
<tr>
<td aria-label="店舗名 ">青山店</td>
<td aria-label="来店総数">200</td>
<td aria-label="新規来店">120</td>
<td aria-label="リピート">80</td>
</tr>
</tbody>
<tbody class="areaB">
<tr>
<th rowspan="2">B</th>
<td aria-label="店舗名 ">三軒茶屋店</td>
<td aria-label="来店総数">100</td>
<td aria-label="新規来店">80</td>
<td aria-label="リピート">20</td>
</tr>
<tr>
<td aria-label="店舗名 ">二子玉川店</td>
<td aria-label="来店総数">150</td>
<td aria-label="新規来店">100</td>
<td aria-label="リピート">50</td>
</tr>
</tbody>
<tbody class="areaC">
<tr>
<th rowspan="3">C</th>
<td aria-label="店舗名 ">銀座店</td>
<td aria-label="来店総数">200</td>
<td aria-label="新規来店">120</td>
<td aria-label="リピート">80</td>
</tr>
<tr>
<td aria-label="店舗名 ">日本橋店</td>
<td aria-label="来店総数">100</td>
<td aria-label="新規来店">80</td>
<td aria-label="リピート">20</td>
</tr>
<tr>
<td aria-label="店舗名 ">京橋店</td>
<td aria-label="来店総数">150</td>
<td aria-label="新規来店">100</td>
<td aria-label="リピート">50</td>
</tr>
</tbody>
</table>
サンプルのCSS
table.sample1 {
width: 100%;
margin:1em 0 4em;
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
border-spacing:0px;
}
table.sample1 tr th,table.sample1 tr td {
text-align: center;
font-size: 12px;
border-bottom: 1px solid #ccc;
border-right: 1px solid #ccc;
padding: 3px;
}
table.sample1 thead tr {
background: #c7ebc9;
}
table.sample1 tfoot tr {
background: #86bd7e;
color:#fff;
}
table.sample1 tbody.areaA tr {
background: #ffc;
}
table.sample1 tbody.areaB tr {
background: #e1f7fa;
}
table.sample1 tbody.areaC tr {
background: #ffe9da;
}
@media screen and (max-width: 600px) { /*ここからメディアクエリ*/
table.sample1 {
border:none
}
table.sample1 thead {
display: none; /*theadは非表示に*/
}
table.sample1 tr {
display: block; /*trをブロックレベルに*/
margin-bottom:.5em;
border-bottom:1px solid #ccc;
box-shadow:0 2px 2px #ddd;
}
table.sample1 tr td {
display:block; /*tdをブロックレベルに(セルをやめる)*/
border-top: 1px solid #ccc;
border-left: 1px solid #ccc;
border-right: 1px solid #ccc;
border-bottom:none;
}
table.sample1 tr td::before { /*tdに擬似要素 ::before*/
content: attr(aria-label); /*aria-label属性の値をコンテンツに*/
float: left; /*テキストを左寄せにする*/
font-weight:bold;
padding-left:.7em
}
table.sample1 tr td::after { /*クリアフィックス(コレは不要かもしれません)*/
content:"";
display:table;
clear:both;
}
table.sample1 tbody th {
display:block; /*tbody内の thをブロックレベルに(セルをやめる)*/
border:none;
background:#666;
color:white
}
table.sample1 tbody th::before {
content:"エリア" /*tbody内の thの前に エリア と追加*/
}
table.sample1 tbody.areaA th {
color: #ffc
}
table.sample1 tbody.areaB th {
color: #e1f7fa
}
table.sample1 tbody.areaC th {
color: #ffe9da
}
table.sample1 tfoot th {
display:block;
border:none;
}
table.sample1 tfoot td {
border-top-color:white
}
}
CSS 58行目で、クリアフィックスの指定をしています。
疑似要素 ::before で作ったコンテンツに float を使ったので、一応クリアをしていますが、このサンプルの場合、<td>内に十分スペースがありますので、float で 親要素の崩壊や、他の要素への影響は無いため、このクリアフィックスは不要かもしれません。
上のソースの場合でも、float させるコンテンツに「display: block」と「width」を指定した場合は クリアフィックスは必要です。