テーブルの横スクロール(スクロールヒントつき)の実装方法【スマホに最適】
本記事では横スクロールできるテーブルの実装方法を解説します。
ただ単に横スクロールできるだけではなく、下のデモのように「横にスクロールできます」と伝えるヒントウィンドウもアニメーション付きで表示されるため、利便性が高いです。
商品ID | 商品名 | 価格 | 在庫数 | カテゴリ |
---|---|---|---|---|
1 | 商品A | ¥1,000 | 10 | 家電 |
2 | 商品B | ¥2,000 | 5 | 家具 |
3 | 商品C | ¥500 | 20 | 文具 |
コードはコピペOKなので、ご活用ください。
横スクロールできるテーブルの実装方法
本記事で紹介する横スクロールテーブルの仕様は下記の通りになります。
- テーブルが横スクロールが可能な場合に、スクロールヒントが表示される
- スクロールを少しでもするとヒントは消える
- ページ内に複数のテーブルが存在してもOK
以下でHTML、CSS、JavaScriptのコードを紹介します。
HTML
テーブルを囲うコンテナをdiv
で記述します。テーブルの横幅がこのコンテナよりも大きくなる場合(つまりテーブル幅がコンテンツ幅よりも大きくなり、横スクロールが有効になる場合)にスクロールヒントが表示されます。
<div class="table-container">
<table class="table">
<thead class="table__head">
<tr class="table__row">
<th class="table__header">商品ID</th>
<th class="table__header">商品名</th>
<th class="table__header">価格</th>
<th class="table__header">在庫数</th>
<th class="table__header">カテゴリ</th>
</tr>
</thead>
<tbody class="table__body">
<tr class="table__row">
<td class="table__cell">1</td>
<td class="table__cell">商品A</td>
<td class="table__cell">¥1,000</td>
<td class="table__cell">10</td>
<td class="table__cell">家電</td>
</tr>
<tr class="table__row">
<td class="table__cell">2</td>
<td class="table__cell">商品B</td>
<td class="table__cell">¥2,000</td>
<td class="table__cell">5</td>
<td class="table__cell">家具</td>
</tr>
<tr class="table__row">
<td class="table__cell">3</td>
<td class="table__cell">商品C</td>
<td class="table__cell">¥500</td>
<td class="table__cell">20</td>
<td class="table__cell">文具</td>
</tr>
</tbody>
</table>
</div>
CSS
スクロールヒントの非表示・非表示をコントロールするCSSを書いておき、後述のJavaScriptでクラスの付け外しをすることで挙動を実装します。
スクロールヒントのアニメーションもCSS(keyframes
)で指定しています。
.table-container {
position: relative;
overflow-x: auto;
white-space: nowrap;
}
.table {
border-collapse: collapse;
}
.table__header {
color: #fff; /* 文字色は任意のものに変更してください */
font-weight: 700;
background: #095DAD; /* 背景色は任意のものに変更してください */
}
.scroll-hint {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
padding: 10px;
background: rgba(0, 0, 0, 0.5);
color: #fff;
font-weight: 700;
line-height: 1.4;
display: none;
animation: scroll-hint-animation 2s infinite ease;
}
@keyframes scroll-hint-animation {
0% {
transform: translate(-50%, -50%);
}
50% {
transform: translate(-40%, -50%);
}
100% {
transform: translate(-50%, -50%);
}
}
.scroll-hint--show {
display: block;
}
JavaScript
HTML要素の幅を表すscrollWidth
と、要素の内部の幅を表すclientWidth
を比較することで、「テーブルを囲うコンテナよりも、(その内部要素である)テーブルの幅の方が大きいかどうか」という条件分岐を設定しています。
その条件が真である場合に、スクロールヒントを表示するためのクラス(scroll-hint--show
)を付与し、偽の場合にそのクラスを外しています。
また、実際にユーザーがスクロールしたらヒントは不要ですので、テーブルのコンテナのscroll
イベントを監視しヒントを非表示にできるようにしています。
document.addEventListener('DOMContentLoaded', () => {
const tableContainers = document.querySelectorAll('.table-container');
for (const tableContainer of tableContainers) {
const scrollHint = document.createElement('div');
scrollHint.className = 'scroll-hint scroll-hint--show';
scrollHint.innerText = '横にスクロールできます';
tableContainer.appendChild(scrollHint);
const showScrollHint = () => {
if (tableContainer.scrollWidth > tableContainer.clientWidth) {
scrollHint.classList.add('scroll-hint--show');
} else {
scrollHint.classList.remove('scroll-hint--show');
}
};
showScrollHint();
tableContainer.addEventListener('scroll', () => {
scrollHint.classList.remove('scroll-hint--show');
});
}
});
完成形
記事の冒頭でも示しましたが、テーブルの完成形を改めて掲載します。
商品ID | 商品名 | 価格 | 在庫数 | カテゴリ |
---|---|---|---|---|
1 | 商品A | ¥1,000 | 10 | 家電 |
2 | 商品B | ¥2,000 | 5 | 家具 |
3 | 商品C | ¥500 | 20 | 文具 |
特に画面幅が狭いスマホでは重要なUIになるので、ぜひご活用ください。