レスポンシブWebデザインでテーブルを使う時の小技

レスポンシブWebデザインでテーブルを使う時の小技

レスポンシブWebデザインで狭いスクリーンサイズの時にテーブルをどう見せるかは悩ましい問題のひとつです。その対応方法を幾つか調べてみました。

displayプロパティの値を変更する 1

displayプロパティを使う

tableやtr、tdなどのテーブル関連のタグのdsiplayプロパティを変更することでデザインを変更します。
tableタグのdisplayの値はデフォルトではtable、tdやthタグはtable-cellといった具合ですが、この値をblockやlist-itemなど他の値に変えます。

	@media only screen and (max-width:420px){
		tbody tr{
			display: block;
			margin-bottom: 1.5em;
		}
		tbody th,
		tbody td{
			display: list-item;
			border: none;
		}
		.....
	}
	

Chrome、Safari、Firefox対応。
IEではTableのdisplayを変更しても表示は変わらないようなので非対応です。
条件分岐コメントを使ってIEにはメディアクエリを読ませないようにしておきます。

<!--[if !IE]><!-->
<style>
@media only screen and (max-width:800px){
...
</style>
<!--<![endif]-->
	

参考サイト:Responsive Data Tables | CSS-Tricks

displayプロパティの値を変更する 2

displayプロパティを使う

上記とは逆のアプローチです。
dlで作成した定義リストをdisplayプロパティ値をテーブル関連の値にすることで、テーブルの表示にします。

	@media only screen and (min-width:421px){
		#demo #words{
			display: table-row-group;
		}
		#demo dl{
			display: table-row;
			margin: 0;
		}
			#demo dl dt,
			#demo dl dd{
				display: table-cell;
				padding: 5px;
				border-left: 1px solid #ccc;
				border-top: 1px solid #ccc;
			}
		.....
	}
	

Chrome、Safari、Firefox、IE9対応。
IE8以下はdisplay:table-cell等をサポートしてないので、定義リストのまま表示されることになります。

inline-blockとoverflow-xを使う

inline-bock

セルの部分を横スクロールで見ることができます。

方法はまずtheadをfloat:leftで左に持ってきます。
tbodyにoverflow-x:auto、white-space:nowrapを指定して、中のコンテンツであるtrをdisplay:inline-blockにします。
こうすることでウインドウサイズ以上にコンテンツを横に並べ、はみ出した分スクロールバーが表示されます。
Chrome、Safari、Firefox対応。

	@media only screen and (max-width: 420px) {
		table thead{
			display: block;
			float: left;
		}
		table tbody{
			display: block;
			width: auto;
			position: relative;
			overflow-x: auto;
			white-space: nowrap;
		}
		table tbody tr{
			display: inline-block;
			vertical-align: top;
		}
		.....
	}
	

参考サイト:Responsive Tables (2) – David Bushell

display:boxを使う

box

上記と考え方は同じですが、
display:-webkit-boxを使うともっと少ないコードで簡潔に書くことができます。
※この方法ではFirefoxで崩れてしまうのでdisplay:-moz-boxは書いてません
Chrome、Safariのみ対応。

	@media only screen and (max-width: 420px) {
		table tbody{
			display: -webkit-box;
			overflow-x: auto;
		}
		table tr,
		table th,
		table td{
			display: block;
		}
		.....
	}
	

参考サイト:Responsive Tables (2) – David Bushell

タップでテーブルのみを表示する

touch

小さいウインドウサイズではセル内のデータを非表示にして、タッチボタンを表示します。
ボタンをクリックするとjQueryを使ってhtmlにclassを追加します。
この追加したclassを利用し、テーブル以外のタグを非表示とすることで、
擬似的にテーブルのみを別画面で表示させたようになります。
Chrome、Safari、Firefox対応。

	$(function(){
	  $("table").click(function(){
		$("html").toggleClass( $(this).attr("class") );
	  });
	});
	

	@media screen and (max-width: 420px){
		/*タップ前の表示*/
		html:not(.sales) table:before {
			content: "Table: タップして表を見る";
			display: block;
			position: absolute;
			width: 100%;
			height: 100%;
			background: rgba(0,0,0,.6);
			color: #fff;
			font-weight: bold;
			font-size: 1.5em;
			text-align: center;
			vertical-align: middle;
			z-index: 100;
		}
		/*タップ後の表示*/
		html.sales table{
			width: 600px;
		}
		html.sales table:before {
			display: block;
			background: #333;
			padding: 10px;
		}
		/* tableコンテンツ以外は非表示 */
		html.sales p, html.sales h1 {
			display: none;
		}
		.....
	}
	

jQueryでタグを書き換える

jQuery

jQueryを使ってtableのタグを<div class="XXXX">に置き換えます。
大きいスクリーンサイズではdisplay:table-cellなどテーブル関連のスタイルを使い見た目をテーブルのデザインにします。

Chrome、Safari、Firefox、IE9対応。

		// thead内のtdの数をかぞえる
	var head_col_count =  $('thead td').size();
	// 上でカウントしたtdの数だけ処理を繰り返す
	for ( i=0; i <= head_col_count; i++ )  {
		// ヘッダーのテキストを抽出
		var head_col_label = $('thead td:nth-child('+ i +')').text();
		// tdを <div class="column" data-label="label"> に置き換える
		$('tr td:nth-child('+ i +')').replaceWith(
			function(){
				return $('<div class="column" data-label="'+ head_col_label +'">').append($(this).contents());
			}
		);
	}	
	// tableを <div class="table"> に置き換える
	$('table').replaceWith(
		function(){
			return $('<div class="table">').append($(this).contents());
		}
	);	
	// thead を <div class="table-head"> に置き換える
	$('thead').replaceWith(
		function(){
			return $('<div class="table-head">').append($(this).contents());
		}
	);	
	// tr を <div class="row"> に置き換える
	$('tr').replaceWith(
		function(){
			return $('<div class="row">').append($(this).contents());
		}
	);	
	// th を <div class="column"> に置き換える
	$('th').replaceWith(
		function(){
			return $('<div class="column">').append($(this).contents());
		}
	);
	

参考サイト:Responsive Data Tables with jQuery – Mobifreaks

MediaTableを使う

media-table.js

jQueryのプラグインMediaTableを使います。
テーブルの上にコントローラーが表示され、チェックをつけたり外したりすることでセルの表示非表示を切り替えが出来ます。

使い方はthepeg/MediaTable · GitHubよりファイル一式をダウンロードします。
適切な場所にファイルを保存してjquery.mediaTable.cssとjquery.mediaTable.jsを読み込みます。
メディアクエリに対応していないと大きいウインドウサイズの時に全部の情報が表示されないのでIE8以下にはrespond.jsを読み込みます。
jQueryもCDNから読み込みます。

<link rel="stylesheet" href="jquery.mediaTable.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

media-tableを適応させたいテーブルにmediaTableを実行させます。

$(function(){
	$('.mediaTable').mediaTable();
});

tdのclassでpersistを指定すると常に表示され、非表示にはできません。
essentialを指定すると常に表示され、表示非表示選択ができます。
optionalは768px以下で非表示、何も指定しないと1024px以下で非表示となり、いずれも表示非表示が選択できます。
Chrome、Safari、Firefox、IE7以上対応です。

参考サイト:A Responsive Design Approach for Complex, Multicolumn Data Tables

Responsive Tablesを使う

responsive-table

jQueryのプラグインresponsive-table.jsを使います。
動作は「inline-blockとoverflow-xで対応」に近いです。

Responsive Tables with CSS/JSよりファイルをダウンロードして、JavaScriptとCSSを読み込むだけなので設置は簡単です。

IE8以下にこのJavaScriptを読みこませると表示が崩れるので条件分岐コメント使ってIE8以下には適用させないようにしました。
Chrome、Safari、Firefox、IE9対応。

<link rel="stylesheet" href="responsive-tables.css">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<!--[if !lt IE 9]><!-->
<script src="js/responsive-tables.js"></script>
<!--<![endif]-->

終わりに

上記すべての方法はWebKitでは対応してますがIE9では一部の方法でしか対応できません。
今のところはWindowsPhoneの数が少ないとは言え今後を考えると完全に無視はできないところです。
IE…。

またResponsive Data Table Roundup | CSS-Tricksではその他に、Canvasを使った方法や、セルを項目によって色分けする方法なども紹介されてます。

あらゆるケースに対応できるベストと言える方法はまだありませんが、
こういった手法を取り入れて対応できるところは積極的に活用して、それ以外のケースは工夫を重ねていこうと思います。

B!

Comment

コメント(6)

2013年5月28日@ 11:51 AM

とのさま

こんにちは。いつも有益な情報の発信、ありがとうございます。

些末なご指摘で恐縮なのですが、
「displayプロパティの値を変更する 1」の、
本文1行目「tableやtr、tdなどのテーブル関連のタグのdsiplayプロパティを変更」が、
“display”プロパティの誤植かと思います。

2013年5月28日@ 8:35 PM

hiro

>とのさま
ご指摘ありがとうございます!
修正しておきました。

2014年8月12日@ 7:01 PM

キムチ

こんばんは。
レスポンシブWEBデザインで、テーブルの処理の参考にさせていただいており、大変ありがたく思っています。
これは出来るかわからないのですが、「displayプロパティの値を変更する 1」の“[品詞]形容詞”のところで、“形容詞”のところを開業することは可能でしょうか?
難しい印象がありますが、どうぞよろしくお願いします。

2014年8月12日@ 9:18 PM

hiro

>キムチさん
記事を読んでいただきありがとうございます。

見た目上であれば、after 擬似要素にdisplay:blockを指定することで改行してるようにできると思います。
#table tbody td:nth-of-type(1):before { content: “[品詞]”; display:block; }
こちらで試してみてください。

2015年2月13日@ 6:57 PM

MICK

こんにちは。いつも参考にさせていただいております。
ひとつ解決できない問題がありまして、よろしければ
ご指導いただきたいと思いまして・・・。
[inline-blockとoverflow-xを使う]について、
内の文字列(DEMO内の「yes」や「no」)を
改行してしまうと、theadが左に来た際に、ズレが
生じてしまいます。これを解決する方法はありませんでしょうか?
以上、何卒よろしくお願いいたします。

2015年2月13日@ 9:01 PM

hiro

MICKさん

このケースの対応としては下記のような方法が考えられます。
・br{dispaly:none;}として改行を無くす
・改行されることが決定であればnth-child(n)セレクタを使い高さを指定する
・jsで高さを取得して指定する

MICKさんの状況にふさわしい方法かは分かりませんが参考にしていただければと思います。

コメントする

Trackback(21)

2012-10-29~2012-11-2のお気に入り* « WebPocket*

2012年11月7日@ 1:54 PM
[...] レスポンシブWebデザインでテーブルを使う時の小技 [...]

table要素をレスポンシブにしたい! | ウェブサイト制作のコツ!wordpress備忘録と、ホームページ作成

2013年2月2日@ 1:35 AM
[...] レスポンシブWebデザインでテーブルを使う時の小技 [...]

レスポンシブなTable  « スタッフのブログ

2013年3月21日@ 6:56 AM
[...] 更に、レスポンシブなTableの対応方法満載のHPを発見。すごいhttps://design-spice.com/2012/11/01/responsive-table/ [...]
MORE

レスポンシブWebデザインをつくるための便利なjQueryプラグインのまとめ | Web Creator Clip

2013年4月1日@ 3:44 PM
[...] テーブルをレスポンシブ対応にしてくれるプラグイン。日本語のサイトでは、Design Spiceさんが、詳しく使い方をまとめてくださっています。 [...]

テーブルをレスポンシブデザイン対応させるためのjQueryプラグイン | InfinityScope

2013年7月10日@ 10:04 PM
[...] via: レスポンシブWebデザインでテーブルを使う時の小技 | Design-Spice [...]

完璧に分かる!コーディング一連の流れと知識(HTML5+レスポンシブ+WordPress) | コムテブログ

2014年1月27日@ 8:38 AM
[...] レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spice [...]

いま一度知っておきたい!レスポンシブなサイトを制作するときに意識したい基本項目7つ

2014年3月12日@ 12:01 PM
[...] レスポンシブWebデザインでテーブルを使う時の小技 https://design-spice.com/2012/11/01/responsive-table/ [...]

【スマホでんとく】対応サービスの追加や、スマホでのデザイン崩れ修正などを行いました | Wizard-G

2014年3月17日@ 9:41 PM
[...] レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spice が参考になりました。 [...]

Table の作り方 | Masayo'

2014年3月29日@ 5:29 AM
[...] https://design-spice.com/2012/11/01/responsive-table/#section01 [...]

すごく役立った!サイト制作でさりげなく使われているCSSテクニックまとめ | コムテブログ

2014年4月21日@ 8:34 AM
[...] レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spice [...]

レスポンシブ対応のテーブル | めもたんスニペット

2014年6月24日@ 8:01 PM
[...] レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spicehttps://design-spice.com/2012/11/01/responsive-table/ [...]

TwitterBootstrapでも採用されている、たぶんもっとも簡単なレスポンシブ対応テーブルの作り方 | htmlコーディングパートナーの小棹制作所

2014年8月8日@ 11:59 AM
[...] っこよくて、ユーザービリティも良好なテーブル組みの方法が掲載されています。 レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spice うん、すばらしい! これでよくね? [...]

レスポンシブ化する時に知っておきたいCSSテクニック | くろひつじのメモ帳

2014年8月29日@ 9:01 AM
[…] 、td部分をスクロールしたり、表組部分を別表示にしたりと色んな方法があります。 以下の記事がとても参考になります。 レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spice […]

これでよくない? レスポンシブテーブルの話 | ダーシマ・ヱンヂニヤリング

2015年4月16日@ 3:52 PM
[…] いくつかの実装パターンは「レスポンシブWebデザインでテーブルを使う時の小技」という人気記事で紹介されています。この記事で紹介されているものの多くは、CSSのdisplayプロパティの […]

納品前に助かった!今Web制作している人必見の品質・納品チェックシート | コムテブログ

2015年8月24日@ 8:34 AM
[…] レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spice […]

何を使えばよいか分かった!コーポレートサイトの各ページを制作する前にみておきたいこと | コムテブログ

2015年9月7日@ 8:32 AM
[…] 、表をモバイル対応にしても縦長になっては意味がないので、レスポンシブWebデザインでテーブルを使う時の小技 │ Design Spiceでご紹介されているoverflow-xを使う方法を参考にテーブルのみ […]

tableをレスポンシブ対応でスマホで見せる小技 | studio-0

2016年1月2日@ 8:50 PM
[…] レスポンシブWebデザインでテーブルを使う時の小技 […]

レスポンシブWebデザインでテーブルを使う時の簡単なCSS |

2016年3月9日@ 11:19 AM
[…] displayプロパティの値を変更する 引用元:https://design-spice.com/2012/11/01/responsive-table/ […]

cssのdisplayでレスポンシブ・スマホ対応のtableを作成する

2017年1月4日@ 12:27 PM
[…] レスポンシブWebデザインでテーブルを使う時の小技レスポンシブWebデザインで狭いスクリーンサイズの時にテーブルをどう見せるかは悩ましい問題のひとつです。その対応方法を幾つか調べてみました。...design-spice.com […]

Facebook | ミニミニ大作戦

2017年6月29日@ 5:27 PM
[…] https://developers.facebook.com/docs/plugins/page-plugin http://www.coprosystem.co.jp/tipsblog/2015/05/19.html […]

Twenty Fourteen の子テーマ作成例【右サイドバー仕様の 2 カラムレイアウト】- CSS、functions.php および java script 編 | 徒然なるペンペン草

2017年8月27日@ 5:55 PM
[…] 参考リンク:【Design Spice】レスポンシブWebデザインでテーブルを使う時の小技 […]