ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Angular Material 滑块组件 mat-slider 完整实战指南:值选择、区间滑块、离散标签与无障碍设计

Angular Material 滑块组件 mat-slider 完整实战指南:值选择、区间滑块、离散标签与无障碍设计 Angular Material 滑块组件 mat-slider 完整实战指南值选择、区间滑块、离散标签与无障碍设计【免费下载链接】componentsComponent infrastructure and Material Design components for Angular项目地址: https://gitcode.com/GitHub_Trending/co/componentsmat-slider是 Angular Material 提供的值选择组件支持通过鼠标、触摸或键盘从指定范围中选取一个值行为与原生input typerange类似。本指南以 slider.md 为主线结合 slider.ts、slider-input.ts 等源码实现系统讲解单值滑块、范围滑块、离散数值标签、刻度线、键盘交互与无障碍配置帮助你在 Angular 应用中直接落地可复用的滑块方案。快速上手引入模块与基础用法在 Angular 应用中使用MatSlider需要从angular/material/slider导入MatSliderModule。组件采用宿主组件 投影输入的架构mat-slider负责整体样式与交互逻辑真正的值承载者是投影进内部的input带有matSliderThumb指令。完整的模块导入方式可参考官方示例代码 slider-overview-example.tsimport {Component} from angular/core; import {MatSliderModule} from angular/material/slider; Component({ selector: slider-overview-example, templateUrl: slider-overview-example.html, imports: [MatSliderModule], }) export class SliderOverviewExample {}mat-slider input matSliderThumb /mat-slider从源码看MatSlider组件slider.ts的 host 类名为mat-mdc-slider mdc-slider底层样式基于 Material Web ComponentsMDC模板结构包含轨道track、刻度线tick marks与可视滑块visual thumb三层见 slider.html而matSliderThumb指令将原生input typerange增强为滑块的逻辑引擎slider-input.ts。选择单个值min、max 与 step默认情况下滑块的最小值是0、最大值是100滑块按1的步长移动——这三个默认值分别定义在 slider.ts 中_min: number 0、_max: number 100、_step: number 1。通过min、max、step三个输入属性即可自定义mat-slider min1 max5 step0.5 input matSliderThumb value1.5 /mat-slider说明要点初始值除非显式指定否则初始值等于最小值。上例中通过value1.5显式设置了初始值。step 为小数当step0.5时滑块会在 1、1.5、2、2.5…… 5 之间吸附。源码中_fixValue通过Math.round(impreciseValue / step) * step完成数值修正slider-input.ts并为了保证百分比精度做了小数位数舍入处理。属性值钳制min/max/step使用numberAttribute变换非法值NaN会被忽略并保留原值slider.ts。除min/max/step外MatSlider还提供以下常用输入输入属性类型默认值说明minnumber0可选最小值maxnumber100可选最大值stepnumber1滑块吸附的步长discretebooleanfalse是否显示数值标签见下文showTickMarksbooleanfalse是否沿轨道显示刻度线displayWith(value: number) string字符串形式的值控制拇指标签显示的格式化函数disabledbooleanfalse是否禁用滑块禁用时会同步传递给所有 thumb 输入colorThemePaletteprimary主题色仅 M2 主题生效M3 下无效果disableRipplebooleanfalse是否禁用涟漪效果选择区间范围滑块 Range Slider将matSliderStartThumb和matSliderEndThumb同时投影进mat-slider即可将其转换为范围滑块两个拇指各有独立的值但都受滑块的min与max约束mat-slider input matSliderStartThumb input matSliderEndThumb /mat-slider约束规则matSliderStartThumb的值不能大于matSliderEndThumbmatSliderEndThumb的值不能小于matSliderStartThumb两个拇指的值可以相等。官方示例 slider-range-example.html 展示了带初始值的范围滑块mat-slider min200 max500 input value300 matSliderStartThumb input value400 matSliderEndThumb /mat-slider从源码看范围约束通过MatSliderRangeThumb的_updateMinMax()实现matSliderEndThumb的min被钳制为max(this._slider.min, sibling.value)matSliderStartThumb的max被钳制为min(this._slider.max, sibling.value)slider-input.ts从而保证两端拇指永远互不越界。拖动一侧拇指时另一侧拇指的可拖动范围会同步收窄视觉上两个拇指重叠时还会通过mdc-slider__thumb--top类名让当前激活的拇指显示在上层slider.ts。需要注意的是组件会在开发模式下校验拇指配置是否合法单值滑块必须使用matSliderThumb范围滑块必须成对使用matSliderStartThumbmatSliderEndThumb否则会抛出明确的配置错误提示slider.ts。显示当前值discrete 拇指标签默认情况下滑块不直接向用户展示当前选中值。添加discrete属性后拇指上会浮出数值气泡mat-slider discrete input matSliderThumb /mat-slider实现原理discrete为true时MatSlider会为可视拇指添加mdc-slider__thumb--with-indicator类名来显示数值指示器slider-thumb.ts同时把格式化后的文本分别写入startValueIndicatorText/endValueIndicatorTextslider.ts。数值指示器在拇指被悬停、聚焦或拖拽时显示此外当数值文本长度小于 3 个字符时如 5 或 50会额外添加mdc-slider__thumb--short-value类名以适配气泡宽度。格式化拇指标签displayWith默认情况下拇指标签显示的值与模型值一致但大数值可能放不进气泡。此时可以用displayWith输入自定义显示文本。官方示例 slider-formatting-example.ts 将 1000 以上的数值缩写为k单位export class SliderFormattingExample { formatLabel(value: number): string { if (value 1000) { return Math.round(value / 1000) k; } return ${value}; } }mat-slider min0 max100000 step1000 showTickMarks discrete [displayWith]formatLabel input matSliderThumb /mat-slider源码中displayWith的默认实现为(value: number) ${value}slider.ts传入函数后_updateValueIndicatorUI会调用this.displayWith(source.value)生成aria-valuetext与气泡文本slider.ts。因此displayWith不只改变视觉显示也会同步影响无障碍朗读的值文本非常适合配合大数值或单位换算场景。刻度线showTickMarks默认滑块不显示刻度线。添加showTickMarks属性后轨道上会渲染刻度点mat-slider showTickMarks input matSliderThumb /mat-slider刻度线的渲染逻辑slider.ts刻度数由min、max、step共同决定step为 0 或负数时按1处理单值滑块当前值之前的刻度标记为活跃mdc-slider__tick-mark--active之后的为非活跃范围滑块起始拇指之前为非活跃、两拇指之间为活跃、结束拇指之后为非活跃刻度线通过translateX按索引均分定位_calcTickMarkTransform宽度基于实际渲染宽度计算。值得注意的细节刻度线轨道宽度与实际可到达的最大值相关。例如[min: 5, max: 100, step: 10]的滑块由于步长吸附实际可到达的最大值是95而非100刻度轨道会按Math.floor(this.max / step) * step计算实际宽度slider.ts。键盘交互MatSlider内置完整的键盘操作支持具体绑定关系如下与 slider.md 的键盘表一致按键行为右箭头值增加一个步长RTL 环境下为递减上箭头值增加一个步长左箭头值减少一个步长RTL 环境下为递增下箭头值减少一个步长Page Up值增加最大值的 10%Page Down值减少最大值的 10%End设为最大值Home设为最小值这些按键行为由原生input typerange提供MatSlider通过监听input事件_onInput同步更新拇指位置、轨道填充与数值标签slider-input.ts。由于隐藏输入在 RTL 下自动翻转方向左右箭头的行为也随之反转。当滑块被聚焦时_onFocus动画会被临时禁用_setTransition(false)避免键盘连续操作时出现抖动slider-input.ts。表单集成与事件MatSliderThumb与MatSliderRangeThumb都实现了ControlValueAccessorslider-input.ts因此可以直接配合ngModel、FormControl或响应式表单使用。表单禁用状态会通过setDisabledState同步到滑块。每个拇指还暴露了三个事件valueChange值变化时发出新的number值dragStart/dragEnd开始/结束拖拽时发出MatSliderDragEvent其结构包含source被交互的拇指、parent所属滑块与value当前值定义在 slider-interface.ts。典型用法mat-slider input matSliderThumb (valueChange)onValueChange($event) (dragStart)onDragStart($event) (dragEnd)onDragEnd($event) /mat-slideronValueChange(value: number) { console.log(滑块值, value); } onDragStart(event: MatSliderDragEvent) { console.log(开始拖拽当前值, event.value); }拖拽期间组件会将指针事件监听器绑定在 NgZone 之外runOutsideAngular避免拖拽过程中反复触发变更检测带来性能损耗同时在 pointer up/down 时通过_handleValueCorrection修正值与 UI 之间的竞态误差slider-input.ts。无障碍AccessibilityMatSlider内部使用一个隐藏的input typerange提供无障碍体验具备以下特征可聚焦隐藏输入可接收焦点键盘用户可以直接 Tab 到滑块进行操作可标注支持通过aria-label或aria-labelledby为滑块提供可访问名称值播报aria-valuetext会随displayWith格式化的文本同步更新slider-input.ts屏幕阅读器可以朗读格式化后的值。此外文档明确给出了颜色对比度要求滑块活跃轨道与非活跃轨道与背景的对比度至少达到 3:1可以通过调整活跃/非活跃轨道颜色或显示与背景对比度不低于 3:1 的刻度线来满足该要求。这在浅色或深色主题下尤其重要——如果自定义了轨道颜色应使用对比度检查工具验证后再上线。小结mat-slider以MDC 样式 原生 range 输入的架构同时保证了视觉一致性、键盘可用性与表单集成能力。核心 API 可归纳为单值选择min/max/step/value范围选择matSliderStartThumbmatSliderEndThumb成对使用视觉增强discrete数值气泡、showTickMarks刻度线、displayWith标签格式化状态控制disabled、colorM2、disableRipple事件与表单valueChange/dragStart/dragEnd及完整的ControlValueAccessor支持。相关源码与示例可进一步参阅 slider.ts、slider-input.ts、slider-thumb.ts以及官方示例 slider-overview-example.ts、slider-range-example.html 与 slider-formatting-example.ts。【免费下载链接】componentsComponent infrastructure and Material Design components for Angular项目地址: https://gitcode.com/GitHub_Trending/co/components创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表