|
@@ -7,35 +7,37 @@
|
|
|
@keyup.native="onInputChange"
|
|
|
ref="input"
|
|
|
:step="step"
|
|
|
+ :disabled="disabled"
|
|
|
:min="min"
|
|
|
:max="max"
|
|
|
size="small">
|
|
|
</el-input-number>
|
|
|
<div class="el-slider__runway"
|
|
|
- :class="{ 'show-input': showInput }"
|
|
|
+ :class="{ 'show-input': showInput, 'disabled': disabled }"
|
|
|
@click="onSliderClick" ref="slider">
|
|
|
<div class="el-slider__bar" :style="{ width: currentPosition }"></div>
|
|
|
<div
|
|
|
class="el-slider__button-wrapper"
|
|
|
- @mouseenter="hovering = true"
|
|
|
- @mouseleave="hovering = false"
|
|
|
+ @mouseenter="handleMouseEnter"
|
|
|
+ @mouseleave="handleMouseLeave"
|
|
|
@mousedown="onButtonDown"
|
|
|
- :style="{left: currentPosition}" ref="button">
|
|
|
- <div class="el-slider__button" :class="{ 'hover': hovering, 'dragging': dragging }"></div>
|
|
|
+ :class="{ 'hover': hovering, 'dragging': dragging }"
|
|
|
+ :style="{left: currentPosition}"
|
|
|
+ ref="button">
|
|
|
+ <el-tooltip placement="top" ref="tooltip">
|
|
|
+ <span slot="content">{{ value }}</span>
|
|
|
+ <div class="el-slider__button" :class="{ 'hover': hovering, 'dragging': dragging }"></div>
|
|
|
+ </el-tooltip>
|
|
|
</div>
|
|
|
- <transition name="popper-fade">
|
|
|
- <div class="el-slider__pop" v-show="showTip" ref="pop">{{ value }}</div>
|
|
|
- </transition>
|
|
|
<div class="el-slider__stop" v-for="item in stops" :style="{ 'left': item + '%' }" v-if="showStops"></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
<script type="text/babel">
|
|
|
- import Popper from 'element-ui/src/utils/popper';
|
|
|
import ElInputNumber from 'element-ui/packages/input-number/index.js';
|
|
|
+ import ElTooltip from 'element-ui/packages/tooltip/index.js';
|
|
|
import { getStyle } from 'wind-dom/src/style';
|
|
|
- import { addClass, removeClass } from 'wind-dom/src/class';
|
|
|
|
|
|
export default {
|
|
|
name: 'ElSlider',
|
|
@@ -68,24 +70,27 @@
|
|
|
showStops: {
|
|
|
type: Boolean,
|
|
|
default: false
|
|
|
+ },
|
|
|
+ disabled: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
}
|
|
|
},
|
|
|
|
|
|
components: {
|
|
|
- ElInputNumber
|
|
|
+ ElInputNumber,
|
|
|
+ ElTooltip
|
|
|
},
|
|
|
|
|
|
data() {
|
|
|
return {
|
|
|
inputValue: null,
|
|
|
timeout: null,
|
|
|
- showTip: false,
|
|
|
hovering: false,
|
|
|
dragging: false,
|
|
|
startX: 0,
|
|
|
currentX: 0,
|
|
|
startPos: 0,
|
|
|
- popper: null,
|
|
|
newPos: null,
|
|
|
oldValue: this.value,
|
|
|
currentPosition: (this.value - this.min) / (this.max - this.min) * 100 + '%'
|
|
@@ -97,21 +102,6 @@
|
|
|
this.$emit('input', Number(val));
|
|
|
},
|
|
|
|
|
|
- showTip(val) {
|
|
|
- if (val) {
|
|
|
- this.$nextTick(() => {
|
|
|
- this.updatePopper();
|
|
|
- });
|
|
|
- } else {
|
|
|
- this.timeout = setTimeout(() => {
|
|
|
- if (this.popper) {
|
|
|
- this.popper.destroy();
|
|
|
- this.popper = null;
|
|
|
- }
|
|
|
- }, 300);
|
|
|
- }
|
|
|
- },
|
|
|
-
|
|
|
value(val) {
|
|
|
this.$nextTick(() => {
|
|
|
this.updatePopper();
|
|
@@ -130,27 +120,18 @@
|
|
|
},
|
|
|
|
|
|
methods: {
|
|
|
- handlePopperStyle() {
|
|
|
- let placementMap = { top: 'bottom', bottom: 'top' };
|
|
|
- let placement = this.popper._popper.getAttribute('x-placement').split('-')[0];
|
|
|
- let origin = placementMap[placement];
|
|
|
- addClass(this.popper._popper, placement);
|
|
|
- removeClass(this.popper._popper, placementMap[placement]);
|
|
|
- this.popper._popper.style.transformOrigin = `center ${ origin }`;
|
|
|
+ handleMouseEnter() {
|
|
|
+ this.hovering = true;
|
|
|
+ this.$refs.tooltip.showPopper = true;
|
|
|
+ },
|
|
|
+
|
|
|
+ handleMouseLeave() {
|
|
|
+ this.hovering = false;
|
|
|
+ this.$refs.tooltip.showPopper = false;
|
|
|
},
|
|
|
|
|
|
updatePopper() {
|
|
|
- if (this.popper) {
|
|
|
- clearTimeout(this.timeout);
|
|
|
- this.popper.update();
|
|
|
- this.handlePopperStyle();
|
|
|
- } else {
|
|
|
- this.popper = new Popper(this.$refs.button, this.$refs.pop, { gpuAcceleration: false, placement: 'top' });
|
|
|
- this.popper.onCreate(() => {
|
|
|
- this.handlePopperStyle();
|
|
|
- });
|
|
|
- this.updatePopper();
|
|
|
- }
|
|
|
+ this.$refs.tooltip.updatePopper();
|
|
|
},
|
|
|
|
|
|
setPosition(newPos) {
|
|
@@ -169,6 +150,7 @@
|
|
|
},
|
|
|
|
|
|
onSliderClick(event) {
|
|
|
+ if (this.disabled) return;
|
|
|
var currentX = event.clientX;
|
|
|
var sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().left;
|
|
|
var newPos = (currentX - sliderOffsetLeft) / this.$sliderWidth * 100;
|
|
@@ -192,6 +174,7 @@
|
|
|
|
|
|
onDragging(event) {
|
|
|
if (this.dragging) {
|
|
|
+ this.$refs.tooltip.showPopper = true;
|
|
|
this.currentX = event.clientX;
|
|
|
var diff = (this.currentX - this.startX) / this.$sliderWidth * 100;
|
|
|
this.newPos = this.startPos + diff;
|
|
@@ -202,6 +185,7 @@
|
|
|
onDragEnd() {
|
|
|
if (this.dragging) {
|
|
|
this.dragging = false;
|
|
|
+ this.$refs.tooltip.showPopper = false;
|
|
|
this.setPosition(this.newPos);
|
|
|
window.removeEventListener('mousemove', this.onDragging);
|
|
|
window.removeEventListener('mouseup', this.onDragEnd);
|
|
@@ -209,6 +193,7 @@
|
|
|
},
|
|
|
|
|
|
onButtonDown(event) {
|
|
|
+ if (this.disabled) return;
|
|
|
this.onDragStart(event);
|
|
|
window.addEventListener('mousemove', this.onDragging);
|
|
|
window.addEventListener('mouseup', this.onDragEnd);
|
|
@@ -220,10 +205,6 @@
|
|
|
return parseInt(getStyle(this.$refs.slider, 'width'), 10);
|
|
|
},
|
|
|
|
|
|
- showTip() {
|
|
|
- return this.dragging || this.hovering;
|
|
|
- },
|
|
|
-
|
|
|
stops() {
|
|
|
let stopCount = (this.max - this.value) / this.step;
|
|
|
let result = [];
|
|
@@ -245,12 +226,6 @@
|
|
|
this.$nextTick(() => {
|
|
|
this.inputValue = this.inputValue || this.value;
|
|
|
});
|
|
|
- },
|
|
|
-
|
|
|
- beforeDestroy() {
|
|
|
- if (this.popper) {
|
|
|
- this.popper.destroy();
|
|
|
- }
|
|
|
}
|
|
|
};
|
|
|
</script>
|