本文へスキップ

即時フィルタ

検索ボックスに入力するとリストが即座に絞り込まれる。ページ遷移なしでさくさく探せる。

プレビュー

入力

操作実際に入力して試せます。

仕様書

向く場面
  • 数十件の一覧から名前で即座に探す
  • 都道府県・タグなど短い語の一覧
  • ページ遷移なしで絞り込みたい選択肢
避ける場面
  • 件数が多くサーバー検索が要る一覧
  • 複数条件の組み合わせが要る絞り込み
  • 一致語のハイライトが意味を持たない数値列
構成要素
  • 検索欄
  • 検索アイコン
  • 一覧
  • 一致ハイライト
  • 0件メッセージ
持っている状態
  • 通常
  • ホバー
  • フォーカス
  • 空
キーボード

Tab で検索欄へ移動し文字入力で即時絞り込み。一覧の項目はフォーカス不可(表示のみ)

支援技術

input に aria-label、一致箇所は mark 要素、0件は「一致する項目がありません」の文言で示し色に依存しない。件数の変化は sr-only の role=status で「N件」を告知

動き

枠線色 0.2s・行背景 0.15s。絞り込み自体は即時(動きなし)。reduced-motion で transition 停止

デザインの要点

  • 絞り込みは input イベントごとに即時。ボタンを押させると「押す前の一覧」と「押した後」の2状態を頭に置かせることになる
  • 一致箇所は mark で組み立て、innerHTML に文字列を流し込まない。入力値がそのまま HTML になる経路を作らない
  • 0件は空白ではなく文言で示す。何も出ないと「壊れた」と「無かった」の区別がつかない
  • 件数の変化は sr-only の role=status で告知する。目で見えている行の増減は、読み上げでは何も起きていないのと同じ

コード(コピーして使えます)

<div class="filter-wrap">
  <div class="filter-search">
    <span class="filter-icon" aria-hidden="true">🔍</span>
    <input class="filter-input" type="text" placeholder="キーワードで絞り込む" aria-label="キーワードで絞り込む" autocomplete="off">
  </div>
  <p class="filter-status" id="filter-status" role="status" aria-live="polite"></p>
  <ul class="filter-list">
    <li>東京都</li>
    <li>大阪府</li>
    <li>神奈川県</li>
    <li>愛知県</li>
    <li>埼玉県</li>
    <li>千葉県</li>
    <li>福岡県</li>
    <li>北海道</li>
  </ul>
  <p class="filter-empty" hidden>一致する項目がありません</p>
</div>

タグ

同じカテゴリ「ナビ・リスト操作」のほかのパーツ

関連パーツ