Lynx

Slider

지정된 범위에서 하나 또는 두 개의 값을 선택하는 슬라이더 컴포넌트입니다.

Engine ≥ 3.6
사용 가능 버전@seed-design/lynx-react@0.8.0, @seed-design/lynx-css@0.12.0
Lynx 예제를 불러오는 중입니다.

Installation

npx @seed-design/cli@latest add ui:slider --framework lynx

Props

Slider

Registry의 Slider는 Slider primitive를 Field 안내 요소와 함께 조합한 편의 래퍼입니다. 한 개의 thumb을 사용할 때는 defaultValues 또는 values에 한 값을 넣고, 범위를 선택할 때는 두 값을 넣습니다.

Prop

Type

label?React.ReactNode
indicator?React.ReactNode
description?React.ReactNode
errorMessage?React.ReactNode
showRequiredIndicator?boolean | undefined
required?boolean | undefined
fieldRef?React.Ref<NodesRef> | undefined
className?string | undefined
style?CSSProperties | undefined
main-thread:bindbgload?EventHandler<BaseImageLoadEvent<Element>> | undefined
main-thread:catchbgload?EventHandler<BaseImageLoadEvent<Element>> | undefined
main-thread:capture-bindbgload?EventHandler<BaseImageLoadEvent<Element>> | undefined
main-thread:capture-catchbgload?EventHandler<BaseImageLoadEvent<Element>> | undefined
main-thread:global-bindbgload?EventHandler<BaseImageLoadEvent<Element>> | undefined
main-thread:bindbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefined
main-thread:catchbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefined
main-thread:capture-bindbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefined
main-thread:capture-catchbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefined
main-thread:global-bindbgerror?EventHandler<BaseImageErrorEvent<Element>> | undefined
main-thread:bindtouchstart?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:catchtouchstart?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-bindtouchstart?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-catchtouchstart?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:global-bindtouchstart?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:bindtouchmove?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:catchtouchmove?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-bindtouchmove?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-catchtouchmove?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:global-bindtouchmove?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:bindtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:catchtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-bindtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-catchtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:global-bindtouchcancel?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:bindtouchend?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:catchtouchend?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-bindtouchend?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-catchtouchend?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:global-bindtouchend?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:bindlongpress?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:catchlongpress?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-bindlongpress?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-catchlongpress?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:global-bindlongpress?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:bindtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:catchtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:capture-bindtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:capture-catchtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:global-bindtransitionstart?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:bindtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:catchtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:capture-bindtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:capture-catchtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:global-bindtransitioncancel?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:bindtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:catchtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:capture-bindtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:capture-catchtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:global-bindtransitionend?EventHandler<BaseTransitionEvent<Element>> | undefined
main-thread:bindanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:catchanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-bindanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-catchanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:global-bindanimationstart?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:bindanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:catchanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-bindanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-catchanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:global-bindanimationiteration?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:bindanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:catchanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-bindanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-catchanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:global-bindanimationcancel?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:bindanimationend?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:catchanimationend?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-bindanimationend?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:capture-catchanimationend?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:global-bindanimationend?EventHandler<BaseAnimationEvent<Element>> | undefined
main-thread:bindmousedown?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmousedown?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmousedown?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmousedown?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmousedown?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindmouseup?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmouseup?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmouseup?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmouseup?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmouseup?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindmousemove?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmousemove?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmousemove?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmousemove?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmousemove?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindmouseenter?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmouseenter?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmouseenter?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmouseenter?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmouseenter?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindmouseleave?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmouseleave?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmouseleave?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmouseleave?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmouseleave?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindmouseclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmouseclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmouseclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmouseclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmouseclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmousedblclick?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindmouselongpress?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindwheel?EventHandler<BaseWheelEvent<Element>> | undefined
main-thread:catchwheel?EventHandler<BaseWheelEvent<Element>> | undefined
main-thread:capture-bindwheel?EventHandler<BaseWheelEvent<Element>> | undefined
main-thread:capture-catchwheel?EventHandler<BaseWheelEvent<Element>> | undefined
main-thread:global-bindwheel?EventHandler<BaseWheelEvent<Element>> | undefined
main-thread:bindzoom?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:catchzoom?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-bindzoom?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:capture-catchzoom?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:global-bindzoom?EventHandler<BaseMouseEvent<Element>> | undefined
main-thread:bindkeydown?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:catchkeydown?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:capture-bindkeydown?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:capture-catchkeydown?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:global-bindkeydown?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:bindkeyup?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:catchkeyup?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:capture-bindkeyup?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:capture-catchkeyup?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:global-bindkeyup?EventHandler<BaseKeyEvent<Element>> | undefined
main-thread:bindfocus?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:catchfocus?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:capture-bindfocus?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:capture-catchfocus?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:global-bindfocus?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:bindblur?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:catchblur?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:capture-bindblur?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:capture-catchblur?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:global-bindblur?EventHandler<BaseCommonEvent<Element>> | undefined
main-thread:bindlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefined
main-thread:catchlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefined
main-thread:capture-bindlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefined
main-thread:capture-catchlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefined
main-thread:global-bindlayoutchange?EventHandler<LayoutChangeDetailEvent<Element>> | undefined
main-thread:binduiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:catchuiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:capture-binduiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:capture-catchuiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:global-binduiappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:binduidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:catchuidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:capture-binduidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:capture-catchuidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:global-binduidisappear?EventHandler<UIAppearanceDetailEvent<Element>> | undefined
main-thread:bindaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefined
main-thread:catchaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefined
main-thread:capture-bindaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefined
main-thread:capture-catchaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefined
main-thread:global-bindaccessibilityaction?EventHandler<AccessibilityActionDetailEvent<Element>> | undefined
main-thread:bindtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:catchtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-bindtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-catchtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:global-bindtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:bindlongtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:catchlongtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-bindlongtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:capture-catchlongtap?EventHandler<BaseTouchEvent<Element>> | undefined
main-thread:global-bindlongtap?EventHandler<BaseTouchEvent<Element>> | undefined
values?number[] | undefined
defaultValues?number[] | undefined
min?number | undefined
max?number | undefined
step?number | undefined
allowedValues?number[] | undefined
minStepsBetweenThumbs?number | undefined
dir?"ltr" | "rtl" | undefined
disabled?boolean | undefined
readOnly?boolean | undefined
invalid?boolean | undefined
onValuesChange?((values: number[]) => void) | undefined
onValuesCommit?((values: number[]) => void) | undefined
getAccessibilityLabel?((thumbIndex: number) => string) | undefined
getAccessibilityValueText?((value: number, thumbIndex: number) => string) | undefined
getValueIndicatorLabel?((params: { value: number; thumbIndex: number; }) => React.ReactNode) | undefined
valueIndicatorTrigger?"auto" | "active" | undefined

Registry 래퍼는 다음 두 종류의 prop을 제공합니다.

  • Slider 상태·동작: low-level Rootvalues, defaultValues, min, max, step, allowedValues, minStepsBetweenThumbs, dir, disabled, readOnly, invalid, onValuesChange, onValuesCommit, getAccessibilityLabel, getAccessibilityValueText, getValueIndicatorLabel, valueIndicatorTrigger를 그대로 전달합니다.
  • 화면과 Field 안내: label, labelWeight, indicator, description, errorMessage, showRequiredIndicator, markers, ticks, tickWeight, hideRange, hideValueIndicator, fieldRef를 제공합니다. markers의 각 항목은 숫자이거나 { value, label?, align? } 객체입니다.

allowedValues를 지정하면 허용된 값만 선택할 수 있으며 stepminStepsBetweenThumbs보다 우선합니다. valuesonValuesChange를 함께 사용하면 controlled 상태가 되고, onValuesCommit은 값이 확정되는 시점에 호출됩니다.

Usage

Registry의 조합이 아닌 @seed-design/lynx-react primitive를 직접 사용할 수도 있습니다. SliderRoot 안에서 SliderControlSliderTrack을 조합하고, track 안에 SliderRange와 필요한 SliderTick을 배치합니다. 각 thumb은 SliderThumb로 만들며 Value Indicator는 SliderValueIndicatorRoot, SliderValueIndicatorArrow와 그 안의 SliderValueIndicatorArrowTip, SliderValueIndicatorLabel로 구성합니다. 마커가 필요하면 SliderMarkers 안에 SliderMarker를 둡니다.

import { useState } from "@lynx-js/react";
import {
  ActionButton,
  SliderControl,
  SliderMarker,
  SliderMarkers,
  SliderRange,
  SliderRoot,
  SliderThumb,
  SliderTick,
  SliderTrack,
  SliderValueIndicatorArrow,
  SliderValueIndicatorArrowTip,
  SliderValueIndicatorLabel,
  SliderValueIndicatorRoot,
} from "@seed-design/lynx-react";

export function PriceSlider() {
  const [values, setValues] = useState([40]);

  const setPreset = () => {
    setValues([60]);
  };

  return (
    <view>
      <SliderRoot
        values={values}
        min={0}
        max={100}
        step={10}
        onValuesChange={setValues}
        getAccessibilityLabel={() => "가격"}
        getAccessibilityValueText={(value) => `${value}원`}
      >
        <SliderControl>
          <SliderTrack>
            <SliderRange />
            <SliderTick value={0} />
            <SliderTick value={50} />
            <SliderTick value={100} />
          </SliderTrack>
          <SliderValueIndicatorRoot index={0}>
            <SliderValueIndicatorArrow>
              <SliderValueIndicatorArrowTip />
            </SliderValueIndicatorArrow>
            <SliderValueIndicatorLabel index={0} />
          </SliderValueIndicatorRoot>
          <SliderThumb index={0} />
        </SliderControl>
        <SliderMarkers>
          <SliderMarker value={0}>0원</SliderMarker>
          <SliderMarker value={100}>100원</SliderMarker>
        </SliderMarkers>
      </SliderRoot>
      <ActionButton bindtap={setPreset}>60원으로 설정</ActionButton>
    </view>
  );
}

SliderThumbindexvalues 배열에서 thumb의 위치를 가리킵니다. package primitive를 직접 조합할 때도 값 변경과 제출·검증은 앱 상태와 요청 흐름에서 처리합니다.

Examples

Basic

minmax로 선택 범위를 정하고 하나의 thumb으로 값을 선택합니다.

Lynx 예제를 불러오는 중입니다.

Steps

step으로 선택 간격을 설정해 일정한 단위의 값만 선택합니다.

Lynx 예제를 불러오는 중입니다.

Allowed Values

allowedValues로 선택 가능한 값을 명시합니다. 이 prop을 지정하면 stepminStepsBetweenThumbs보다 allowedValues가 우선합니다.

Lynx 예제를 불러오는 중입니다.

With Ticks

track 위에 선택 단위를 나타내는 눈금을 표시할 수 있습니다.

Thin

연속적인 조작처럼 보이도록 작은 간격을 사용하고 얇은 눈금을 표시합니다.

Lynx 예제를 불러오는 중입니다.

Thick

값의 단계가 크거나 눈금 위치에서만 선택할 수 있는 경우 굵은 눈금을 표시합니다.

Lynx 예제를 불러오는 중입니다.

With Markers

slider 아래에 주요 값을 설명하는 marker를 표시합니다. marker의 시각적 텍스트는 native accessibility 값에 자동으로 포함되지 않으므로, 필요한 의미는 getAccessibilityValueText로도 전달하세요.

markers에는 숫자 또는 { value, label?, align? } 객체를 전달할 수 있습니다. 객체에서 align을 생략하면 최소값은 시작, 최대값은 끝, 나머지는 가운데에 배치됩니다.

Lynx 예제를 불러오는 중입니다.

Controlled

valuesonValuesChange를 사용하여 슬라이더의 값을 앱 상태로 제어합니다.

Lynx 예제를 불러오는 중입니다.

Listening to Value Changes

  • onValuesChange: 드래그 중 값이 바뀔 때마다 호출됩니다. 화면에 현재 값을 표시하거나 앱 상태를 실시간으로 갱신할 때 사용합니다.
  • onValuesCommit: 값 변경이 끝났을 때 호출됩니다. Lynx native에서는 값이 변경된 drag의 touch release에서 한 번 호출됩니다. 이 callback에 debounce를 추가할 필요는 없습니다.
Lynx 예제를 불러오는 중입니다.

Disabled

disabled를 사용하면 thumb을 조작할 수 없고 비활성 상태 스타일을 표시합니다.

Lynx 예제를 불러오는 중입니다.

Hide Range

hideRange로 활성 구간 색상을 숨기고 track만 표시합니다.

Lynx 예제를 불러오는 중입니다.

Customizing Value Indicator

Value Indicator Label

getValueIndicatorLabel로 thumb을 조작할 때 표시되는 Value Indicator의 텍스트를 바꿀 수 있습니다.

Value Indicator는 native touch 조작 중에 표시되는 보조 UI이며, 접근성 탐색이 읽는 값은 아닙니다. 의미 있는 단위나 설명을 제공해야 한다면 getAccessibilityValueText도 함께 사용하세요.

Lynx 예제를 불러오는 중입니다.

Value Indicator Trigger

valueIndicatorTrigger로 Value Indicator가 표시되는 조건을 정합니다. Lynx에서는 "auto""active"를 사용할 수 있습니다.

  • "active": 현재 touch로 조작하는 thumb에 표시합니다.
  • "auto" (기본값): native touch 환경에서는 "active"와 동일하게 동작합니다.

웹의 hover 기반 표시 조건이나 키보드 포커스 기반 동작은 Lynx native에 대응하지 않습니다.

Lynx 예제를 불러오는 중입니다.

Hide Value Indicator

hideValueIndicator로 thumb 위의 Value Indicator를 숨깁니다.

Lynx 예제를 불러오는 중입니다.

Range Slider

defaultValues 또는 values에 두 값을 전달하여 두 thumb 사이의 범위를 선택합니다.

Lynx 예제를 불러오는 중입니다.

Minimum Steps Between Thumbs

minStepsBetweenThumbs로 두 thumb 사이에 유지할 최소 간격을 지정합니다.

Lynx 예제를 불러오는 중입니다.

Accessibility

getAccessibilityValueText

native accessibility 탐색은 기본적으로 각 thumb에 minimum <min>, maximum <max>, current <value> 형식의 값을 제공합니다. 숫자만으로 의미가 충분하지 않다면 getAccessibilityValueText로 단위나 값의 의미를 포함한 설명을 제공하세요.

Lynx 예제를 불러오는 중입니다.

getAccessibilityLabel

getAccessibilityLabel로 각 thumb의 용도를 설명합니다. 특히 range slider에서는 각 thumb이 최소값·최대값 중 어떤 역할인지 구분할 수 있는 label을 제공하세요.

Lynx 예제를 불러오는 중입니다.

Field Integration

label, labelWeight, indicator, description, errorMessage, showRequiredIndicator를 사용해 슬라이더 주변에 Field 안내를 표시할 수 있습니다. invalidtrue이고 errorMessage가 있으면 오류 안내를 표시합니다.

Lynx 예제를 불러오는 중입니다.

RTL Support

dir="rtl"로 값의 시작과 끝이 오른쪽에서 왼쪽으로 배치되는 슬라이더를 만들 수 있습니다.

Lynx 예제를 불러오는 중입니다.

웹 버전과의 차이

Lynx Slider는 React Slider와 다음과 같은 차이가 있습니다.

  • 렌더링 요소: HTML form input과 DOM 요소 대신 native <view><text>를 사용합니다.
  • 입력 이벤트: 브라우저 pointer/keyboard 이벤트 대신 native touch 입력을 사용하며, 값 변경은 onValuesChange, 확정은 onValuesCommit으로 전달합니다.
  • Value Indicator: valueIndicatorTrigger="auto"도 native에서는 touch-active와 같고 hover로 표시되지 않습니다. "active"와 동일한 결과를 제공합니다.
  • 접근성: DOM ARIA 대신 getAccessibilityLabelgetAccessibilityValueText로 native accessibility 이름과 값을 제공합니다.
  • Field 안내: Registry의 label, description, errorMessage는 native 레이아웃으로 표시됩니다. DOM id를 통한 label·description 연결은 사용하지 않습니다.
  • 범위 선택: values 배열과 두 개의 native thumb으로 범위를 표현합니다.

Lynx 미지원 기능

Lynx에는 HTML form과 브라우저 키보드 모델이 없으므로 다음 React 전용 기능은 실행 예제로 제공하지 않습니다.

기능Lynx에서의 대체 또는 제한
form 제출, React Hook FormvaluesonValuesChange로 앱 상태를 관리하고, 제출은 앱의 요청 흐름에서 처리합니다.
HiddenInputHTML hidden input이 없습니다. 제출할 값은 앱 상태에서 직접 구성합니다.
namenative form field name이 없습니다. 앱 상태의 키나 요청 payload를 사용합니다.
브라우저 검증 및 form field 연결invalid, errorMessage로 화면 오류를 표시하고 검증은 앱에서 수행합니다.
getAriaLabelledby와 DOM ARIADOM id 연결이 없습니다. getAccessibilityLabelgetAccessibilityValueText로 native accessibility를 제공합니다.
keyboard, focus, focus-visible키보드 thumb focus 모델이 없습니다. native touch와 accessibility 탐색을 사용합니다.
hovernative에는 hover 상호작용이 없습니다. valueIndicatorTrigger="auto""active"와 같이 touch-active로 동작합니다.

따라서 Form (Uncontrolled)과 React Hook Form은 Lynx 문서의 실행 예제에서 제외했습니다. 제출·검증이 필요한 경우에도 슬라이더 값을 앱 상태에 연결하고, 앱의 제출·검증 로직과 native accessibility 안내를 사용하세요.

Last updated on

목차