-
Notifications
You must be signed in to change notification settings - Fork 0
/
slider.js
118 lines (102 loc) · 2.85 KB
/
slider.js
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
import './slider.css'
Element.prototype.addClass = function(className)
{
if(!this.classList.contains(className)){
this.classList.add(className);
}
};
Element.prototype.removeClass = function(className)
{
if(this.classList.contains(className)){
this.classList.remove(className);
}
};
Array.prototype.first = function()
{
return this[0];
}
Array.prototype.last = function()
{
return this[this.length - 1];
}
document.querySelectorAll('.inputslider').forEach(
(inputslider) => {
let values = inputslider.dataset.values.split(','),
value = parseFloat(inputslider.dataset.value),
unit = '',
min = parseFloat(values.first()),
max = parseFloat(values.last()),
input = inputslider.querySelector('input'),
area = inputslider.querySelector('.area'),
knob = inputslider.querySelector('.knob'),
fill = inputslider.querySelector('.fill');
if(inputslider.dataset.unit){
unit = inputslider.dataset.unit;
}
values.forEach(
(value, i) => {
values[i] = value = parseFloat(value);
let span = document.createElement('span');
span.innerText = value + unit;
span.setAttribute('data-value', value);
if(i == 0){
span.addClass('selected');
input.value = value;
}
span.style.left = gsap.utils.mapRange(min, max, 0, 100, value) + '%';
// console.log((i+1)/values[values.length-1]*1000+ '%')
// span.style.left = (i+1)/values[values.length-1]*1000+ '%';
inputslider.querySelector('.values').appendChild(span);
}
);
Draggable.create(knob, {
type: 'x',
edgeResistance: 1,
bounds: area,
throwProps: false,
onDrag: function()
{
handleInputslider(this, false);
},
onDragEnd: function()
{
handleInputslider(this, true);
}
}
);
}
);
function handleInputslider(instance, snap)
{
let inputslider = instance.target.closest('.inputslider'),
fill = inputslider.querySelector('.fill'),
values = inputslider.dataset.values.split(','),
min = parseFloat(values.first()),
max = parseFloat(values.last()),
xPercent = gsap.utils.mapRange(0, instance.maxX, 0, 100, instance.x),
relativeValue = gsap.utils.mapRange(0, instance.maxX, min, max, instance.x),
finalValue = gsap.utils.snap(values, relativeValue),
snapX = gsap.utils.mapRange(min, max, 0, instance.maxX, finalValue),
fillWidth = gsap.utils.mapRange(0, instance.maxX, 0, 100, snapX);
if(snap){
gsap.to(instance.target, {duration: .2, x: snapX});
gsap.to(fill, {duration: .2, width: fillWidth + '%'});
}else{
values.forEach(
(value, i) => {
values[i] = parseFloat(value);
}
);
fill.style.width = xPercent + '%';
inputslider.querySelectorAll('.values span').forEach(
(span) => {
if(parseFloat(span.dataset.value) == finalValue){
span.addClass('selected');
}else{
span.removeClass('selected');
}
}
);
inputslider.querySelector('input').value = finalValue;
}
}