範囲スライダーRangeSliderExperimental

境界のある範囲から最小値と最大値を選択するスライダーです。

プレビュー

状態とバリエーション

範囲指定

最小値と最大値を同じトラック上で指定します。

24 - 72

2つのつまみで最小値と最大値を指定します。

刻み幅

価格帯や容量のように、決まった単位で選ばせたい時に使います。

20 - 80

2つのつまみで最小値と最大値を指定します。

入力欄との連動

正確な値を指定したい場合は、数値入力と組み合わせます。

24 - 72

2つのつまみ、または連動する入力欄で範囲を指定します。

無効化

操作できない理由はツールチップで伝えます。

32 - 68

2つのつまみで最小値と最大値を指定します。

プロパティ

表は横にスクロールできます
プロパティ初期値説明
value[number, number]-外部から渡す最小値と最大値です。
defaultValue[number, number]-内部状態で使う場合の初期値です。
onValueChange(value: [number, number]) => void-どちらかのつまみが変わった時に呼ばれます。
minnumber0選択できる最小値です。
maxnumber100選択できる最大値です。
stepnumber1つまみを動かす単位です。
minLabelstring'Minimum value'下限つまみの支援技術向けラベルです。
maxLabelstring'Maximum value'上限つまみの支援技術向けラベルです。

使い方

import * as React from "react";
import { RangeSlider } from "@gunjo/ui";

export function PriceRangeFilter() {
  const [range, setRange] = React.useState<[number, number]>([24, 72]);

  return (
    <RangeSlider
      className="w-full max-w-sm"
      value={range}
      onValueChange={setRange}
      min={0}
      max={100}
      step={1}
      minLabel="最小値"
      maxLabel="最大値"
    />
  );
}

設計の判断

  • 本物の input[type=range] を2本重ねた。自前のドラッグ処理は書かず、ネイティブの range を2本、同じ場所に重ねています。つまみだけがポインタを受け取り、帯と塗りは背後の飾りです。矢印キー・Home と End・読み上げが最初から効くのは、この作りのためです。
  • つまみが交差したら、止めずに入れ替える。資料は「2つのハンドルが交差しないロジックを実装する」を挙げています。GUNJO は交差の手前で止めるのではなく、確定のときに小さいほうを最小・大きいほうを最大として並べ替えます。引っかかって動かないより、追い越せるほうが操作しやすいからです。step の丸めも同じ場所でやります。
  • 数値の表示は、まだ書いていません。資料は「常に現在値を数値で表示する」を核に挙げていますが、この部品は帯とつまみだけで、数字を出しません。単位つきの表示も、数値入力との横並びも持たないので、いまは呼ぶ側が value を受け取って自分で書く形です。
    一般のスライダーの設計は UIXHERO の「スライダー」にあります。

使用コンポーネント

いつ・なぜ使うか(UIXHERO)

「いつ・なぜ使うか」の判断は、姉妹サイト UIXHERO の記事で解説しています。