UIXHERO

Sort(ソート)

コンテンツを特定の基準(日付・価格・名前・評価など)で並べ替えるUIコンポーネント。ソートUIの形式選択・現在の並び順の可視化・昇順/降順トグルの設計基準を解説する。

2026年3月2日
更新: 2026年8月28日
20
by Dengen Yosho(DGYS)

コンテンツを特定の基準(日付・価格・名前・評価など)で並べ替えるコンポーネント。ドロップダウン・タブ・ボタングループなど複数の形式があり、「現在どのキーで・どの方向(昇順/降順)に並んでいるか」をユーザーに常に伝えることが設計の核。

この記事を読むと、ソートUIの形式選択(ドロップダウン vs チップ vs テーブルヘッダー)・昇順/降順のアイコン表現・現在のソート状態の可視化・URLへの状態永続化が自分でできるようになります。


1. UI例(Preview / Live)

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

コンテンツを特定のキー(日付・価格・名前・評価など)と方向(昇順・降順)で並べ替えるUIコンポーネント。データの量・ソートキーの数・UIの(リスト・テーブル・グリッド)によって最適な形式が変わる。

FilterとSortの違い:Filterは「表示するコンテンツを絞る(件数が変わる)」。Sortは「全コンテンツを別の順番で並べ替える(件数は変わらない)」。両方が必要な場合は同じUIエリアに並べて配置する。


3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • コンテンツを複数の基準で並べ替えたい場合(最新順・人気順・価格順など)
  • ユーザーが自分の優先順位でリストを整理したい記事一覧・商品一覧・管理画面
  • テーブルの各カラムで並べ替えが必要なデータテーブル

3.2 When NOT to use

  • コンテンツが少量(10件以下)で全件見渡せる → 固定順で表示して十分
  • ソート基準が1つしかない → 常に同じ順で表示する
  • コンテンツが時系列のみ(ブログ記事) → 「新しい順」をデフォルトにして選択肢を省く

3.3 代替UI(Alternatives)

  • 条件で絞り込む → Filter
  • カテゴリ切り替え → Tabsコントロール
  • テーブルの全カラムでソート → テーブルヘッダー型(aria-sort 必須)

4. 設計判断の核(Decision Principles)

Sortの核は「現在何のキーで・どの方向に並んでいるか」を常にユーザーに見せること——ソート状態が分からないと、なぜこの順番で並んでいるのかユーザーが理解できない。

判断の優先順位:① 形式選択 → ② 現在 → ③ 昇順/降順トグル → ④ URL永続化

  • 形式の選択基準:ソートキーが2〜3個なら常時表示のチップ型。4個以上ならドロップダウン型。テーブルなら各カラムヘッダーにソートボタンを内蔵する
  • 現在のソートキーを必ずハイライト:どのキーがアクティブかを色・太字・アイコンで明示する。ユーザーが「今何順に並んでいるか」を一目で把握できる必要がある
  • 昇順/降順は同じボタンを再クリックでトグル:同じキーを再クリックすると昇順↔降順が切り替わるパターンが最も直感的。テーブルヘッダー型ではこの挙動が
  • デフォルトのソートキーを明示する:「新しい順」「人気順」など、ページを開いた時点のソート基準をデフォルト選択として示す。ユーザーは「なぜこの順番?」と思わなくなる

5. 状態設計(States)

5.1 必須状態(Required)

  • Default(デフォルトキー選択中):初期表示のソート状態。どのキーがデフォルトかを明示
  • Active(ソート適用中):選択中のキーをハイライト、矢印アイコンで方向を示す

5.2 条件付き状態(Conditional)

  • Loading:サーバーサイドソートで結果待ち中のスケルトン
  • 昇順:矢印が上向き(↑)
  • 降順:矢印が下向き(↓)
状態必須何を伝えるか
Defaultデフォルトのソート基準
Active(昇順)このキーで昇順に並んでいる
Active(降順)このキーで降順に並んでいる
Loadingソート処理中

6. バリエーション設計(Variants)

ソートキーの数とUIの文脈で形式を選ぶ。

バリアントキー数配置適したUI
チップ型(Toggle Group)2〜3個コンテンツ上部リスト・カードグリッド
ドロップダウン型4個以上ツールバー記事一覧・商品一覧
テーブルヘッダー型テーブルのth要素データテーブル

禁止パターン:ソートを適用してもどのキーがアクティブか視覚的に分からない → 色・太字・アイコンのいずれかで必ずアクティブ状態を示す。


7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • ソート状態の不可視化:どのキーでソートされているか分からず、ユーザーが順番の意味を理解できない
  • 昇順/降順の表示なし:「更新日順」で並んでいることは分かるが、新しい順か古い順かが分からない
  • テーブルヘッダーに aria-sort がない:スクリーンリーダーがソート状態を伝えられない

7.1 Bad(典型3つ)

  • ドロップダウンで「更新日」を選んだが、どの選択肢がアクティブかドロップダウン外からは分からない
  • 昇順・降順の切り替えが別々のボタンで実装されており、2つのボタンが常に表示されてUIが複雑になっている
  • テーブルの列ヘッダーをクリックするとソートされるが、どの列でソートされているか・昇順か降順かが何も示されない

7.2 Good(対になる3つ)

  • ドロップダウンのトリガーボタンに現在のソートキーを表示する(「並び順:更新日 ↓」)
  • 同じキーを再クリックすると昇順↔降順がトグルし、現在の方向を矢印アイコン(↑/↓)で示す
  • テーブルヘッダーボタンに aria-sort="ascending" または aria-sort="descending" を付与し、アクティブ列をハイライトする

7.3 How to fix(手順)

  1. ドロップダウンのトリガーボタンテキストを「並び順」から「並び順:[現在のキー] [↑/↓]」に変更する
  2. チップ型・ドロップダウン型に昇順/降順トグルボタンを追加する(または同じキーの再クリックでトグル)
  3. テーブルヘッダーの <th> 内の <button>aria-sort 属性を動的に付与する
  4. ソート状態をURLの ?sort=date&dir=desc 形式で永続化する

8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Keyboard

  • Tab でソートコントロールにフォーカス
  • Enter / Space でソートキーを選択・昇順/降順をトグル
  • ドロップダウン型:Enter で開く、 で選択肢移動、Escape で閉じる

Focus

  • フォーカスリングをソートボタン・ドロップダウントリガーに表示する

Screen Reader

  • テーブルヘッダー型は aria-sort で並び順を伝える:
    <th>
      <button aria-sort="descending">更新日 ↓</button>
    </th>
    
  • チップ型・ドロップダウン型は aria-label で状態を説明する:
    <button aria-pressed="true" aria-label="更新日順(降順)でソート中">更新日</button>
    
  • ソート変更後に aria-live="polite" で「更新日の新しい順に並べ替えました」と通知する

Touch / Pointer

  • ソートボタン・ドロップダウントリガーのは最低44×44px
  • テーブルヘッダーのソートボタンは十分な高さを確保する

10. 実装メモ(Implementation Notes)

  • ソート状態は useSearchParams でURLに永続化するのが最善。?sort=date&dir=desc の形式でページリロード・共有URLでも状態が復元される
  • テーブルヘッダー型のソートは shadcn/ui の DataTable(TanStack Table ベース)が column.getIsSorted() を使って aria-sort を自動管理する
  • 昇順/降順のアイコンは Lucide の ArrowUp / ArrowDown / ArrowUpDown(未ソート)を使うと統一感が出る
  • クライアントサイドソートは Array.sort() + useMemo で実装し、依存配列に sortKeysortDir を含める

11. 関連リンク


12. まとめ

Sortの設計は「現在何のキーで・どの方向に並んでいるか」を常に見せることが最重要です。迷ったら 4. 設計判断の核 に戻り、ソートキーのハイライト・昇順/降順アイコン・aria-sort の3点を確認してください。Filterと組み合わせて使う場合は同じツールバーに並べ、ソート状態をURLに永続化することでブラウザバックへの対応も同時に解決します。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年8月28日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る