PE04▸⌨️ Input · 進階輸入▸範圍
Slider
滑桿
難度 ★★★★★標籤 slider · range · step2 min read
模式簡述
Slider:拖曳取值。音量、亮度、價格篩選都會用。比輸入數字直觀但精度差。
音量8
0100
Claude Code Prompt
參考:PE04 slider 組件:Slider.tsx Slider:拖曳取值。音量、亮度、價格篩選都會用。比輸入數字直觀但精度差。 限制: - 沒顯示當前值 - step 沒設 - 鍵盤無法調
完整程式碼
"use client";
import { useEffect, useState } from "react";
type State = "min" | "mid" | "max";
export function Slider({ state = "mid" }: { state?: State }) {
const pct = state === "min" ? 8 : state === "max" ? 92 : 50;
const [v, setV] = useState(pct);
useEffect(() => setV(pct), [pct]);
return (
<div className="w-full max-w-md">
<div className="mb-3 flex items-center justify-between">
<span className="font-mono text-[11px] text-muted-foreground">音量</span>
<span className="font-mono text-xs text-foreground">{v}</span>
</div>
<div className="relative h-6">
<div className="absolute inset-x-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-muted" />
<div
className="absolute left-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-lab-accent"
style={{ width: `${v}%` }}
/>
<input
type="range"
min={0}
max={100}
value={v}
onChange={(e) => setV(Number(e.target.value))}
className="absolute inset-0 h-full w-full cursor-pointer appearance-none bg-transparent
[&::-webkit-slider-thumb]:h-4 [&::-webkit-slider-thumb]:w-4
[&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full
[&::-webkit-slider-thumb]:bg-foreground [&::-webkit-slider-thumb]:shadow"
/>
</div>
<div className="mt-2 flex justify-between font-mono text-[10px] text-muted-foreground">
<span>0</span>
<span>100</span>
</div>
</div>
);
}何時用
- ✅ 音量、亮度、不透明度等連續值
- ✅ 價格區間篩選
- ✅ 圖片裁切、設計工具的數值微調
何時別用
- ❌ 精確輸入(如金額 12345.67)
- ❌ 離散且少量的選項(用 segmented control)
- ❌ 手機觸控精度要求高的場景
我踩過的坑
-
沒顯示當前值:拖曳時看不到數字。要 tooltip 或旁邊 label 即時顯示。
-
step 沒設:0-100 連續但其實只要整數。設 step=1 跳整數。
-
鍵盤無法調:focus 後 ArrowLeft/Right 要可微調,PgUp/PgDn 大步調。
相關模式
- PE02