From 1f6cafebb101972401cd04933c56c8ebdc2fc279 Mon Sep 17 00:00:00 2001 From: Furybean Date: Mon, 21 Nov 2016 15:11:29 +0800 Subject: [PATCH] Slider: fix can not drag when step < 1 --- packages/slider/src/main.vue | 30 ++++++++++++++++++------------ test/unit/specs/slider.spec.js | 24 ++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/packages/slider/src/main.vue b/packages/slider/src/main.vue index 3e34a9268..6b1415e29 100644 --- a/packages/slider/src/main.vue +++ b/packages/slider/src/main.vue @@ -84,6 +84,7 @@ data() { return { + precision: null, inputValue: null, timeout: null, hovering: false, @@ -136,9 +137,13 @@ setPosition(newPos) { if (newPos >= 0 && (newPos <= 100)) { - var lengthPerStep = 100 / ((this.max - this.min) / this.step); - var steps = Math.round(newPos / lengthPerStep); - this.$emit('input', Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min)); + const lengthPerStep = 100 / ((this.max - this.min) / this.step); + const steps = Math.round(newPos / lengthPerStep); + let value = steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min; + if (this.precision) { + value = parseFloat(value.toFixed(this.precision)); + } + this.$emit('input', value); this.currentPosition = (this.value - this.min) / (this.max - this.min) * 100 + '%'; if (!this.dragging) { if (this.value !== this.oldValue) { @@ -151,10 +156,8 @@ onSliderClick(event) { if (this.disabled) return; - var currentX = event.clientX; - var sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().left; - var newPos = (currentX - sliderOffsetLeft) / this.$sliderWidth * 100; - this.setPosition(newPos); + const sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().left; + this.setPosition((event.clientX - sliderOffsetLeft) / this.$sliderWidth * 100); }, onInputChange() { @@ -176,7 +179,7 @@ if (this.dragging) { this.$refs.tooltip.showPopper = true; this.currentX = event.clientX; - var diff = (this.currentX - this.startX) / this.$sliderWidth * 100; + const diff = (this.currentX - this.startX) / this.$sliderWidth * 100; this.newPos = this.startPos + diff; this.setPosition(this.newPos); } @@ -206,10 +209,10 @@ }, stops() { - let stopCount = (this.max - this.value) / this.step; - let result = []; - let currentLeft = parseFloat(this.currentPosition); - let stepWidth = 100 * this.step / (this.max - this.min); + const stopCount = (this.max - this.value) / this.step; + const currentLeft = parseFloat(this.currentPosition); + const stepWidth = 100 * this.step / (this.max - this.min); + const result = []; for (let i = 1; i < stopCount; i++) { result.push(currentLeft + i * stepWidth); } @@ -223,6 +226,9 @@ } else if (this.value > this.max) { this.$emit('input', this.max); } + if (this.step && this.step < 1) { + this.precision = this.step.toPrecision(1).split('.')[1].length; + } this.inputValue = this.inputValue || this.value; } }; diff --git a/test/unit/specs/slider.spec.js b/test/unit/specs/slider.spec.js index a0f7acf27..fe6eb93ef 100644 --- a/test/unit/specs/slider.spec.js +++ b/test/unit/specs/slider.spec.js @@ -86,6 +86,30 @@ describe('Slider', () => { }, 150); }); + it('step', done => { + vm = createVue({ + template: ` +
+ +
+ `, + + data() { + return { + value: 0 + }; + } + }, true); + const slider = vm.$children[0]; + setTimeout(() => { + slider.onButtonDown({ clientX: 0 }); + slider.onDragging({ clientX: 100 }); + slider.onDragEnd(); + expect(vm.value > 0.4 && vm.value < 0.6).to.true; + done(); + }, 150); + }); + it('click', done => { vm = createVue({ template: `