diff --git a/demo/Slider/SliderDemo.jsx b/demo/Slider/SliderDemo.jsx new file mode 100644 index 00000000..0e0bedcb --- /dev/null +++ b/demo/Slider/SliderDemo.jsx @@ -0,0 +1,68 @@ +import React from 'react'; +import Slider from 'salt-slider'; +import './SliderDemo.styl' + +export default class App extends React.Component { + log = (name) => { + return (value) => { + console.log(`${name}: ${value}`); + }; + } + + render() { + return ( +
+

基本滑块

+ +

滑块-禁用

+ +

滑块-带刻度

+ +

滑块-自定义颜色

+ +
+ ) + } +} diff --git a/demo/Slider/SliderDemo.styl b/demo/Slider/SliderDemo.styl new file mode 100644 index 00000000..80e39ed2 --- /dev/null +++ b/demo/Slider/SliderDemo.styl @@ -0,0 +1,15 @@ +@require '../../dev/demo' +@require '../../src/Slider/Slider' + +.slider-demo-wrapper { + margin-bottom: 15px; + margin-left: 30px; + margin-right: 30px; +} + +.sub-title { + color: #888; + font-size: 14px; + padding: 30px 0 18px 0; + margin-left: 10px; +} diff --git a/demo/Slider/index.js b/demo/Slider/index.js new file mode 100644 index 00000000..3469e842 --- /dev/null +++ b/demo/Slider/index.js @@ -0,0 +1,11 @@ +import 'salt-context'; + +import Demo from './SliderDemo'; +import './SliderDemo.styl'; + +// 渲染 demo +if (window.FastClick) { + window.FastClick.attach(document.body); +} + +export default Demo; diff --git a/dev/demo.styl b/dev/demo.styl index 11445d17..ea88f615 100644 --- a/dev/demo.styl +++ b/dev/demo.styl @@ -1 +1 @@ -@require '/../style/theme/green/saltui'; \ No newline at end of file +@require '/../style/theme/salt-ui/saltui'; diff --git a/docs/Slider.md b/docs/Slider.md new file mode 100644 index 00000000..61c1e2b1 --- /dev/null +++ b/docs/Slider.md @@ -0,0 +1,24 @@ +## 滑动条 + +左边为最小值,右边为最大值。 + +## Props 定义 +所有 Props 都是可选的 + +配置项 | 类型 | 默认值 | 说明 +----|-----|------|------ +| min | number | 0 | 最小值 | +| max | number | 100 | 最大值 | +| step | number or null | 1 | 步长,取值必须大于 0,并且可被 (max - min) 整除。当 `marks` 不为空对象时,可以设置 `step` 为 `null`,此时 Slider 的可选值仅有 marks 标出来的部分。 | +| value | number | | 设置当前取值。 | +| defaultValue | number | 0 | 设置初始取值。| +| disabled | boolean | false | 值为 `true` 时,滑块为禁用状态 | +| onChange | function | noop | 当 Slider 的值发生改变时,会触发 onChange 事件,并把改变后的值作为参数传入。 | +| onAfterChange | function | noop | 与 `ontouchend` 触发时机一致,把当前值作为参数传入。 | +| marks | object{number: string} | { } | 刻度标记,key 的类型必须为 `number` 且取值在闭区间 [min, max] 内 | +| dots | boolean | false | 是否只能拖拽到刻度上 | +| included | boolean | true | `marks` 不为空对象时有效,值为 true 时表示值为包含关系,false 表示并列 | +| handleStyle | object | | 滑块的样式 | +| trackStyle | object | | 选中部分滑动条的样式 | +| railStyle | object | | 未选中部分 | +| className | string | salt-ui-slider | 自定义的 class 名称| diff --git a/package.json b/package.json index 27299215..941f33e7 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "rc-dialog": "^6.5.11", "rc-drawer": "^0.4.9", "rc-input-number": "^3.6.8", + "rc-slider": "^8.6.3", "rc-tabs": "^8.0.0", "rc-tooltip": "^3.5.0", "rc-util": "^4.5.1", @@ -87,4 +88,4 @@ "uploadcore": "^2.3.1", "uxcore-formatter": "^0.1.6" } -} \ No newline at end of file +} diff --git a/src/Slider/Slider.jsx b/src/Slider/Slider.jsx new file mode 100644 index 00000000..f673eb1c --- /dev/null +++ b/src/Slider/Slider.jsx @@ -0,0 +1,43 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import RcSlider from 'rc-slider/lib/Slider'; +import './Slider' +import Context from '../Context'; + +export default class Slider extends React.Component { + static defaultProps = { + className: 'salt-ui-slider', + }; + + render() { + return ( +
+ +
+ ); + } +} + +Slider.propTypes = { + value: PropTypes.number, + min: PropTypes.number, + max: PropTypes.number, + step: PropTypes.number, + onChange: PropTypes.func, + onAfterChange: PropTypes.func, + defaultValue: PropTypes.number, + tipFormatter: PropTypes.func, + disabled: PropTypes.boolean, + handle: PropTypes.any, + className: PropTypes.string, + marks: PropTypes.object, + dots: PropTypes.boolean, + included: PropTypes.boolean, + handleStyle: React.CSSProperties, + trackStyle: React.CSSProperties, + railStyle: React.CSSProperties, +} diff --git a/src/Slider/Slider.styl b/src/Slider/Slider.styl new file mode 100644 index 00000000..cb30c602 --- /dev/null +++ b/src/Slider/Slider.styl @@ -0,0 +1,109 @@ + + +$sliderPrefixCls = 't-slider'; +$gray = #ddd; + +.{$sliderPrefixCls} { + position: relative; + + &-rail { + position: absolute; + width: 100%; + background-color: $gray; + height: 2px; + box-sizing: border-box; + } + + &-track { + position: absolute; + left: 0; + height: 2px; + border-radius: 2px; + background-color: $brand-primary; + } + + &-handle { + position: absolute; + margin-left: -12px; + margin-top: -10px; + width: 22px; + height: 22px; + cursor: pointer; + border-radius: 50%; + border: 2px solid $brand-primary; + background-color: #fff; + box-sizing: border-box; + + &:focus { + background-color: tint($brand-primary, 20%); + } + } + + &-mark { + position: absolute; + top: 20px; + left: 0; + width: 100%; + font-size: 12px; + } + + &-mark-text { + position: absolute; + display: inline-block; + vertical-align: middle; + text-align: center; + cursor: pointer; + color: #000; + + &-active { + opacity: .3; + } + } + + &-step { + position: absolute; + width: 100%; + height: 4px; + background: transparent; + } + + &-dot { + position: absolute; + bottom: -5px; + margin-left: -4px; + width: 12px; + height: 12px; + border: 2px solid $gray; + background-color: #fff; + cursor: pointer; + border-radius: 50%; + vertical-align: middle; + + &:first-child { + margin-left: -4px; + } + + &:last-child { + margin-left: -4px; + } + + &-active { + border-color: $brand-primary; + } + } + + &-disabled { + opacity: .3; + + .{$sliderPrefixCls}-track { + height: 2px; + } + + .{$sliderPrefixCls}-handle, + .{$sliderPrefixCls}-mark-text, + .{$sliderPrefixCls}-dot { + cursor: not-allowed; + box-shadow: none; + } + } +} diff --git a/src/Slider/index.js b/src/Slider/index.js new file mode 100644 index 00000000..12b099f9 --- /dev/null +++ b/src/Slider/index.js @@ -0,0 +1 @@ +export default from './Slider';