Skip to content

Commit 11ffd06

Browse files
committed
新增 滑块组件,滑块demo
1 parent 83cb5ac commit 11ffd06

File tree

4 files changed

+421
-78
lines changed

4 files changed

+421
-78
lines changed

src/assets/vue-layui.css

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,34 @@
2626
color: #eee !important;
2727
}
2828

29+
.layui-bd-red {
30+
border-color: #FF5722 !important
31+
}
32+
33+
.layui-bd-orange {
34+
border-color: #FFB800 !important
35+
}
36+
37+
.layui-bd-green {
38+
border-color: #009688 !important
39+
}
40+
41+
.layui-bd-cyan {
42+
border-color: #2F4056 !important
43+
}
44+
45+
.layui-bd-blue {
46+
border-color: #1E9FFF !important
47+
}
48+
49+
.layui-bd-black {
50+
border-color: #393D49 !important
51+
}
52+
53+
.layui-bd-gray {
54+
border-color: #eee !important;
55+
}
56+
2957
.layui-body {
3058
position: absolute;
3159
left: 200px;
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
<template>
2+
3+
<div class="layui-slider-wrap"
4+
:style="(vertical ? 'bottom: ' + left + '%' : 'left: ' + left + '%')">
5+
<div class="layui-slider-wrap-btn"
6+
:class="['layui-bd-' + this.theme, {'layui-disabled': disabled}]"
7+
style="border: 2px; border-style: solid"
8+
@mousedown="onDragStart"
9+
@mouseenter="handleMouseEnter"
10+
@mouseleave="handleMouseLeave">
11+
</div>
12+
</div>
13+
</template>
14+
15+
<script>
16+
export default {
17+
name: "LaySliderBtn",
18+
data(){
19+
return {
20+
left: 0,
21+
btnValue: 0,
22+
isMouseDown: false,
23+
startX: 0,
24+
startLeft: 0
25+
}
26+
},
27+
props: {
28+
value: {
29+
type: Number,
30+
requires: true
31+
},
32+
max: {
33+
type: Number,
34+
default: () => 100
35+
},
36+
min: {
37+
type: Number,
38+
default: () => 0
39+
},
40+
step: {
41+
type: Number,
42+
default: () => 1
43+
},
44+
sliderWidth: {
45+
type: Number,
46+
},
47+
steps: {
48+
type: Array
49+
},
50+
vertical: {
51+
type: Boolean
52+
},
53+
theme: String,
54+
disabled: Boolean
55+
},
56+
mounted() {
57+
this.setData()
58+
},
59+
methods: {
60+
setData(){
61+
const {value, max, min} = this
62+
this.btnValue = value
63+
64+
let left = ((value -min) / (max - min) || 0) * 100
65+
if (left > 100) left = 100;
66+
67+
if (left < 0) left = 0;
68+
this.left = left
69+
},
70+
handleMouseEnter() {
71+
72+
this.$emit('tip', [true, this.left, this.btnValue])
73+
},
74+
handleMouseLeave() {
75+
if (!this.isMouseDown) this.$emit('tip', [false, this.left, parseInt(this.btnValue)])
76+
},
77+
handleChange(){
78+
const {btnValue, max, min} = this
79+
if(btnValue > max) this.btnValue = max
80+
if(btnValue < min) this.btnValue = min
81+
this.$emit('tip', [true, this.left, this.btnValue])
82+
this.$emit('input', parseInt(this.btnValue))
83+
},
84+
onDragStart(e) {
85+
e.preventDefault();
86+
this.isMouseDown = true
87+
this.startX = this.vertical ? -e.screenY : e.screenX
88+
this.startLeft = this.left
89+
90+
window.addEventListener('mousemove', this.onDragging);
91+
window.addEventListener('mouseup', this.onDragEnd);
92+
93+
},
94+
onDragging(e) {
95+
if (this.disabled) {
96+
return false
97+
}
98+
const {startX, isMouseDown, sliderWidth, startLeft, max, min, steps} = this;
99+
const screenX = this.vertical ? -e.screenY : e.screenX
100+
if (!isMouseDown) return false;
101+
102+
let left = startLeft + ((screenX - startX) / sliderWidth) * 100;
103+
104+
if (left > 100) left = 100;
105+
106+
if (left < 0) left = 0;
107+
108+
left = steps.filter(o => o <= left).pop()
109+
this.left = left;
110+
this.btnValue = Math.round(min + left * (max - min) / 100)
111+
this.handleChange()
112+
},
113+
onDragEnd(e) {
114+
e.returnValue = false;
115+
116+
this.isMouseDown = false;
117+
this.$emit('tip', [false, this.left, this.btnValue])
118+
window.removeEventListener('mousemove', this.onDragging);
119+
window.removeEventListener('mouseup', this.onDragEnd);
120+
}
121+
},
122+
watch: {
123+
value() {
124+
this.setData()
125+
}
126+
}
127+
}
128+
</script>
129+
130+
<style scoped>
131+
132+
</style>

0 commit comments

Comments
 (0)