SpreadsheetGrid
ガイド

キーボード / タッチ操作

グリッド本体・編集エディタのキーバインド一覧と、スマホ / タブレットでのタッチ操作

グリッド本体フォーカス中(編集中でない)の操作一覧です。フィルター入力などのフォーム要素にフォーカスしている間は無効です。

グリッド本体

キー操作
矢印(+ Shift で範囲拡張)/ Tab / Shift+Tabアクティブセル移動(最終列の Tab / 先頭列の Shift+Tab はグリッド外の次 / 前の要素へフォーカスを移す)
Enter / F2 / 印字キー直打ち編集開始(印字キーはその 1 文字を初期値に)
Escape選択解除
Ctrl/Cmd+C選択範囲を TSV でコピー(isRowExportable 指定時は false の行を除く。改行入りセルは Excel と同じく "…" で囲む)
Ctrl/Cmd+Vアクティブセル起点で貼り付け(readOnly では no-op。Excel / スプレッドシートのセル内改行や空行を含む範囲もそのまま貼れる)
Ctrl/Cmd+A全体選択(2 回目で解除)
Delete / Backspace選択セルの値クリア(編集不可セルは対象外)
Ctrl/Cmd+Z / Ctrl/Cmd+Shift+Z / Ctrl/Cmd+Yundo / redo

編集エディタ内

キー操作
Enter確定して下のセルへ(移動先は editorEnterMove で変更可)
Tab / Shift+Tab確定して右 / 左のセルへ
Escapeキャンセル
フォーカスアウト確定(select エディタのみキャンセル)

確定 / キャンセルの後、Enter / Tab / Escape ではフォーカスがグリッドへ戻ります(imeDirectInput 有効時は入力受けへ)。フォーカスアウトで確定したときは、移り先がグリッド外の要素(グリッドの上のフォームの入力欄や上部バーのグローバルフィルターなど)ならそこにフォーカスを残し、グリッドへ奪い返しません。編集中にフォームの入力欄をクリックすると、セルの値を確定してそのまま入力欄へ打ち込めます。グリッド内の別のセルをクリックしたときや、フォーカスを取らない余白をクリックしたときはグリッドへ戻ります。編集中にグリッド内の別のセルをクリックすると、値を確定してクリックしたセルへ移ります(そのままドラッグすれば範囲選択、行・列ヘッダーなら行・列の選択になります)。

Enter 確定後の移動先は editorEnterMove prop で変更できます('down'(既定)/ 'up' / 'right' / 'left' / 'none'。Excel の「Enter キーを押したら、セルを移動する(方向)」相当。Tab / Shift+Tab には影響しません)。

確定後の移動先は「確定を反映した再レンダー後」の行数でクランプされます。onRowsChange で末尾に空行を追加する実装(Excel 的な入力グリッドの定石)では、最終行の Enter 確定でそのまま増えた行へ進めます。

IME(日本語入力)

IME 変換中(isComposing)の Enter / Escape / Tab は IME の操作としてのみ扱われ、セル編集の確定・キャンセルには使われません。変換確定の Enter でセルが誤確定することはありません。

IME オンのまま打ち始める(imeDirectInput)

既定では、編集していないセルで IME オンのまま日本語を打ち始めると、変換が始まらず最初の入力が失われます(F2 / Enter / ダブルクリックで編集を始めてからなら問題ありません)。imeDirectInput を付けると Excel / SPREAD と同じく、セルを選んだまま日本語を打ち始められます。

<SpreadsheetGrid rows={rows} columns={columns} onRowsChange={setRows} imeDirectInput />
  1. セルを選んだ状態で日本語を打つと、変換中の文字がセルの上に表示されます。
  2. 変換を確定(Enter)すると、確定した文字列で編集が始まります。続けて入力できます。
  3. もう一度 Enter でセルを確定して下へ移動します。

対象は text エディタと number エディタの編集可能セルです。number の列では、確定した全角の数字を半角に直して編集が始まります(「12.5」→ 12.5。数値にならない変換は捨てます)。select / date などの列では従来どおり何も入りません。既定 OFF なのは、有効中はグリッドにフォーカスがあるあいだ document.activeElement が入力欄になり、入力欄では反応しないアプリのショートカットが効かなくなるためです。プレイグラウンドの imeDirectInput トグルで試せます。詳細は props を参照してください。

ラベル行(labelRow 有効時)

キー操作
↑ / ↓ラベル行(見出し行)には止まらず、同じ向きの次のデータ行へ読み飛ばす
ペーストラベル行を飛ばして次のデータ行へ続けて貼り付ける(行は落ちない)

グループ行(行グルーピング有効時)

キー操作
Enter / Spaceグループの開閉

スクリーンリーダー

表は WAI-ARIA の grid として公開しています。矢印キーでアクティブセルを動かすと、支援技術がそのセル(列見出し・行番号・値)を読み上げます。1 画面に複数のグリッドを置くときは ariaLabel で表に名前を付けてください。

<SpreadsheetGrid ariaLabel="受注一覧" rows={rows} columns={columns} />

付けている役割と属性の一覧は API リファレンス を参照してください。

タッチ操作(スマホ / タブレット)

タッチ端末(pointerType === 'touch')では、ドラッグをブラウザのスクロールに譲る設計です。マウスの「押した瞬間に選択開始 → ドラッグで範囲拡張」は行わず、タップで確定します。

操作動作
セルをタップアクティブセル + 単一セル選択
同じセルを素早く 2 回タップ(300ms 以内)編集開始(ダブルクリック相当。dblclick を発火しないブラウザでも動作)
スワイプ縦横スクロール(範囲選択にはなりません)
行番号をタップ行全体を選択(enableRowSelection 時はチェックボックス行選択)
列ヘッダーをタップ列全体を選択
列ヘッダーの ⋮ をタップ列メニュー(フィルター / ソート / 固定 / 表示…)。タッチ端末では ⋮ を常時表示します

補足:

  • 範囲選択(複数セル)はタッチでは行えません。Shift+タップ のソートも修飾キーがないため対象外です(列メニューから操作してください)。
  • 列幅の変更(境界の把手)/ 列の並べ替え(grip)はタッチでもドラッグできますが、把手が小さいため補助的な操作です。
  • セルのコンテキストメニュー(右クリック)はタッチの長押しには対応していません(ブラウザが長押しを contextmenu として発火する環境では開きます)。
  • グリッド root には touch-action: manipulation を当てており、セル上のダブルタップがブラウザのズームに奪われません(パン / ピンチズームは有効のまま)。

試すにはセル編集とバリデーションやソートとフィルターのデモをどうぞ。

On this page