RangePicker

日期范围选择器,双面板(两个月并排,右面板=左面板+1)序列选择(点起始→点结束,自动排序、起止可跨面板、hover 跨面板预览区间),受控/非受控;显示与星期/月份均经 Intl.DateTimeFormat 本地化。type=dateTimeRange 时在双日期面板右侧各挂一组时/分/秒时间列(复用 DatePicker dateTime 列逻辑),起止各自携带时分秒;needConfirm(dateTimeRange 默认 true)时选择进 pending 缓冲,点确定才提交。支持 showSecond/disabledTime/disabledTimePicker/hideDisabledOptions(语义与 DatePicker dateTime 一致)。type=monthRange(对齐 Semi)时改用双「月份」面板(各 12 个月格,头部年份 + 左右切年、左右面板相邻两年)选起止月,value=[起始月, 结束月](Date 落在该月 1 号),区间高亮/hover 预览按月粒度;不含时间列,maxRange 不适用。

设计文档

如何引入

import { RangePicker } from '@chenzy-design/svelte';

基础用法

支持日期、日期时间、月份、年份类型,含范围选择、快捷预设、禁用时间。

日期:(未选)
日期时间:(未选)
月份:(未选)
年份:(未选)
禁用时间:上午 0-11 时不可选
快捷:(未选)
范围(双面板,两个月并排):(未选)
自定义 format(可手输 YYYY-MM-DD):(未选)
maxRange=7(最多 7 天跨度):(未选)

基础日期选择

单日期选择与范围选择器的基础用法。

日期:(未选)
范围:(未选)

日期类型

type 切换日期时间、月份、年份选择。

日期时间:(未选)
月份:(未选)
年份:(未选)

范围选择

RangePicker 配合 disabledDate 与 maxRange 限制可选区间。

禁用过去日期:(未选)
maxRange=7(最多 7 天跨度):(未选)

禁用日期与快捷预设

disabledDate 禁用周末,presets/presetPosition 提供快捷选项。

禁用周末:(未选)
快捷预设(左侧):(未选)

自定义格式与外观

format 自定义解析格式,size/status/disabled 控制外观状态。

自定义 format(可手动键入):(未选)
size="small"
size="large"
status="error"
disabled

带时间范围选择

RangePicker type=dateTimeRange 双面板 + 起止时/分/秒列 + 确认提交,支持 showSecond、disabledTime。

带时间范围(选完点「确定」提交):(未选)
隐藏秒列 + disabledTime 禁用凌晨:(未选)

月份范围选择

RangePicker type=monthRange 双月份面板(头部年份 + 左右切年)选起止月,value 为 [起始月, 结束月]。

月份范围(双月份面板选起止月):(未选)
带默认值 2024-03 ~ 2024-07

面板内嵌输入

insetInput 在面板顶部渲染可编辑输入框(date 日期框;dateTime 日期框+时间框),键盘可直接键入,与面板选择双向同步。

insetInput:面板顶部渲染可编辑日期框,可直接键入 YYYY-MM-DD(Enter 提交),与日历双向同步。
type="dateTime" + insetInput:日期框 + 时间框,键入 HH:mm:ss 或点时间列均可,两者互相同步。

年月滚轮快速跳转

点头部年月标题展开年 + 月滚轮列(复用 ScrollList),快速跳转任意年月;yearAndMonthOpts 控制循环滚动。

点击面板头部的「年月」标题,展开年 + 月滚轮列,快速跳转到任意年月,再选具体日期。
已选:(未选)
yearAndMonthOpts 开启循环滚动(年列 + 月列首尾相接)。
已选:(未选)

多选日期

multiple 多选(仅 type=date),value 为 Date[],max 限制数量。

已选 0 个日期(上限 3)

时区显示

timeZone 按 IANA 时区显示同一时刻(格式化层注入,底层绝对时刻不变)。

纽约时区显示
东京时区显示(同一时刻)

确认选择

needConfirm 使 dateTime 需点击确认才写入值,配合 onConfirm 回调。

确认值:(未确认)

面板插槽与自定义日期

topSlot/bottomSlot 面板额外区域,renderDate 自定义日期单元格内容。

每月 1 号带小圆点

自定义触发器

triggerRender 完全自定义触发器外观。

未选

范围快捷区间

RangePicker presets 提供最近 7 天等快捷区间,presetPosition 控制位置。

(未选)

周选择

RangePicker startDateOffset/endDateOffset 单击任意日期即选中整周。

单击任意日期即选中整周:(未选)

API 参考

RangePicker

Props

属性说明类型默认值
typedateRange 纯日期范围 / dateTimeRange 带时间范围(每端时/分/秒列 + 确认)/ monthRange 月份范围(双月份面板选起止月)'dateRange'|'dateTimeRange'|'monthRange''dateRange'
value[Date|null, Date|null] | nullundefined
defaultValue[Date|null, Date|null] | nullnull
openbooleanundefined
defaultOpenbooleanfalse
startPlaceholderstring'开始日期'
endPlaceholderstring'结束日期'
size'small'|'default'|'large''default'
status'default'|'warning'|'error''default'
disabledbooleanfalse
clearablebooleantrue
disabledDate(date: Date) => booleanundefined
disabledTimedateTimeRange:按日期返回各时间列禁用值(分/秒列联动已选时/分)(date: Date) => { disabledHours?: () => number[]; disabledMinutes?: (hour: number) => number[]; disabledSeconds?: (hour: number, minute: number) => number[] }undefined
showSeconddateTimeRange:是否显示秒列booleantrue
hideDisabledOptionsdateTimeRange:隐藏被禁用的时间选项(默认仅置灰)booleanfalse
disabledTimePickerdateTimeRange:禁止时间列(只保留日期面板 + 确认)booleanfalse
needConfirm需点击确认才提交(dateTimeRange 默认 true,dateRange 默认 false)booleanundefined
maxRangenumberundefined
startDateOffset单击范围选择:与 endDateOffset 同时提供后,单击某日即选定 [startDateOffset(clicked), endDateOffset(clicked)](如周选择),一步完成不进两步;仅 dateRange/dateTimeRange 生效(date: Date) => Dateundefined
endDateOffset单击范围选择的结束偏移;与 startDateOffset 同时提供才生效(date: Date) => Dateundefined
weekStart0 | 10
localestring'zh-CN'
presets快捷区间列表:点击直接选定整段 [start, end](惰性 value 即时求值、自动排序);needConfirm 时进 pending 缓冲否则直接提交并关面板;monthRange 时 value 落每月 1 号{ label: string; value: [Date, Date] | (() => [Date, Date]) }[]undefined
presetPosition快捷区间列表位置(left/right 竖排并列于面板侧,top/bottom 横排于面板上/下)'left' | 'right' | 'top' | 'bottom''bottom'
onChange(v: [Date|null,Date|null] | null) => voidundefined
onOpenChange(open: boolean) => voidundefined
onPanelChange(e: { panelDate: Date }) => voidundefined
onClear(e: {}) => voidundefined
onPresetClick点击快捷区间选项(e: { preset: { label: string; value: [Date, Date] | (() => [Date, Date]) } }) => voidundefined
onConfirm点击确认按钮(needConfirm)(e: { value: [Date|null,Date|null] | null }) => voidundefined
onCancel点击取消按钮(needConfirm)(e: { value: [Date|null,Date|null] | null }) => voidundefined
onFocus(e: FocusEvent) => voidundefined
onBlur(e: FocusEvent) => voidundefined
ariaLabelstringundefined
position浮层弹出位置string'bottomLeft'
autoAdjustOverflow浮层自动调整位置防溢出booleantrue
spacing触发器与浮层间距(px)numberundefined
getPopupContainer浮层挂载容器() => HTMLElementundefined
dropdownMargin浮层相对触发器的额外偏移number | { x?: number; y?: number }undefined
class根节点自定义类名(对齐 Semi className)string''
style根节点内联样式stringundefined

Methods

属性类型说明
open()命令式展开面板(对齐 Semi)
close()命令式关闭面板(对齐 Semi)
focus(focusType?: 'rangeStart'|'rangeEnd')命令式聚焦触发器(单触发器结构下 focusType 退化为聚焦整体,签名对齐 Semi)
blur()命令式移除触发器焦点(对齐 Semi)

Accessibility

ARIA roledialog
  • 触发器 button aria-haspopup=dialog、aria-expanded、aria-controls 指向面板
  • 面板 role=dialog;左右各一 role=grid(aria-label 为各自月份),单元格 role=gridcell + aria-selected(端点)
  • 双面板并排显示相邻两月:最左「上一月」、最右「下一月」整体翻页;第一次点击设起始、第二次设结束并自动排序,起止可跨面板;hover 跨面板实时预览区间
  • maxRange:选定起始后,离起点超过 maxRange 天的日期 aria-disabled 置灰、点击/hover 无效(daysBetween 纯函数判定)
  • startDateOffset/endDateOffset(单击范围选择,如周选择):两者都提供时单击某日即选定整个区间 [startDateOffset(clicked), endDateOffset(clicked)],不进「点起始→点结束」两步;悬停整段预览高亮;仅 dateRange/dateTimeRange 生效
  • 触发器 Enter/Space/↓ 打开、Esc 关闭
  • type=dateTimeRange:面板右侧挂起/止两组时/分/秒列 role=listbox + option;时间列作用于当前激活端 activeEnd(选起始日/点左侧列=start,选结束日/点右侧列=end),激活端有 --active 底色标示
  • dateTimeRange 默认 needConfirm=true:选择进 pending 缓冲,footer「确定」提交、「取消」回退并关闭
  • disabledTime:dateTimeRange 时/分/秒列被禁用值 aria-disabled、点击/键盘无效(分/秒列联动激活端已选时/分)
  • type=monthRange:左右各一 role=grid 的 12 月格(3 列大格),头部显示年份 + 左右按钮切年(左右面板相邻两年);点起始月→点结束月自动排序、起止可跨面板、hover 跨面板预览区间;单元格 role=gridcell + aria-selected(端点)。选完即提交 onChange(无确认、无时间列)

设计变量

变量默认值用法
--cd-transition-date-picker-range-input background-color .16s ease-in-out