先日、tableが使いたくなり、今更ながら、スマホにも対応できるレスポンティブテーブルを調べてみました。
目次
レスポンシブ・スマホ対応のcssのtableのデザイン・作成 | 「横スクロール」ではなく「縦」
スマホで閲覧したとき、そのままにしておくと「はみ出る」という問題に直面します。
デザインは「横スクロール」はui的に格好悪いと思うので、一定の幅になったら「縦」になる方法で作成しています。「横スクロール」は視線が散漫になるというか。。
コピペは学びがないと思うので、一応、段階的に作りかたを解説してみます。
ステップ1:テーブルの作成
まず、ただのテーブルを作成します。
見出しセル | 見出しセル |
---|---|
データセル | データセル |
htmlです。
<table> <tr> <th>見出しセル</th> <th>見出しセル</th> </tr> <tr> <td>データセル</td> <td>データセル</td> </tr> </table>
cssです。
table { border-top: 1px solid #999; border-right: 1px solid #999; border-collapse: collapse; } table th, table td { border-left: 1px solid #999; border-bottom: 1px solid #999; padding: 10px; } table th { background-color: #eee; text-align: left; }
ここまでは解説はいらない気がしますが、右上は1箇所だけ線をひいて、あとは各々の左下に線をひいていきます。
border-collapse: collapse;はあまりにテーブルを使わないので忘れていました。。隣接する境界線を結合して表示します。特に塗りを指定する場合、塗りと線がぴったりとあいます。
ステップ2:display: block;で縦並び、data-labelの擬似要素で置き換え
見出しセル1 | 見出しセル2 |
---|---|
データセル1 | データセル2 |
htmlです。
<table> <thead> <tr> <th>見出しセル1</th> <th>見出しセル2</th> </tr> </thead> <tbody> <tr> <td data-label="見出しセル1">データセル1</td> <td data-label="見出しセル2">データセル2</td> </tr> </tbody> </table>
theadとtbodyをセットで追加しました。data-labelも追加しました。cssでtheadを消去して、代わりにdata-labelでテキストを表示します。
cssです。
/* レスポンティブ対応のテーブル */ table { border-top: 1px solid #999; border-right: 1px solid #999; border-collapse: collapse; width: 100%; } table th, table td { border-left: 1px solid #999; border-bottom: 1px solid #999; padding: 10px; } table th { background-color: #644D37; color: #fff; text-align: left; } @media screen and (max-width: 480px) { table thead { display: none; } table td { display: block; text-align: right; } table td::before { content: attr(data-label); float: left; font-weight: bold; } }
ひとつひとつわけて解説します。
display: block;
で縦に並べます。
見出しを消すため、theadとtbodyをhtmlに追加したので、
table thead { display: none; }
で見出しを消します。その代わりにcontent: attr(data-label);を追加して1つのセルに擬似要素で表示させます。
わかりやすくするため、width: 100%;で幅を広げて、片方は右にtext-align: right;、片方は左にfloat: left;して完了です。細かいとところやサイズはお好みでお願いします。
ステップ3:横に項目名をつける
このままだと縦横のテーブルではありません。項目Aを追加します。
見出しセル1 | 見出しセル2 | |
---|---|---|
項目A | データセル1 | データセル2 |
<table> <thead> <tr> <th></th> <th>見出しセル1</th> <th>見出しセル2</th> </tr> </thead> <tbody> <tr> <td>項目A</td> <td data-label="見出しセル1">データセル1</td> <td data-label="見出しセル2">データセル2</td> </tr> </tbody> </table>
項目Aにはdata-labelをつけません。項目の量はいくつになるかわかりませんから、ひっくり返して縦長に設定するわけですね。
td:first-child { background: #f2f2f2; font-weight: bold; }
項目Aに色をつけるコードです。擬似クラスの:first-childは最初の子要素にスタイルを適用するコードです。
@media screen and (max-width: 480px) { table td:first-child { background: #644D37; color: #fff; font-weight: bold; text-align: center; } }
項目Aが縦になったとき、色をつけるコードです。
横の見出しは塗り分ける場合はどうしましょう。擬似要素を使っているため、1つのセルになっています。
背景色を2色で分割する方法としてlinear-gradientがあります。
@media screen and (max-width: 480px) { table td { display: block; text-align: right; background:linear-gradient(90deg,#f2f2f2 0%,#f2f2f2 35%,#fff 35%,#fff 100%); } }
セルが別れているわけではないため、文字が長い場合、色に浸透してしまいます。
ちょっと強引な気もしましたので、もっとよい方法があれば知りたいですね。
テーブルで列幅を均等に固定にする
おまけです。通常、均等ではありません。
.table {
table-layout: fixed;
}
コメント