スライダー
stimeo--slider
キーボード操作とドラッグに対応した、単一つまみのレンジスライダー。
stimeo--slider コントローラは WAI-ARIA の Slider パターンを実装します。値はつまみの aria-valuenow/min/max で支援技術へ、ルート要素の CSS 変数 --stimeo--slider-fraction(0..1)で CSS へ公開され、つまみの配置は consumer 側が行えます。最小値・最大値・ステップ・初期値は data-*-value 属性で指定します。ライブラリは挙動のみを提供し、レイアウトはこの Playground 側が持ちます。
実行中
キーボード操作
| キー | 動作 |
|---|---|
| → / ↑ | 値を 1 ステップ増やす。 |
| ← / ↓ | 値を 1 ステップ減らす。 |
| PageUp / PageDown | 値を 10 ステップ分動かす。 |
| Home / End | 最小値 / 最大値へジャンプする。 |
<%# Markup for the slider (APG Slider / single thumb) demo.
stimeo--slider provides aria-valuemin/max/now plus keyboard and drag operation, and
exposes the thumb position fraction (0..1) as the root CSS variable
--stimeo--slider-fraction. The thumb's actual placement is the Playground's CSS
using that variable. %>
<div
class="slider"
data-controller="stimeo--slider"
data-stimeo--slider-min-value="0"
data-stimeo--slider-max-value="100"
data-stimeo--slider-step-value="1"
data-stimeo--slider-value-value="40">
<div class="slider__track" data-stimeo--slider-target="track"
data-action="pointerdown->stimeo--slider#onPointerDown">
<div class="slider__range" aria-hidden="true"></div>
<div class="slider__thumb" role="slider" tabindex="0"
aria-label="<%= t("components.slider.demo.label") %>"
data-stimeo--slider-target="thumb"
data-action="keydown->stimeo--slider#onKeydown"></div>
</div>
</div>
/*
* Presentation-only styles for the slider demo.
* The thumb position is computed from the CSS variable the library exposes on the
* root: --stimeo--slider-fraction (0..1).
*/
.slider {
width: min(20rem, 100%);
padding: 0.75rem 0.625rem;
}
.slider__track {
position: relative;
height: 0.375rem;
border-radius: 999px;
background: var(--border);
}
/* Fill from 0 to the current value (the fraction) with the accent color. */
.slider__range {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: calc(var(--stimeo--slider-fraction, 0) * 100%);
border-radius: 999px;
background: var(--accent);
}
/* Place the thumb at the fraction position (translateX(-50%) to center it). */
.slider__thumb {
position: absolute;
top: 50%;
left: calc(var(--stimeo--slider-fraction, 0) * 100%);
width: 1.25rem;
height: 1.25rem;
border-radius: 50%;
background: var(--surface-card);
border: 2px solid var(--accent);
transform: translate(-50%, -50%);
cursor: grab;
}
.slider__thumb:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 2px;
}
このデモに固有の消費側 JS はありません(挙動はコントローラが担います)。
これらのスタイルは共通のデザイントークン(ライト/ダーク両対応)を使います。 共通スタイルも一緒にコピーし、ルート要素の data-theme を切り替えればダークになります。
このコンポーネントを動かすために HTML へ記述する data-* 属性です。ルート要素に下の data-controller を付け、その内側に各 target / value / action を配置します。
ルート要素に付与
data-controller="stimeo--slider"
ターゲット
| 名前 | 説明 | 属性 |
|---|---|---|
track
必須
|
レール。押下位置から値を決めドラッグを開始する。 | data-stimeo--slider-target="track" |
thumb
必須
|
ドラッグ可能なつまみ(role=slider)。ARIA 値が現在値を表す。 |
data-stimeo--slider-target="thumb" |
値(Values)
| 名前 | 説明 | 属性 |
|---|---|---|
min
|
最小値(既定0)。Home の移動先。 | data-stimeo--slider-min-value |
max
|
最大値(既定100)。End の移動先。 | data-stimeo--slider-max-value |
step
|
スナップ・刻み幅(既定1)。矢印は1刻み、Page は10倍。 | data-stimeo--slider-step-value |
value
|
現在値(既定0)。接続時にクランプ・スナップされる。 | data-stimeo--slider-value-value |
アクション
| 名前 | 説明 | アクション |
|---|---|---|
onKeydown
|
APG 準拠のキー操作(矢印、Page は10倍、Home/End で最小/最大)。 | stimeo--slider#onKeydown |
onPointerDown
|
ポインタドラッグを開始し、位置から値を決める。 | stimeo--slider#onPointerDown |
イベント
| 名前 | イベント |
|---|---|
change
|
stimeo--slider:change |
状態フック
ライブラリが操作するのはこれらの ARIA / data 属性、カスタムプロパティだけです。見た目は利用側 CSS がこれらに反応して作ります([aria-selected] / [aria-expanded] / var(--stimeo--…) などのセレクタでフックします)。
| フック | 対象 | 意味 |
|---|---|---|
aria-valuenow |
つまみ | 現在値。 |
aria-valuemin / aria-valuemax |
つまみ | 範囲の最小値・最大値。 |
--stimeo--slider-fraction |
ルート要素 | 現在値の割合(0..1)。つまみの配置に使う。 |