rc-slider vs react-slider vs react-input-slider
React用スライダーUIコンポーネントの技術的比較
rc-sliderreact-sliderreact-input-slider類似パッケージ:
React用スライダーUIコンポーネントの技術的比較

rc-sliderreact-input-sliderreact-slider はいずれも React アプリケーションで数値入力を視覚的に操作するためのスライダーコンポーネントを提供します。これらのライブラリは共通してドラッグによる値調整やキーボードナビゲーションをサポートしていますが、内部アーキテクチャ、カスタマイズ性、機能範囲、およびメンテナンス状況に大きな違いがあります。特に、rc-slider は Ant Design の公式依存パッケージとしても広く使われており、高度な機能と拡張性を備えています。一方、react-input-slider はシンプルなユースケース向けに設計されていますが、公式ドキュメントや最近の更新が確認できず、新規プロジェクトでの使用には注意が必要です。react-slider はバランスの取れたAPI設計とアクセシビリティ対応により、中規模プロジェクトに適しています。

npmのダウンロードトレンド
3 年
GitHub Starsランキング
統計詳細
パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
rc-slider3,036,6823,085173 kB2803ヶ月前MIT
react-slider292,773911269 kB402年前MIT
react-input-slider11,017140-164年前MIT

Reactスライダーライブラリ比較:rc-slider vs react-input-slider vs react-slider

Reactアプリで数値入力UIを実装する際、スライダーコンポーネントはよく使われるパターンです。しかし「スライダー」と一言で言っても、ライブラリごとに設計思想や実装の質が大きく異なります。本稿では、rc-sliderreact-input-sliderreact-slider の3つを、実際の開発現場で直面する技術的課題を中心に比較します。

⚠️ メンテナンス状況の確認:react-input-slider は使用を避けるべき

まず重要な前提として、react-input-slider公式npmページおよびGitHubリポジトリにおいて、近年の更新が確認できず、非推奨(deprecated)と見なすべき状態 です。npmには明示的なdeprecation警告はありませんが、最後のリリースは2018年以前であり、TypeScript定義や現代的なReactライフサイクルへの対応が不十分です。新規プロジェクトでこのパッケージを採用することは、将来的なセキュリティリスクや互換性問題を招く可能性があるため、強く推奨されません

以下では、現実的に選択肢となる rc-sliderreact-slider を中心に比較します。

🎛️ 基本的な使い方とAPI設計

rc-slider: 豊富なpropsで細かい制御が可能

rc-slider はAnt Designの裏側でも使われている信頼性の高い実装で、propsの粒度が非常に細かく設計されています。

import Slider from 'rc-slider';
import 'rc-slider/assets/index.css';

function MySlider() {
  return (
    <Slider
      min={0}
      max={100}
      step={5}
      defaultValue={30}
      onChange={(value) => console.log('Changed:', value)}
      onAfterChange={(value) => console.log('Final value:', value)}
    />
  );
}

react-slider: 直感的なpropsとシンプルな構成

react-slider は最小限のpropsで動作し、初心者にも分かりやすい設計です。

import ReactSlider from 'react-slider';

function MySlider() {
  return (
    <ReactSlider
      min={0}
      max={100}
      step={5}
      defaultValue={30}
      onChange={(value) => console.log('Changed:', value)}
      // onAfterChange は存在しない
    />
  );
}

💡 注:react-input-slider は以下のような古いAPIを持ちますが、新規プロジェクトでは使用しないでください

// 非推奨:react-input-slider(使用禁止)
import Slider from 'react-input-slider';

function MySlider() {
  return <Slider axis="x" x={50} onChange={({ x }) => console.log(x)} />;
}

📏 範囲選択(Range Slider)の実装

複数の値を同時に選択できる範囲スライダーは、日付フィルターや価格帯選択などでよく使われます。

rc-slider: 専用のRangeコンポーネントを提供

rc-sliderRange コンポーネントを別途エクスポートしており、明確に分かれています。

import { Range } from 'rc-slider';

function PriceRange() {
  return (
    <Range
      min={0}
      max={1000}
      defaultValue={[200, 800]}
      onChange={(values) => console.log('Range:', values)}
    />
  );
}

react-slider: 単一コンポーネントで範囲選択をサポート

react-sliderminValuemaxValue props で範囲選択を有効化します。

import ReactSlider from 'react-slider';

function PriceRange() {
  return (
    <ReactSlider
      min={0}
      max={1000}
      defaultValue={[200, 800]}
      onChange={(values) => console.log('Range:', values)}
      // 内部で配列かどうかを判定
    />
  );
}

🖥️ 方向とレイアウト:縦スライダーの実装

縦方向スライダーは音量調節や特殊なUIで必要になることがあります。

rc-slider: vertical propで明示的に指定

<Slider vertical min={0} max={100} defaultValue={50} />

react-slider: orientation propで制御

<ReactSlider orientation="vertical" min={0} max={100} defaultValue={50} />

♿ アクセシビリティ(ARIA)対応

スクリーンリーダー対応やキーボード操作は、プロダクション品質のUIに必須です。

  • rc-slider: 完全なARIA属性(role="slider", aria-valuenow など)を自動出力。キーボード操作(矢印キー、Home/End)を標準でサポート。
  • react-slider: 同様にARIA属性を含み、キーボードナビゲーションに対応。ariaLabelariaValuetext などのpropsでカスタマイズ可能。
  • react-input-slider: ARIA属性のサポートが不完全で、現代的なアクセシビリティ基準を満たしていない可能性が高い。

🎨 カスタムレンダリング:ハンドルやトラックの見た目変更

ブランドガイドラインに合わせて見た目を調整したい場合の柔軟性を比較します。

rc-slider: renderTrack / renderHandle で完全制御

<Slider
  renderTrack={(props, state) => (
    <div {...props} style={{ ...props.style, backgroundColor: '#ccc' }} />
  )}
  renderHandle={(props) => (
    <div {...props} style={{ ...props.style, width: 24, height: 24, borderRadius: '50%' }} />
  )}
/>

react-slider: classNameやstyle propsで部分カスタマイズ

<ReactSlider
  className="horizontal-slider"
  thumbClassName="custom-thumb"
  trackClassName="custom-track"
/>

CSSでスタイルを上書きする方式で、JavaScriptによる動的レンダリングはサポートされていません。

🧪 テストとデバッグのしやすさ

  • rc-slider: 各ハンドルやトラックに一意の data-* 属性が付与されており、E2Eテスト(CypressやPlaywright)で簡単に要素を選択可能。
  • react-slider: thumbClassNametrackClassName を活用してテストIDを付与できるが、動的クラス名のため少し工夫が必要。
  • react-input-slider: テスト向けの属性がなく、DOM構造が不安定なため、テストの保守コストが高くなる。

🔄 状態管理との統合

Reactの状態管理ライブラリ(Redux、Zustand、Context API)と組み合わせる際の考慮点です。

rc-slider: onAfterChange で不要な再レンダリングを抑制

onChange はドラッグ中の毎フレームで呼ばれるため、頻繁な状態更新を避けたい場合に onAfterChange を使うのがベストプラクティスです。

const [value, setValue] = useState(50);

<Slider
  value={value}
  onChange={setValue} // プレビュー用
  onAfterChange={(v) => dispatch(updateValue(v))} // 最終確定値のみ保存
/>

react-slider: onChange のみ提供 — 最適化は自前で

onAfterChange が存在しないため、不要な再レンダリングを防ぐには useRefdebounce を自前で実装する必要があります。

const debouncedUpdate = useRef(debounce((v) => dispatch(updateValue(v)), 300));

<ReactSlider
  value={value}
  onChange={(v) => {
    setValue(v);
    debouncedUpdate.current(v);
  }}
/>

📌 まとめ:どのライブラリを選ぶべきか?

要件推奨パッケージ
複雑なUI(範囲選択、縦スライダー、カスタムハンドル)が必要rc-slider
Ant Design と統合済み or 今後統合予定rc-slider
シンプルなスライダーで軽量さを重視react-slider
アクセシビリティ対応が必須rc-slider または react-slider(両方対応)
新規プロジェクトreact-input-slider は絶対に使用しない

💡 最終的なアドバイス

  • 大規模・長期運用プロジェクトrc-slider を選ぶ。機能性とメンテナンス性のバランスが最良。
  • 小〜中規模アプリでシンプルなスライダーが欲しいreact-slider で十分。学習コストが低く、bundle sizeも小さい。
  • 既存コードで react-input-slider を使っている場合 → 次のメジャーアップデートで rc-slider または react-slider への移行を計画してください。

スライダーコンポーネントは一見単純に見えますが、アクセシビリティ、パフォーマンス、カスタマイズ性を考慮すると、ライブラリ選びは慎重に行うべきです。あなたのプロジェクトのスケールと要件に合った選択をしましょう。

選び方: rc-slider vs react-slider vs react-input-slider
  • rc-slider:

    rc-slider は複雑な要件(範囲選択、カスタムハンドル、縦方向スライダー、ステップ制御など)をサポートする必要がある場合に最適です。Ant Design エコシステムとの統合が求められるプロジェクトや、高いカスタマイズ性と安定したメンテナンスを重視するチーム向けです。ただし、軽量さより機能性を優先する設計なので、シンプルな用途ではオーバースペックになる可能性があります。

  • react-slider:

    react-slider はバランスの取れた機能セットとクリーンなAPIを求める場合に適しています。基本的なスライダー機能(縦横切り替え、キーボード操作、ARIA属性対応)をシンプルに実装したい中規模プロジェクトに向いています。高度なカスタマイズや複雑なインタラクションが不要であれば、このパッケージが最も扱いやすい選択肢です。

  • react-input-slider:

    react-input-slider は非推奨または未メンテナンスの可能性が高く、公式ドキュメントや最近のリリース情報が存在しません。新規プロジェクトでは使用を避けて、代わりに rc-sliderreact-slider を検討すべきです。既存コードベースで使用されている場合は、将来的な移行を計画することを強く推奨します。

rc-slider のREADME

rc-slider

Slider UI component for React

NPM version npm download build status Codecov bundle size dumi

Install

rc-slider

Example

npm start and then go to http://localhost:8000

Online examples: https://slider.react-component.now.sh/

Usage

Slider

import Slider from 'rc-slider';
import 'rc-slider/assets/index.css';

export default () => (
  <>
    <Slider />
  </>
);

Range

Please refer to #825 for information regarding usage of Range. An example:

import Slider, { Range } from 'rc-slider';
import 'rc-slider/assets/index.css';

export default () => (
  <>
    <Slider range />
  </>
);

Compatibility

IE / Edge
IE / Edge
Firefox
Firefox
Chrome
Chrome
Safari
Safari
Electron
Electron
IE11, Edgelast 2 versionslast 2 versionslast 2 versionslast 2 versions

API

createSliderWithTooltip(Slider | Range) => React.Component

An extension to make Slider or Range support Tooltip on handle.

const Slider = require('rc-slider');
const createSliderWithTooltip = Slider.createSliderWithTooltip;
const Range = createSliderWithTooltip(Slider.Range);

Online demo

After Range or Slider was wrapped by createSliderWithTooltip, it will have the following props:

NameTypeDefaultDescription
tipFormatter(value: number): React.ReactNodevalue => valueA function to format tooltip's overlay
tipPropsObject{
placement: 'top',
prefixCls: 'rc-slider-tooltip',
overlay: tipFormatter(value)
}
A function to format tooltip's overlay

Common API

The following APIs are shared by Slider and Range.

NameTypeDefaultDescription
classNamestring''Additional CSS class for the root DOM node
minnumber0The minimum value of the slider
maxnumber100The maximum value of the slider
idstring''Unique identifier for the component, used for accessibility
marks{number: ReactNode} or{number: { style, label }}{}Marks on the slider. The key determines the position, and the value determines what will show. If you want to set the style of a specific mark point, the value should be an object which contains style and label properties.
stepnumber or null1Value to be added or subtracted on each step the slider makes. Must be greater than zero, and max - min should be evenly divisible by the step value.
When marks is not an empty object, step can be set to null, to make marks as steps.
verticalbooleanfalseIf vertical is true, the slider will be vertical.
handle(props) => React.ReactNodeA handle generator which could be used to customized handle.
includedbooleantrueIf the value is true, it means a continuous value interval, otherwise, it is a independent value.
reversebooleanfalseIf the value is true, it means the component is rendered reverse.
disabledbooleanfalseIf true, handles can't be moved.
keyboardbooleantrueSupport using keyboard to move handlers.
dotsbooleanfalseWhen the step value is greater than 1, you can set the dots to true if you want to render the slider with dots.
onBeforeChangeFunctionNOOPonBeforeChange will be triggered when ontouchstart or onmousedown is triggered.
onChangeFunctionNOOPonChange will be triggered while the value of Slider changing.
onChangeCompleteFunctionNOOPonChangeComplete will be triggered when ontouchend or onmouseup is triggered.
minimumTrackStyleObjectplease use trackStyle instead. (only used for slider, just for compatibility , will be deprecate at rc-slider@9.x )
maximumTrackStyleObjectplease use railStyle instead (only used for slider, just for compatibility , will be deprecate at rc-slider@9.x)
handleStyleArray[Object] | Object[{}]The style used for handle. (both for slider(Object) and range(Array of Object), the array will be used for multi handle following element order)
trackStyleArray[Object] | Object[{}]The style used for track. (both for slider(Object) and range(Array of Object), the array will be used for multi track following element order)
railStyleObject{}The style used for the track base color.
dotStyleObject | (dotValue) => Object{}The style used for the dots.
activeDotStyleObject | (dotValue) => Object{}The style used for the active dots.

Slider

NameTypeDefaultDescription
defaultValuenumber0Set initial value of slider.
valuenumber-Set current value of slider.
startPointnumberundefinedTrack starts from this value. If undefined, min is used.
tabIndexnumber0Set the tabIndex of the slider handle.
ariaLabelForHandlestring-Set the aria-label attribute on the slider handle.
ariaLabelledByForHandlestring-Set the aria-labelledby attribute on the slider handle.
ariaRequiredboolean-Set the aria-required attribute on the slider handle.
ariaValueTextFormatterForHandle(value) => string-A function to set the aria-valuetext attribute on the slider handle. It receives the current value of the slider and returns a formatted string describing the value. See WAI-ARIA Authoring Practices 1.1 for more information.

Range

NameTypeDefaultDescription
defaultValuenumber[][0, 0]Set initial positions of handles.
valuenumber[]Set current positions of handles.
tabIndexnumber[][0, 0]Set the tabIndex of each handle.
ariaLabelGroupForHandlesArray[string]-Set the aria-label attribute on each handle.
ariaLabelledByGroupForHandlesArray[string]-Set the aria-labelledby attribute on each handle.
ariaValueTextFormatterGroupForHandlesArray[(value) => string]-A function to set the aria-valuetext attribute on each handle. It receives the current value of the slider and returns a formatted string describing the value. See WAI-ARIA Authoring Practices 1.1 for more information.
countnumber1Determine how many ranges to render, and multiple handles will be rendered (number + 1).
allowCrossbooleantrueallowCross could be set as true to allow those handles to cross.
pushableboolean or numberfalsepushable could be set as true to allow pushing of surrounding handles when moving a handle. When set to a number, the number will be the minimum ensured distance between handles. Example:
draggableTrackbooleanfalseOpen the track drag. open after click on the track will be invalid.

SliderTooltip

The Tooltip Component that keep following with content.

Development

npm install
npm start

Test Case

npm run test

Coverage

npm run coverage

License

rc-slider is released under the MIT license.