みんな、テーブルってどうしてる?
というわけで、絞り込みや並べ替えなどの機能を備えた多機能なHTMLテーブルを作成できるJavaScriptライブラリのTabulatorの使い方を解説していきます。
私はこれまでDataTablesを使ってきたのですが、DataTablesはjQueryに依存するんですよね。TabulatorはjQueryなしで動作するので乗り換えを決意した次第です。では、いってみよう。
Tabulatorのインストール
ここでは、CDNを使う方法とnpmを使う方法を解説します。他の方法もあるので下記のリンクでご確認くだちゃい(かわいい)。
CDNを使う
CDNを利用する場合はHTMLの<head>
に次の2行を追加します。この場合、常に最新のバージョンのTabulatorが読み込まれます。
<link href="https://unpkg.com/tabulator-tables/dist/css/tabulator.min.css" rel="stylesheet">
<script type="text/javascript" src="https://unpkg.com/tabulator-tables/dist/js/tabulator.min.js"></script>
npmを使う
npmを使用する場合は次のコマンドを実行します。
npm install tabulator-tables
そしてHTMLの<head>
でCSSとJSを読み込みます。
<link href="./node_modules/tabulator-tables/dist/css/tabulator.min.css" rel="stylesheet" />
<script type="text/javascript" src="./node_modules/tabulator-tables/dist/js/tabulator.min.js"></script>
データの読み込み
HTMLテーブルから読み込む
通常のHTMLテーブルを作成します。<table>
に任意の id
を設定しておきます。
<table id="example-table">
<thead>
<tr><th>名前</th><th>おすすめ度</th><th>チェック</th><th>日付</th></tr>
</thead>
<tbody>
<tr><td>さまよえるオランダ人</td><td>5</td><td>true</td><td>2022-07-01</td></tr>
<tr><td>山田ちぬ</td><td>3</td><td>false</td><td>2022-07-01</td></tr>
<tr><td>ユッスー・ンドゥール</td><td>4</td><td>true</td><td>1959-10-01</td></tr>
<tr><td>アッヘンバッハ三姉妹</td><td>2</td><td>true</td><td>2021-01-31</td></tr>
<tr><td>絶対傘ささないマン</td><td>1</td><td>false</td><td>2020-06-29</td></tr>
</tbody>
</table>
次にJavaScriptでインスタンスを生成します。第一引数として <table>
に設定した id
を渡します。第二引数は {}
になっていますが、後でオプションを記述していきます。
let table = new Tabulator('#example-table', {});
どのように表示されるか見てみましょう。テーブルのヘッダをクリックすると行がソートされますね。いえーい。
名前 | おすすめ度 | チェック | 日付 |
---|---|---|---|
さまよえるオランダ人 | 5 | true | 2022-07-01 |
山田ちぬ | 3 | false | 2022-07-01 |
ユッスー・ンドゥール | 4 | true | 1959-10-01 |
アッヘンバッハ三姉妹 | 2 | true | 2021-01-31 |
絶対傘ささないマン | 1 | false | 2020-06-29 |
配列、JSONから読み込む
まずHTML。テーブルを表示したい場所に、任意のid
を設定した<div>
を配置します。この中にテーブルが描画されます。
<div id="example-table"></div>
javaScript部分は次のようになります。
//データの配列
let tableData = [
{ name: 'さまよえるオランダ人', rating: 5, check: true, date: '2022-07-01' },
{ name: '山田ちぬ', rating: 3, check: false, date: '2022-07-01' },
{ name: 'ユッスー・ンドゥール', rating: 4, check: true, date: '1959-10-01' }
];
//データをJSONで渡す場合
//tableData = JSON.stringify(tableData);
//インスタンス生成
let table = new Tabulator('#example-table', {
data: tableData, //データの読み込み
autoColumns: true, //自動で列の設定を最適化する
});
autoColumuns
オプションを true
に設定すると、自動で列の設定をしてくれます。具体的には、配列のキーをテーブルのカラム名として表示したり、データの値の種類(文字列、数値、ブール値など)に合わせてSorterを設定してくれたりします。
Ajaxを使う
リモートのソースからデータを取得することができます。この場合、データはJSON形式であることが期待されます。
<div id="example-table"></div>
//インスタンス生成
let table = new Tabulator('#example-table', {
ajaxURL: './data.php', //AjaxのURL
autoColumns: true, //自動で列の設定を最適化する
});
リクエストメソッドを変更したり、パラメータを渡すこともできます。なお、リクエストメソッドを指定しない場合の初期値はGETです。
//インスタンス生成
let table = new Tabulator('#example-table', {
ajaxURL: './data.php', //AjaxのURL
ajaxConfig: 'POST', //リクエストメソッドの設定
ajaxParams: { key1: 'value1', key2: 'value2' }, //パラメータの設定
autoColumns: true,
});
設定
テーブル全体の設定
let table = new Tabulator('#example-table', {
height: 400, //テーブルの高さ パーセンテージまたはピクセルを表す整数で指定
maxHeight: '100%', //最大の高さ heightを設定しない場合に有効
minHeight: 300, //最小の高さ heightを設定しない場合に有効
rowHeight: 40, //行の高さ ピクセルを表す整数で指定
resizableColumnFit: true, //ひとつの列の幅を変更したときに列全体の幅を維持する
layout: 'fitData', //列のレイアウト (firData|fitDataFill|fitDatStretch|fitDataTable|fitColumns)
});
layout
に設定できる値は次のとおりです。
値 | 列の幅 | テーブルの幅が余ったとき |
---|---|---|
fitData | データの長さに合わせて各列の幅が決まる。 | 何もしない。 |
fitDataFill | データの長さに合わせて各列の幅が決まる。 | テーブルの幅いっぱいまで行が描画される。 |
fitDataStretch | データの長さに合わせて各列の幅が決まる。 | 右端の列の幅をテーブルの幅いっぱいまで広げる。 |
fitDataTable | データの長さに合わせて各列の幅が決まる。 | テーブルの幅は列の幅に合わせて小さくなる。 |
fitColumns | テーブルの幅にちょうど収まるように各列の幅が決まる。 | – |
カラムの設定
autoColumuns
オプションを使用せずに、個別にカラムの設定をする場合はcolumns
プロパティを使います。
let table = new Tabulator('#example-table', {
//カラムの設定
columns: [
{
title: '名前', //テーブルの列の表示名
field: 'name', //配列、JSONなどのデータのキー
resizable: true, //列の幅の変更を可能にする (true|false|'header'|'cell')
minWidth: 120, //最小の列の幅
maxWidth: 200, //最大の列の幅
hozAlign : 'left', //水平方向の位置 (left|center|right)
vertAlign : 'top', //垂直方向の位置 (top|middle|bottom)
headerVertical: true, //ヘッダのテキストを縦書きにする
frozen: true, //横スクロールするときに列を固定する
},
{
title: 'おすすめ度',
field: 'rating',
resizable: true,
minWidth: 120,
maxWidth: 200,
headerVertical: true,
frozen: false,
},
...
],
});
並べ替え
何も設定しない場合、Tabulator は最初の行のデータ型に基づいて Sorter を推測します。文字列、数字、英数字、ブール値を判別して Sorter を決定しますが、それ以外は文字列として扱われます。
列ごとに Sorter を指定する場合はsorter
およびsorterParams
オプションを使います。
let table = new Tabulator('#example-table', {
//カラムの設定
columns: [
{
title: '名前',
field: 'name',
sorter: 'string', //Sorterの指定
sorterParams: { locale: true, alignEmptyValues: 'bottom' }, //Sorterのオプション
},
...
],
});
組み込みの Sorter は次のようなものがあります。
Sorter | 説明 | sorterParams |
---|---|---|
string | 文字列を並べ替える | locale: 文字列比較関数が使用するロケールコードを指定。 'ja' ならば日本語、true ならばテーブルのロケール、指定しなければブラウザのロケールが使用されます。alignEmptyValues: データが空の場合に上位に表示するか下位に表示するかの設定。( top |bottom ) |
number | 数値を並べ替える | thousandSeparator: 千単位の区切り文字を指定。 decimalSeparator: 小数点の文字を指定。 alignEmptyValues: |
alphanum | 英数字を並べ替える | alignEmptyValues: |
boolean | ブール値を並べ替える | – |
exists | データが undefined かどうかで並べ替える | – |
date | 日付を並べ替える | format: 日付のフォーマットをLuxonフォーマットで指定。初期値はdd/MM/yyyy 。'iso' ならばISOフォーマット。alignEmptyValues: |
time | 時刻を並べ替える | format: 時刻のフォーマットをLuxonフォーマットで指定。初期値はHH:mm 。'iso' ならばISOフォーマット。alignEmptyValues: |
datetime | 日時を並べ替える | format: 日時のフォーマットをLuxonフォーマットで指定。初期値はdd/MM/yyyy HH:mm:ss 。'iso' ならばISOフォーマット。alignEmptyValues: |
array | 配列を並べ替える | type: 比較タイプを指定。(length |sum |max |min |avg )alignEmptyValues: |
テーブルヘッダのクリックによる並べ替えを無効化するにはheaderSort
プロパティを使います。
{ title: '名前', field: 'name', sorter: 'string', headerSort: false }
テーブルが最初に描画されるときに適用する並べ替えはinitialSort
で設定します。
let table = new Tabulator('#example-table', {
initialSort: [
{ column: 'name', dir: 'asc' }, //まず名前で昇順に並べ替える
{ column: 'date', dir: 'desc' }, //次に日付で降順に並べ替える
],
});
データのフォーマット
Tabulatorではデータをさまざまな方法でフォーマットして表示することができます。formatter
およびformatterParams
オプションを使います。
let table = new Tabulator('#example-table', {
data: tableData,
layout: 'fitDataFill',
columns: [
{
title: '名前',
field: 'name',
formatter: 'plaintext', //Formatterの指定
},
{
title: 'おすすめ度',
field: 'rating',
formatter: 'star', //Formatterの指定
formatterParams: { stars: 5 }, //Formatterのオプション
},
{
title: 'チェック',
field: 'check',
hozAlign : 'center',
formatter: 'tickCross', //Formatterの指定
},
{
title: '日付',
field: 'date',
formatter: 'datetime', //Formatterの指定
formatterParams: { //Formatterのオプション
inputFormat: 'yyyy-MM-dd',
outputFormat: 'yyyy年MM月dd日',
},
},
],
});
上記の設定でテーブルを表示すると次のようになります。
組み込みの Formatter には次のようなものがあります。
Formatter | 説明 | formatterParams |
---|---|---|
plaintext | テキストを表示。改行(\n )は反映しない。列の幅に合わせて自動改行しない。 | – |
textarea | テキストを表示。改行(\n )を反映する。列の幅に合わせて自動改行する。 | – |
html | HTMLを表示。 | – |
money | 数値に区切り文字や単位を付加して表示。 | decimal: 小数点を表す文字列を指定。初期値は'.' 。thousand: 千単位の区切り文字を指定。 false で区切りなし。初期値は',' 。symbol: 単位を表す記号。 symbolAfter: true で記号を数値の後ろに表示。precision: 小数点以下の桁数。 false ですべて表示。初期値は2 。 |
image | 画像を表示。 | height: 画像の高さ。 width: 画像の幅。 urlPrefix: 画像のsrcのURLを生成する際に値の先頭に追加する文字列。 urlSuffix: 画像のsrcのURLを生成する際に値の末尾に追加する文字列。 |
link | リンクを表示。 | labelField: リンクラベルとして使用される行データのフィールド名。 label: リンクラベルを表す文字列。または文字列を返す関数。 urlPrefix: URLの値の前に追加する文字列。(メールアドレスの前に mailto: を付けるなど)urlField: リンクのURLとして使用される行データのフィールド名。 url: リンクのURLを表す文字列。またはURLを返す関数。 target: <a> タグのtarget の値。('_blank' など)download: true でリンクをダウンロードとして扱う。 |
datetime | 日付や時刻をフォーマットして表示。 | inputFormat: データの日付時刻フォーマット。Luxonフォーマットで指定。または'iso' でISOフォーマット。初期値はyyyy-MM-dd HH:mm:ss 。outputFormat: テーブルに表示する日付時刻フォーマット。Luxonフォーマットで指定。初期値は dd/MM/yyyy HH:mm:ss 。invalidPlaceholder: 入力された日時が無効な場合に表示する値を指定。 true ならばデータの値をそのまま表示。関数を指定すればデータの値を引数として関数に渡す。文字列を指定すればその文字列を表示する。timezone: 日付と時刻のタイムゾーンを有効なLuxonの書式で指定。 |
tickCross | 値が(true |'true' |'True' |1 )ならば、それ以外ならばを表示。 | allowEmpty: true ならば空の値(undefined |null |'' )がではなく空のセルで表示される。allowTruthy: true ならばどんな真の値でもを表示する。tickElement: 印のカスタムHTML。 false ならば表示しない。crossElement: 印のカスタムHTML。 false ならば表示しない。 |
color | セルの背景色を指定した値にする。CSSで有効な色の名前を使える。(#ff0000 , rgb(255,0,0) , red など) | – |
star | 整数値を星の数で表示。 | stars: 表示する星の最大数。初期値は5 。 |
traffic | 数値に応じて色の付いた丸印を表示。 | min: 値の最小値。 max: 値の最大値。 color: 色の名前の配列。初期値は ['red', 'orange', 'green'] 。関数を指定すれば値が引数として渡される。 |
progress | 数値に応じてプログレスバーを表示。 | min: 値の最小値。 max: 値の最大値。 color: プログレスバーの色の設定。一つの色の名前、色の名前の配列、関数のいずれかで指定。初期値は #2DC214 。legend: プログレスバーの上に表示されるテキスト。任意の文字列、 true 、関数のいずれかで指定。true ならばデータの値を表示。legendColor: legendの文字色の設定。一つの色の名前、色の名前の配列、関数のいずれかで指定。 legendAlign: legendのテキストのアラインメント。( center |left |right |justify ) |
lookup | formatterParams に渡されたオブジェクトから値を探して表示。 | formatterParams: { 'blue': '青', 'red': '赤' } 上記のように設定すると、値 blue は 青、値 red は赤と表示される。 |
ページネーション
テーブルをページネーションするには次のように設定します。
let table = new Tabulator('#example-table', {
pagination: true, //ページネーションを有効化
paginationSize: 5, //1ページあたりに表示する行数
//height: '300px', //paginationSizeを指定せずにheightを指定すると高さに合わせて自動的に行数が設定される
paginationInitialPage: 2, //テーブルが最初にロードされるときに表示するページ
paginationSizeSelector: true, //1ページあたりの行数をユーザが設定できるようにする trueならば[5, 10, 15, 20]
//paginationSizeSelector: [10, 25, 50, 100, true], //任意の配列を渡すことも可能 配列にtrueを渡すとAll
paginationCounter: 'rows', //フッタの左にページネーションカウンタを表示する rowsで行数カウンタ、pagesでページカウンタ
});
表示してみるとこんな感じです。
日本語化
ページネーションしたら舶来の言語が出てきました。なんとかしたいですね。というわけで、日本語化しましょう。
let table = new Tabulator('#example-table', {
locale: true, //trueならばブラウザの言語設定を自動検出 'ja'のように指定することも可能
langs: {
ja: {
//列の表示名の翻訳
columns: {
name: '名前',
},
//データ読込関連のテキストの翻訳
data: {
loading: '読込中',
error: 'エラー',
},
//ページネーション関連のテキストの翻訳
pagination: {
page_size: '表示件数',
page_title: 'ページを表示',
first: '最初',
first_title: '最初のページ',
last: '最後',
last_title: '最後のページ',
prev: '前',
prev_title: '前のページ',
next: '次',
next_title: '次のページ',
all: 'すべて',
counter: {
showing: '表示中',
of: '/',
rows: '件',
pages: 'ページ',
},
},
},
},
});
テーマとスタイリング
Tabulatorにはテーブルの外観を変更するためのスタイルシートがあらかじめ用意されています。スタイルを変更するには対応するCSSファイルを読み込むだけです。
Default テーマ
<link href="https://unpkg.com/tabulator-tables/dist/css/tabulator.min.css" rel="stylesheet">
Simple テーマ
<link href="https://unpkg.com/tabulator-tables/dist/css/tabulator_simple.min.css" rel="stylesheet">
Midnight テーマ
<link href="https://unpkg.com/tabulator-tables/dist/css/tabulator_midnight.min.css" rel="stylesheet">
Modern テーマ
<link href="https://unpkg.com/tabulator-tables/dist/css/tabulator_modern.min.css" rel="stylesheet">
Site テーマ
<link href="https://unpkg.com/tabulator-tables/dist/css/tabulator_site.min.css" rel="stylesheet">
他に Bootstrap、Semantic UI、Bulma、Materialize に対応したテーマも用意されています。
また、独自のCSSを記述してスタイルをカスタマイズすることもできます。下記にTabulatorの主要なclass
の一覧があるので参考にしてください。
さいごに
今回紹介したのはTabulatorの機能のほんの一部です。他にもたくさんの機能、オプションがあるので公式サイトで確認してみてください。英語だけどな。
でわでわ
コメント
コメント一覧 (2件)
[…] ここで教えていただきました。 […]
[…] https://oopsoop.com/tabulator/ […]