Slider 滑动输入条
定义/Definition
滑块允许用户在一个限定范围内调整某个数值或进程。规则 / Rule
由一条水平的轨迹和一个Thumb(滑块中支持用户水平拖拽的圆形控件)组成;
左边和右边支持使用自定义图片来表述相对的最小值与最大值的含义;
填充轨道左边缘最小值之间到Thumb之间的部分;
定义Thumb的外观,让用户一看就知道滑块当前的状态。
代码演示
基本滑动条。当range 为 true 时,渲染为双滑块。当 disabled 为 true 时,滑块处于不可用状态。
当 Slider 的值发生改变时,会触发
import { Slider, WingBlank, WhiteSpace } from 'antd-mobile';let App = React.createClass({render() {return (<div className="am-slider-example"><WhiteSpace size={32} /><WingBlank size={20}><p className="title">单模块</p><Slider defaultValue={26} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><p className="title">双模块</p><WhiteSpace /><Slider range defaultValue={[20, 50]} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><p className="title">不可用状态</p><Slider range defaultValue={[20, 50]} disabled /></WingBlank><WhiteSpace size={32} /></div>);},});ReactDOM.render(<App />, mountNode);
onChange 事件,并把改变后的值作为参数传入。在 touchend 时,会触发 onAfterChange 事件,并把当前值作为参数传入。
使用
import { Slider, WingBlank, WhiteSpace } from 'antd-mobile';function log(value) {console.log(value);}let App = React.createClass({render() {return (<div><WhiteSpace size={32} /><WingBlank size={20}><Slider defaultValue={30} onChange={log} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><Slider range step={10} defaultValue={[20, 50]} onChange={log} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><Slider defaultValue={30} onAfterChange={log} /></WingBlank><WhiteSpace size={32} /></div>);},});ReactDOM.render(<App />, mountNode);
marks 属性标注分段式滑块,使用 value / defaultValue 指定滑块位置。当 included=false 时,表明不同标记间为并列关系。当 step=null 时,Slider 的可选值仅有 marks 标出来的部分。
滑块左右可以设置图标来表达业务含义。
import { Slider, WingBlank, WhiteSpace } from 'antd-mobile';const marks = {0: '0°C',26: '26°C',37: '37°C',100: {style: {color: 'red',},label: <strong>100°C</strong>,},};let App = React.createClass({render() {return (<div className="am-slider-example"><WhiteSpace size={32} /><WingBlank size={20}><p className="title">包含关系</p><Slider marks={marks} defaultValue={37} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><Slider range marks={marks} defaultValue={[26, 37]} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><p className="title">并列关系</p><Slider marks={marks} included={false} defaultValue={37} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><p className="title">结合 step</p><Slider marks={marks} step={10} defaultValue={37} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><p>`step=null`</p><Slider marks={marks} step={null} defaultValue={37} /></WingBlank><WhiteSpace size={32} /></div>);},});ReactDOM.render(<App />, mountNode);
import { Slider, WhiteSpace, WingBlank } from 'antd-mobile';import Icon from '../../icon';const IconSlider = React.createClass({getInitialState() {const max = this.props.max;const min = this.props.min;const mid = ((max - min) / 2).toFixed(5);return {preIconClass: this.props.value >= mid ? '' : 'anticon-highlight',nextIconClass: this.props.value >= mid ? 'anticon-highlight' : '',mid,sliderValue: this.props.value,};},handleChange(v) {this.setState({preIconClass: v >= this.state.mid ? '' : 'anticon-highlight',nextIconClass: v >= this.state.mid ? 'anticon-highlight' : '',sliderValue: v,});},render() {return (<div><WhiteSpace size={20} /><WingBlank size={20}><div className="iconWrapper"><Icon className={this.state.preIconClass} type={this.props.icon[0]} /><Slider {...this.props} onChange={this.handleChange} value={this.state.sliderValue} /><Icon className={this.state.nextIconClass} type={this.props.icon[1]} /></div></WingBlank><WhiteSpace size={32} /></div>);},});ReactDOM.render(<IconSlider min={0} max={20} value={0} icon={['frown', 'smile']} />, mountNode);
使用
.iconWrapper {position: relative;padding: 0px 48px;}.iconWrapper .anticon {position: absolute;top: -11px;width: 24px;height: 24px;line-height: 1;font-size: 24px;color: #ccc;}.iconWrapper .anticon:first-child {left: 0;}.iconWrapper .anticon:last-child {right: 0;}.anticon.anticon-highlight {color: #666;}
tipFormatter 可以格式化 Tooltip 的内容,设置 tipFormatter={null},则隐藏 Tooltip。
import { Slider, WhiteSpace, WingBlank } from 'antd-mobile';function formatter(value) {return `${value}%`;}let App = React.createClass({render() {return (<div className="am-slider-example"><WhiteSpace size={32} /><WingBlank size={20}><p className="title">格式化Tooltip</p><Slider tipFormatter={formatter} /></WingBlank><WhiteSpace size={32} /><WingBlank size={20}><p className="title">隐藏Tooltip</p><Slider tipFormatter={null} /></WingBlank><WhiteSpace size={32} /></div>);},});ReactDOM.render(<App />, mountNode);

API
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
range web | Boolean | false | 双滑块模式 |
| min | Number | 0 | 最小值 |
| max | Number | 100 | 最大值 |
marks web | Object{Number:String} | { } | 刻度标记,key 的类型必须为 Number 且取值在闭区间 [min, max] 内 |
| step | Number or null | 1 | 步长,取值必须大于 0,并且可被 (max - min) 整除。当 marks 不为空对象时,可以设置 step 为 null,此时 Slider 的可选值仅有 marks 标出来的部分。 |
dots web | Boolean | false | 是否只能拖拽到刻度上 |
| value | Number or [number, number] | 设置当前取值。当 range 为 false 时,使用 Number,否则用 [Number, Number] | |
| defaultValue | Number or [number, number] | 0 or [0, 0] | 设置初始取值。当 range 为 false 时,使用 Number,否则用 [Number, Number] |
included web | Boolean | true | marks 不为空对象时有效,值为 true 时表示值为包含关系,false 表示并列 |
| disabled | Boolean | false | 值为 true 时,滑块为禁用状态 |
| onChange | Function | Noop | 当 Slider 的值发生改变时,会触发 onChange 事件,并把改变后的值作为参数传入。 |
| onAfterChange | Function | Noop | 与 ontouchend 触发时机一致,把当前值作为参数传入。 |
tipFormatter web | Function or null | IDENTITY | Slider 会把当前值传给 tipFormatter,并在 Tooltip 中显示 tipFormatter 的返回值,若为 null,则隐藏 Tooltip。 |