index.vue
2.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<template>
<div class="jc-component__range">
<div class="jc-range" :class="rangeStatus ? 'success' : '' ">
<i @mousedown="rangeMove" :class="rangeStatus ? successIcon : startIcon" id="rangeMove"></i>
{{ rangeStatus ? successText : startText}}
</div>
</div>
</template>
<script>
export default {
props: {
// 成功之后的函数
successFun: {
type: Function
},
//成功图标
successIcon: {
type: String,
default: "el-icon-success"
},
//成功文字
successText: {
type: String,
default: ''
},
//开始的图标
startIcon: {
type: String,
default: "el-icon-d-arrow-right"
},
//开始的文字
startText: {
type: String,
default: ''
},
//失败之后的函数
errorFun: {
type: Function
},
//或者用值来进行监听
status: {
type: String
},
codeStatus: {
type: String
},
},
name: "Silder",
data() {
return {
rangeStatus:'',
};
},
watch: {
codeStatus(nVal, oVal) {
if (nVal === 'error') {
this.rangeStatus = false
document.getElementById('rangeMove').style.transform = 'translateX(0)'
}
},
},
methods: {
rangeMove(e){
let ele = e.target;
let startX = e.clientX;
let eleWidth = ele.offsetWidth;
let parentWidth = ele.parentElement.offsetWidth;
let MaxX = parentWidth - eleWidth;
if(this.rangeStatus){//不运行
return false;
}
document.onmousemove = (e) => {
let endX = e.clientX;
this.disX = endX - startX;
if(this.disX <= 0){
this.disX = 0;
}
if(this.disX >= MaxX - eleWidth){//减去滑块的宽度,体验效果更好
this.disX = MaxX;
}
ele.style.transition = '.1s all';
ele.style.transform = 'translateX('+this.disX+'px)';
e.preventDefault();
}
document.onmouseup = ()=> {
if(this.disX !== MaxX){
ele.style.transition = '.5s all';
ele.style.transform = 'translateX(0)';
//执行失败的函数
this.errorFun && this.errorFun();
}else{
this.rangeStatus = true;
if(this.status){
this.$parent[this.status] = true;
}
//执行成功的函数
this.successFun && this.successFun();
}
document.onmousemove = null;
document.onmouseup = null;
}
}
}
};
</script>
<style scoped>
.jc-component__range {
width: 300px;
height: 36px;
}
.jc-range{
background-color: #e9e9e9;
position: relative;
transition: 1s all;
user-select: none;
color: #585858;
display: flex;
font-size: 14px;
justify-content: center;
align-items: center;
height: 36px; /*no*/
}
.jc-range i{
position: absolute;
left: 0;
width: 36px;/*no*/
height: 36px;
color: #666;
background-color: #fff;
border: 1px solid #D9D9D9;
font-size: 17px;
cursor: pointer;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
.jc-range.success{
background-color: #3BB7FF;
color: #fff;
}
.jc-range.success i{
color: #3BB7FF;
}
</style>