tableタグで表を作った時、スマホなど幅が狭い時には横スクロールさせないとこのようにギュッと幅を圧縮されたようになってしまいます。
これを横スクロール出来るようにすればスマホでも自然な感じで見られるようになるので、今回はtableタグで横スクロール出来るテーブルの作り方について解説していきます。
(有料になっていたらすいません🙇♂️)
tableタグで横スクロール出来るテーブルの作り方
横スクロール出来るテーブルの作り方ですが、全体のコードを見る前にポイントを見てみます。
- tableタグの親要素に
overflow: hidden
とwhite-space: nowrap;
- tableタグは親要素より幅を広くする
それでは一旦HTMLを見てみます。
<div class="container">
<table>
<tr>
<th>表のタイトル</th>
<th>表のタイトル</th>
<th>表のタイトル</th>
<th>表のタイトル</th>
</tr>
<tr>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
</tr>
<tr>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
</tr>
<tr>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
<td>サンプルテキスト</td>
</tr>
</table>
</div>
CSSはこちらです。
.container {
margin-inline: auto;
margin-top: 100px;
overflow-x: auto; /* tableタグのはみ出た要素を隠す */
white-space: nowrap; /* テキストの折り返しなし */
width: 300px;
}
table {
width: 500px; /* tableタグの親要素より広く */
}
th {
border: 1px solid #ccc;
color: #333;
font-size: 16px;
padding: 20px;
width: 25%;
}
td {
border: 1px solid #ccc;
font-size: 16px;
padding: 20px;
}
CSSの重要なポイントにはコメントしましたが、tableタグを親要素より広くして、はみ出た部分をoverflow-x: auto;
で隠しています。
あとはwhite-space: nowrap;
でテキストの折り返しをなくすことで、横方向に押し潰されるような事がなくなります。
上記のように横スクロールされるようにした場合と、overflow-x: auto;
とwhite-space: nowrap;
を書かなかった場合を並べてみました(tableタグの親要素に背景色を付けています)
See the Pen
tableタグで横スクロール(ブログ用) by junpei (@junpei-sugiyama)
on CodePen.
上の方は横方向に潰れず、横スクロール出来るのが確認できます。
こちらが背景色を消したものです。
See the Pen
tableタグで横スクロール by junpei (@junpei-sugiyama)
on CodePen.
jQueryを使って横スクロールをドラッグで動かせるようにする
今回ご紹介した方法で横スクロールはされるようになりましたが、マウスのドラッグでは動かせません。
これをドラッグで動かせるようにするには、以下のコードをjsに書きます(jQueryを使っています)
// スクロールのドラッグ有効化
jQuery.prototype.mousedragscrollable = function () {
let target;
$(this).each(function (i, e) {
$(e).mousedown(function (event) {
event.preventDefault();
target = $(e);
$(e).data({
down: true,
move: false,
x: event.clientX,
y: event.clientY,
scrollleft: $(e).scrollLeft(),
scrolltop: $(e).scrollTop(),
});
return false;
});
$(e).click(function (event) {
if ($(e).data("move")) {
return false;
}
});
});
$(document)
.mousemove(function (event) {
if ($(target).data("down")) {
event.preventDefault();
let move_x = $(target).data("x") - event.clientX;
let move_y = $(target).data("y") - event.clientY;
if (move_x !== 0 || move_y !== 0) {
$(target).data("move", true);
} else {
return;
}
$(target).scrollLeft($(target).data("scrollleft") + move_x);
$(target).scrollTop($(target).data("scrolltop") + move_y);
return false;
}
})
.mouseup(function (event) {
$(target).data("down", false);
return false;
});
};
$(".container").mousedragscrollable();
難しそうなコードですが、変更するのは最後の行の.container
だけです(tableタグの親要素のclass名)
こちらがサンプルになります。
See the Pen
tableタグで横スクロールをドラッグで動かす by junpei (@junpei-sugiyama)
on CodePen.
横スクロールをドラッグで動かす方法は以下の記事で解説しています。
【コピペOK!】jQueryを使って横スクロールをドラッグで動かせるようにする方法
続きを見る
以上になります。