-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdoubleRange.js
149 lines (122 loc) · 5.51 KB
/
doubleRange.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
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
148
149
function setDoubleRange(configDoubleRange)
{
//Configuration du mobule :
var classOrIDDoubleRange = configDoubleRange.element;
var minValue = configDoubleRange.minValue;
var maxValue = configDoubleRange.maxValue;
var maxInfinite = configDoubleRange.maxInfinite;
var stepValue = configDoubleRange.stepValue;
var unite = configDoubleRange.unite;
var defaultMinValue = configDoubleRange.defaultMinValue;
var defaultMaxValue = configDoubleRange.defaultMaxValue;
var doubleRange = document.querySelector(classOrIDDoubleRange);
var barre = doubleRange.querySelector('.barre');
var barreMilieu = doubleRange.querySelector('.barreMilieu');
var thumb1 = doubleRange.querySelector('.t1');
var thumb2 = doubleRange.querySelector('.t2');
var draggable = false;
var targetToMove = false;
var largeurBarre = barre.scrollWidth;
var margeLeftBarre = barre.getBoundingClientRect().left;
//Le mousemove est détecté sur la div contenant tout le double range pour éviter les pertes de suivis si la souris sort du thumb
//Detection de la souris pour les ordinateurs :
thumb1.addEventListener("mousedown", dragStart, false);
thumb2.addEventListener("mousedown", dragStart, false);
doubleRange.addEventListener("mousemove", drag, false);
doubleRange.addEventListener("mousedown", clickBar, false);
document.addEventListener("mouseup", dragStop, false);
//Detection du tactile pour les téléphone/tablettes... :
thumb1.addEventListener("touchstart", dragStart, false);
thumb2.addEventListener("touchstart", dragStart, false);
doubleRange.addEventListener("touchmove", drag, false);
doubleRange.addEventListener("touchstart", clickBar, false);
document.addEventListener("touchend", dragStop, false);
setDefaultValues();
function dragStart(e){ draggable = true; targetToMove = e.target.className.split(' ')[0]; largeurBarre = barre.scrollWidth; margeLeftBarre = barre.getBoundingClientRect().left; }
function dragStop(){ draggable = false; targetToMove = false; }
function drag(e)
{
if(draggable && targetToMove != false)
{
var thumbToMove = doubleRange.querySelector('.'+targetToMove);
//Detection de la position X de la souris :
var x = e.clientX;
//Detection de la position X pour le tactile :
if(e.type === 'touchmove'){ x = e.touches[0].clientX; }
var pourcentage = ((x-margeLeftBarre)*100)/largeurBarre;
if(pourcentage <= 0 || pourcentage >= 100){ return false; }
//Déplacement du thumb :
thumbToMove.style.left = pourcentage+'%';
//Mise à jour de la barre du milieu et des labels :
majBarreMilieuETLabels();
}
}
function clickBar(e)
{
//Detection de la position X de la souris :
var x = e.clientX;
//Detection de la position X pour le tactile :
if(e.type === 'touchmove'){ x = e.touches[0].clientX; }
var pourcentage = ((x-margeLeftBarre)*100)/largeurBarre;
//Detection du thumb le plus proche :
var percentThumb1 = parseInt(thumb1.style.left);
var percentThumb2 = parseInt(thumb2.style.left);
if(Math.abs(percentThumb1-pourcentage) <= Math.abs(percentThumb2-pourcentage))
{
thumb1.style.left = pourcentage+'%';
}
else
{
thumb2.style.left = pourcentage+'%';
}
//Mise à jour de la barre du milieu et des labels :
majBarreMilieuETLabels();
}
function setDefaultValues()
{
if(typeof defaultMinValue === 'undefined' || typeof defaultMaxValue === 'undefined'){ return false; }
if(defaultMinValue < minValue || defaultMinValue > maxValue || defaultMaxValue < minValue || defaultMaxValue > maxValue){ return false; }
thumb1.style.left = convertionValueToPercent(defaultMinValue)+'%';
thumb2.style.left = convertionValueToPercent(defaultMaxValue)+'%';
majBarreMilieuETLabels();
}
function majBarreMilieuETLabels()
{
var pourcentageT1 = parseFloat(thumb1.style.left);
var pourcentageT2 = parseFloat(thumb2.style.left);
var labelMin = doubleRange.querySelector('.labelMin');
var labelMax = doubleRange.querySelector('.labelMax');
var inputMin = doubleRange.querySelector('.inputMin');
var inputMax = doubleRange.querySelector('.inputMax');
//Detection du pourcentage le plus petit et le plus grand, car les thumbs peuvent se croiser :
var pourcentageMin = pourcentageMax = 0;
if(pourcentageT1 <= pourcentageT2){ pourcentageMin = pourcentageT1; pourcentageMax = pourcentageT2; }
else{ pourcentageMin = pourcentageT2; pourcentageMax = pourcentageT1; }
//Mise à jour de la position de la barre du milieu
barreMilieu.style.left = pourcentageMin+'%';
barreMilieu.style.width = (pourcentageMax-pourcentageMin)+'%';
//Mise à jour des labels :
labelMin.textContent = convertionPercentToValue(pourcentageMin);
labelMax.textContent = convertionPercentToValue(pourcentageMax);
//Mise à jour des inputs :
inputMin.value = convertionPercentToValue(pourcentageMin, false);
inputMax.value = convertionPercentToValue(pourcentageMax, false);
//Gestion du maxInfinite (remplace la valeur du max par l'infini) :
if(pourcentageMax > 99 && maxInfinite == true){ labelMax.textContent = '∞'; inputMax.value = ''; }
}
function convertionPercentToValue(pourcentage, afficherUnite = true)
{
//Converti le pourcentage en valeur par rapport au minValue et maxValue :
var resPFV = ((pourcentage*(maxValue-minValue))/100)+minValue;
//Arrondie la valeur par rapport au chiffre stepValue :
resPFV = Math.round(resPFV/stepValue)*stepValue;
//Ajoute l'unité :
if(afficherUnite){ resPFV = resPFV+' '+unite; }
return resPFV;
}
function convertionValueToPercent(value)
{
var resPercent = ((value-minValue)*100)/(maxValue-minValue);
return resPercent;
}
}