Slider 滑动输入条

定义/Definition

滑块允许用户在一个限定范围内调整某个数值或进程。

规则 / Rule

  • 由一条水平的轨迹和一个Thumb(滑块中支持用户水平拖拽的圆形控件)组成;

  • 左边和右边支持使用自定义图片来表述相对的最小值与最大值的含义;

  • 填充轨道左边缘最小值之间到Thumb之间的部分;

  • 定义Thumb的外观,让用户一看就知道滑块当前的状态。

代码演示

基本

基本滑动条。当 rangetrue 时,渲染为双滑块。当 disabledtrue 时,滑块处于不可用状态。

  1. import { Slider, WingBlank, WhiteSpace } from 'antd-mobile';
  2. let App = React.createClass({
  3. render() {
  4. return (
  5. <div className="am-slider-example">
  6. <WhiteSpace size={32} />
  7. <WingBlank size={20}>
  8. <p className="title">单模块</p>
  9. <Slider defaultValue={26} />
  10. </WingBlank>
  11. <WhiteSpace size={32} />
  12. <WingBlank size={20}>
  13. <p className="title">双模块</p>
  14. <WhiteSpace />
  15. <Slider range defaultValue={[20, 50]} />
  16. </WingBlank>
  17. <WhiteSpace size={32} />
  18. <WingBlank size={20}>
  19. <p className="title">不可用状态</p>
  20. <Slider range defaultValue={[20, 50]} disabled />
  21. </WingBlank>
  22. <WhiteSpace size={32} />
  23. </div>
  24. );
  25. },
  26. });
  27. ReactDOM.render(<App />, mountNode);

事件

当 Slider 的值发生改变时,会触发 onChange 事件,并把改变后的值作为参数传入。在 touchend 时,会触发 onAfterChange 事件,并把当前值作为参数传入。

  1. import { Slider, WingBlank, WhiteSpace } from 'antd-mobile';
  2. function log(value) {
  3. console.log(value);
  4. }
  5. let App = React.createClass({
  6. render() {
  7. return (
  8. <div>
  9. <WhiteSpace size={32} />
  10. <WingBlank size={20}>
  11. <Slider defaultValue={30} onChange={log} />
  12. </WingBlank>
  13. <WhiteSpace size={32} />
  14. <WingBlank size={20}>
  15. <Slider range step={10} defaultValue={[20, 50]} onChange={log} />
  16. </WingBlank>
  17. <WhiteSpace size={32} />
  18. <WingBlank size={20}>
  19. <Slider defaultValue={30} onAfterChange={log} />
  20. </WingBlank>
  21. <WhiteSpace size={32} />
  22. </div>
  23. );
  24. },
  25. });
  26. ReactDOM.render(<App />, mountNode);

分段式滑块

使用 marks 属性标注分段式滑块,使用 value / defaultValue 指定滑块位置。当 included=false 时,表明不同标记间为并列关系。当 step=null 时,Slider 的可选值仅有 marks 标出来的部分。

  1. import { Slider, WingBlank, WhiteSpace } from 'antd-mobile';
  2. const marks = {
  3. 0: '0°C',
  4. 26: '26°C',
  5. 37: '37°C',
  6. 100: {
  7. style: {
  8. color: 'red',
  9. },
  10. label: <strong>100°C</strong>,
  11. },
  12. };
  13. let App = React.createClass({
  14. render() {
  15. return (
  16. <div className="am-slider-example">
  17. <WhiteSpace size={32} />
  18. <WingBlank size={20}>
  19. <p className="title">包含关系</p>
  20. <Slider marks={marks} defaultValue={37} />
  21. </WingBlank>
  22. <WhiteSpace size={32} />
  23. <WingBlank size={20}>
  24. <Slider range marks={marks} defaultValue={[26, 37]} />
  25. </WingBlank>
  26. <WhiteSpace size={32} />
  27. <WingBlank size={20}>
  28. <p className="title">并列关系</p>
  29. <Slider marks={marks} included={false} defaultValue={37} />
  30. </WingBlank>
  31. <WhiteSpace size={32} />
  32. <WingBlank size={20}>
  33. <p className="title">结合 step</p>
  34. <Slider marks={marks} step={10} defaultValue={37} />
  35. </WingBlank>
  36. <WhiteSpace size={32} />
  37. <WingBlank size={20}>
  38. <p>`step=null`</p>
  39. <Slider marks={marks} step={null} defaultValue={37} />
  40. </WingBlank>
  41. <WhiteSpace size={32} />
  42. </div>
  43. );
  44. },
  45. });
  46. ReactDOM.render(<App />, mountNode);

带 icon 的滑块

滑块左右可以设置图标来表达业务含义。

  1. import { Slider, WhiteSpace, WingBlank } from 'antd-mobile';
  2. import Icon from '../../icon';
  3. const IconSlider = React.createClass({
  4. getInitialState() {
  5. const max = this.props.max;
  6. const min = this.props.min;
  7. const mid = ((max - min) / 2).toFixed(5);
  8. return {
  9. preIconClass: this.props.value >= mid ? '' : 'anticon-highlight',
  10. nextIconClass: this.props.value >= mid ? 'anticon-highlight' : '',
  11. mid,
  12. sliderValue: this.props.value,
  13. };
  14. },
  15. handleChange(v) {
  16. this.setState({
  17. preIconClass: v >= this.state.mid ? '' : 'anticon-highlight',
  18. nextIconClass: v >= this.state.mid ? 'anticon-highlight' : '',
  19. sliderValue: v,
  20. });
  21. },
  22. render() {
  23. return (
  24. <div>
  25. <WhiteSpace size={20} />
  26. <WingBlank size={20}>
  27. <div className="iconWrapper">
  28. <Icon className={this.state.preIconClass} type={this.props.icon[0]} />
  29. <Slider {...this.props} onChange={this.handleChange} value={this.state.sliderValue} />
  30. <Icon className={this.state.nextIconClass} type={this.props.icon[1]} />
  31. </div>
  32. </WingBlank>
  33. <WhiteSpace size={32} />
  34. </div>
  35. );
  36. },
  37. });
  38. ReactDOM.render(
  39. <IconSlider min={0} max={20} value={0} icon={['frown', 'smile']} />
  40. , mountNode);
  1. .iconWrapper {
  2. position: relative;
  3. padding: 0px 48px;
  4. }
  5. .iconWrapper .anticon {
  6. position: absolute;
  7. top: -11px;
  8. width: 24px;
  9. height: 24px;
  10. line-height: 1;
  11. font-size: 24px;
  12. color: #ccc;
  13. }
  14. .iconWrapper .anticon:first-child {
  15. left: 0;
  16. }
  17. .iconWrapper .anticon:last-child {
  18. right: 0;
  19. }
  20. .anticon.anticon-highlight {
  21. color: #666;
  22. }

自定义提示

使用 tipFormatter 可以格式化 Tooltip 的内容,设置 tipFormatter={null},则隐藏 Tooltip

  1. import { Slider, WhiteSpace, WingBlank } from 'antd-mobile';
  2. function formatter(value) {
  3. return `${value}%`;
  4. }
  5. let App = React.createClass({
  6. render() {
  7. return (
  8. <div className="am-slider-example">
  9. <WhiteSpace size={32} />
  10. <WingBlank size={20}>
  11. <p className="title">格式化Tooltip</p>
  12. <Slider tipFormatter={formatter} />
  13. </WingBlank>
  14. <WhiteSpace size={32} />
  15. <WingBlank size={20}>
  16. <p className="title">隐藏Tooltip</p>
  17. <Slider tipFormatter={null} />
  18. </WingBlank>
  19. <WhiteSpace size={32} />
  20. </div>
  21. );
  22. },
  23. });
  24. ReactDOM.render(<App />, mountNode);

Slider滑动输入条 - 图1

API

参数类型默认值说明
range webBooleanfalse双滑块模式
minNumber0最小值
maxNumber100最大值
marks webObject{Number:String}{ }刻度标记,key 的类型必须为 Number 且取值在闭区间 [min, max]
stepNumber or null1步长,取值必须大于 0,并且可被 (max - min) 整除。当 marks 不为空对象时,可以设置 stepnull,此时 Slider 的可选值仅有 marks 标出来的部分。
dots webBooleanfalse是否只能拖拽到刻度上
valueNumber or [number, number]设置当前取值。当 rangefalse 时,使用 Number,否则用 [Number, Number]
defaultValueNumber or [number, number]0 or [0, 0]设置初始取值。当 rangefalse 时,使用 Number,否则用 [Number, Number]
included webBooleantruemarks 不为空对象时有效,值为 true 时表示值为包含关系,false 表示并列
disabledBooleanfalse值为 true 时,滑块为禁用状态
onChangeFunctionNoop当 Slider 的值发生改变时,会触发 onChange 事件,并把改变后的值作为参数传入。
onAfterChangeFunctionNoopontouchend 触发时机一致,把当前值作为参数传入。
tipFormatter webFunction or nullIDENTITYSlider 会把当前值传给 tipFormatter,并在 Tooltip 中显示 tipFormatter 的返回值,若为 null,则隐藏 Tooltip。