@ data- slot/ sliver 数据位/ 滑动器
香草JavaScript的无头滑动组件. 支持具有完全键盘导航和ARIA合规的单值和射程滑动.
安装
bun add @data-slot/slider
# or
npm install @data-slot/slider
使用量
HTML 结构
<!-- Single value slider -->
<div data-slot="slider" data-default-value="50">
<div data-slot="slider-track">
<div data-slot="slider-range"></div>
</div>
<div data-slot="slider-thumb"></div>
</div>
<!-- Optional control wrapper -->
<div data-slot="slider" data-default-value="50">
<div data-slot="slider-control">
<div data-slot="slider-track">
<div data-slot="slider-range"></div>
</div>
<div data-slot="slider-thumb"></div>
</div>
</div>
<!-- Range slider (two thumbs) -->
<div data-slot="slider" data-default-value="25,75">
<div data-slot="slider-track">
<div data-slot="slider-range"></div>
</div>
<div data-slot="slider-thumb"></div>
<div data-slot="slider-thumb"></div>
</div>
Java 脚本
import { create, createSlider } from "@data-slot/slider";
// Auto-discover and bind all [data-slot="slider"] elements
const controllers = create();
// Or target a specific element
const slider = createSlider(element, {
defaultValue: 50,
min: 0,
max: 100,
step: 1,
thumbAlignment: "edge",
onValueChange: (value) => console.log("Changed:", value),
onValueCommit: (value) => console.log("Committed:", value),
});
// Programmatic control
slider.setValue(75);
console.log(slider.value); // 75
// Cleanup
slider.destroy();
API 密码
初始化
create(scope?)
寻找和约束未初始化 [data-slot="slider"] 后裔 scope (违约) document) (中文(简体) ). 回返 SliderController[] 新绑起的根。 初始化范围元素本身,使用 createSlider。 。 。 .
import { create } from "@data-slot/slider";
const controllers = create();
createSlider(root, options?)
创建一个 SliderController 用于一个根元素。 JavaScript 选项优先于相应的数据属性. 再次调用此选项为绑定根返回其已存在的控制器; 在重新绑定新选项前将其销毁 .
import { createSlider } from "@data-slot/slider";
const controller = createSlider(element, {});
槽数
运行时间槽
slider- 管理值、界限、方向和残疾状态的根元素.slider-control- 轨迹和拇指周围的可选交互包. 省略后,会使用音轨的母音,一般为根.slider-track- 用于测量指针位置和显示射程和拇指的必用道.slider-range- 音轨的可选填充部分;其位置和大小遵循选定的值或范围.slider-thumb- 需要有滑动语义和键盘支持的可拖动控制。 单个值或两个值用于范围;两个拇指启用范围模式.
数据属性
| 属性 | 说明 | 默认 |
|---|---|---|
data-default-value | 初始价值(50 或者说 25,75 范围) | min (单), [min, min] (范围) |
data-min | 最低价值 | 0 |
data-max | 最大值 | 100 |
data-step | 职级递增 | 1 |
data-large-step | 页面上下页的大步骤 | step * 10 |
data-orientation | horizontal 或者说 vertical | horizontal |
data-thumb-alignment | center, (中文(简体) ), edge,或 edge-client-only | center |
data-disabled | 禁用滑动器 | - 说吧 |
选项
JavaScript 选项优先于根数据属性.
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
defaultValue | number | [number, number] | min (单), [min, min] (范围) | 初始值; 被夹到边框并断开到 step。两个拇指启用范围模式. |
min | number | 0 | 最低价值 |
max | number | 100 | 最大值 |
step | number | 1 | 分级递增;非正值回落到 1 |
largeStep | number | step * 10 | 页面上调/页下和Shift+箭头的增量 |
orientation | "horizontal" | "vertical" | "horizontal" | 滑动取向 |
thumbAlignment | "center" | "edge" | "edge-client-only" | "center" | 缩略图放置在轨迹边缘 |
disabled | boolean | false | 禁用用户交互和输入设定的事件 |
onValueChange | (value: number | [number, number]) => void | undefined | 要求修改价值,包括方案更新;对初始化和不变值保持沉默 |
onValueCommit | (value: number | [number, number]) => void | undefined | 调用指针释放/取消, 键盘值变化后模糊, 或更改 slider:set 更新 |
主计长
| 方法/财产 | 说明 |
|---|---|
setValue(value: number | [number, number]) | 更新值, 包括禁用时的值 。 当值发生变化时, 释放会改变, 但不会释放承诺 . |
value | 当前值( 只读) number | [number, number](中文(简体) ) |
min | 解析最小值( 只读) number(中文(简体) ) |
max | 解析最大值( 只读) number(中文(简体) ) |
disabled | 是否禁用交互( 只读) boolean(中文(简体) ) |
destroy() | 删除听众并释放根绑定 |
活动
境外事件
听这些关于根元素的事件.
| 活动 | 细节 | 说明 |
|---|---|---|
slider:change | { value: number | [number, number] } | 值变化时起火 |
slider:commit | { value: number | [number, number] } | 在指针放出/取消时起火, 键盘值变化后模糊, 或者更改 slider:set 更新 |
入境事件
将这些事件传到根元件上.
| 活动 | 细节 | 说明 |
|---|---|---|
slider:set | { value: number | [number, number] } | 按方案设定值 |
// Listen for changes
root.addEventListener("slider:change", (e) => {
console.log("Value:", e.detail.value);
});
// Set value from outside
root.dispatchEvent(new CustomEvent("slider:set", {
detail: { value: 50 }
}));
// Set range value
root.dispatchEvent(new CustomEvent("slider:set", {
detail: { value: [25, 75] }
}));
说明: 禁用滑动器时被屏蔽 .
折旧形状
下列形状被去化并会在v1.0中去除:
// Deprecated: bare number
root.dispatchEvent(new CustomEvent("slider:set", {
detail: 50
}));
// Deprecated: bare array
root.dispatchEvent(new CustomEvent("slider:set", {
detail: [25, 75]
}));
使用 { value: ... } 换句话说.
样式
该组件为 CSS 勾通设置了数据属性和内置样式:
/* Root state */
[data-slot="slider"][data-orientation="horizontal"] { ... }
[data-slot="slider"][data-orientation="vertical"] { ... }
[data-slot="slider"][data-disabled] { ... }
[data-slot="slider"][data-dragging] { ... }
/* Parts mirror shared state for shadcn/Base-style selectors */
[data-slot="slider-track"][data-orientation="horizontal"] { ... }
[data-slot="slider-track"][data-orientation="vertical"] { ... }
[data-slot="slider-range"][data-orientation="horizontal"] { ... }
[data-slot="slider-range"][data-orientation="vertical"] { ... }
[data-slot="slider-track"][data-disabled] { ... }
[data-slot="slider-range"][data-disabled] { ... }
[data-slot="slider-thumb"][data-orientation="horizontal"] { ... }
[data-slot="slider-thumb"][data-orientation="vertical"] { ... }
[data-slot="slider-thumb"][data-disabled] { ... }
/* Thumb positioning (set automatically) */
[data-slot="slider-thumb"] {
position: absolute;
/* --position: X%; inset-inline-start/top or bottom/left are applied inline */
/* translate is applied inline to center the thumb on the resolved visual position */
}
/* Range thumbs expose their index */
[data-slot="slider-thumb"][data-index="0"] { ... }
[data-slot="slider-thumb"][data-index="1"] { ... }
/* Range positioning (set automatically) */
[data-slot="slider-range"] {
/* horizontal: relative + inset-inline-start/width */
/* vertical: absolute + bottom/height */
}
/* Thumb dragging state */
[data-slot="slider-thumb"][data-dragging] { ... }
slider-track, (中文(简体) ), slider-range,以及 slider-thumb 也获得基底式内线布局
样式来自控制器。 跑步时间拥有赛道 position: relative,则
范围的起始/大小定位,拇指的绝对位置/翻译,所以
作者只需要提供视觉风格, 除非他们有意想要覆盖
那个布局行为.
何时 thumbAlignment 实值 "edge" 或者说 "edge-client-only",运行时间衡量
将拇指放入可见的轨道。 在这些模式中,
--position 区域启动/ 大小 vars 代表已渲染的布局位置
超过原始价值百分比.
缩略图对齐
默认情况下,滑动拇指会以活性值为中心. 也就是说拇指可以
当值为 min 或者说 max。 。 。 .
使用 thumbAlignment 或者说 data-thumb-alignment 改变这种行为:
"center"- 默认。 拇指以数值为中心,可能会溢出轨迹边缘."edge"- 将拇指套入,使其边缘与轨迹边缘一致min财务报告和审定财务报表max。 。 。 ."edge-client-only"- 接受基本UI API均等。 在这个香草包里 它的表现和"edge"。 。 。 .
<div data-slot="slider" data-default-value="25" data-thumb-alignment="edge">
<div data-slot="slider-track">
<div data-slot="slider-range"></div>
</div>
<div data-slot="slider-thumb"></div>
</div>
createSlider(element, {
defaultValue: 25,
thumbAlignment: "edge",
});
键盘导航
| 密钥 | 行动 |
|---|---|
ArrowRight 编号 : ArrowLeft | 水平滑动器的增/减 |
ArrowUp 编号 : ArrowDown | 垂直滑动器的增减 |
PageUp | 增加次数 |
PageDown | 大量减少 |
Home | 设定到分钟 |
End | 设置为最大 |
Shift+Arrow | 以大步移动 |
无障碍
每个拇指元素都收到:
role="slider"tabindex="0"aria-valuemin编号 :aria-valuemax编号 :aria-valuenowaria-orientationaria-disabled(残疾时)aria-label(从)data-label或为范围自动生成)
slider-track, (中文(简体) ), slider-range,以及 slider-thumb 也镜像根的
data-orientation 财务报告和审定财务报表 data-disabled 装模作样. slider-control 可选;
当省去时,根会起到交互控制表面的作用.
许可证
麻省理工学院