Skip to content

Commit babbaf0

Browse files
committed
Allow show/hide markers and fix height of container
1 parent e8ebcd4 commit babbaf0

File tree

4 files changed

+74
-22
lines changed

4 files changed

+74
-22
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ If you find this package helpful, please ⭐ the repository on GitHub!
115115
- Support vertical slider
116116
- Support tailwindcssv4 and boostrap5 themes
117117
- Support more options for tooltip (position, distance etc.)
118-
- Support show/hide markers
119118
- Support more custom UI elements (pointers, gradient etc.)
120119
- Add onChange custom event that can be ported to custom controller
121120
- Add destroy custom event

index.html

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ <h2 class="mb-6 text-2xl font-semibold text-gray-800">
5959
<input type="text" data-range-slider-target="inputMin" value="5">
6060
</div>
6161

62+
<!-- Single Range Slider with markers -->
63+
<div data-controller="range-slider" data-range-slider-values-value="1..10" data-range-slider-markers-value="true">
64+
<label class="block mb-2 text-sm font-medium text-gray-700 ">Example of single range
65+
slider with markers</label>
66+
67+
<input type="text" data-range-slider-target="inputMin" value="5">
68+
</div>
69+
6270
<!-- Single Range Slider with Width -->
6371
<div data-controller="range-slider" data-range-slider-values-value="1..10" data-range-slider-width-value="50%">
6472
<label class="block mb-2 text-sm font-medium text-gray-700 ">Example of single range slider with
@@ -86,6 +94,15 @@ <h2 class="mb-6 text-2xl font-semibold text-gray-800">
8694
<input type="text" data-range-slider-target="inputMin" value="5">
8795
</div>
8896

97+
<!-- Single Range Slider with Labels and markers -->
98+
<div data-controller="range-slider" data-range-slider-values-value="1..10" data-range-slider-labels-value="true"
99+
data-range-slider-markers-value="true">
100+
<label class="block mb-2 text-sm font-medium text-gray-700">Example of single range slider with
101+
labels and markers</label>
102+
103+
<input type="text" data-range-slider-target="inputMin" value="5">
104+
</div>
105+
89106
<!-- Single Range Slider with Labels and Step -->
90107
<div data-controller="range-slider" data-range-slider-values-value="0..150" data-range-slider-labels-value="true"
91108
data-range-slider-step-value="10">
@@ -131,6 +148,16 @@ <h2 class="mb-6 text-2xl font-semibold text-gray-800">
131148
<input type="text" data-range-slider-target="inputMax" value="5">
132149
</div>
133150

151+
<!-- Multi Range Slider with Labels and markers -->
152+
<div data-controller="range-slider" data-range-slider-values-value="1..10" data-range-slider-labels-value="true"
153+
data-range-slider-markers-value="true">
154+
<label class="block mb-2 text-sm font-medium text-gray-700">Example of multi point range slider
155+
with labels and markers</label>
156+
157+
<input type="text" data-range-slider-target="inputMin" value="2">
158+
<input type="text" data-range-slider-target="inputMax" value="5">
159+
</div>
160+
134161
<!-- Multi Range Slider with Tooltips -->
135162
<div data-controller="range-slider" data-range-slider-values-value="1..10" data-range-slider-labels-value="true"
136163
data-range-slider-tooltip-value="true">
@@ -198,7 +225,7 @@ <h2 class="mb-6 text-2xl font-semibold text-gray-800">
198225

199226
<!-- Volume Vertical Range Slider -->
200227
<div data-controller="range-slider" data-range-slider-values-value="0..100"
201-
data-range-slider-vertical-value="true">
228+
data-range-slider-vertical-value="true" data-range-slider-markers-value="true">
202229
<label class="block mb-2 text-sm font-medium text-gray-700 ">Example of volume vertical range
203230
slider</label>
204231

src/range_slider.css

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
.rs-container {
2-
height: 45px;
2+
height: 46px;
33
position: relative;
44
}
5+
.rs-container.-no-labels {
6+
height: 26px;
7+
}
58
.rs-container .rs-bg,
69
.rs-container .rs-selected {
710
background-color: rgb(229, 231, 235);
@@ -67,11 +70,11 @@
6770
top: 5px;
6871
white-space: nowrap;
6972
}
70-
.rs-container .rs-scale span {
73+
.rs-container .rs-scale div {
7174
float: left;
7275
position: relative;
7376
}
74-
.rs-container .rs-scale span::before {
77+
.rs-container .rs-scale div.rs-marker::before {
7578
background-color: #ededed;
7679
content: "";
7780
height: 8px;
@@ -80,18 +83,21 @@
8083
top: 10px;
8184
width: 1px;
8285
}
83-
.rs-container .rs-scale span:last-child {
86+
.rs-container .rs-scale div:last-child {
8487
margin-left: -1px;
8588
width: 0px;
8689
}
87-
.rs-container .rs-scale span ins {
90+
.rs-container .rs-scale div span {
8891
color: #333;
8992
display: inline-block;
9093
font-size: 12px;
91-
margin-top: 20px;
94+
margin-top: 14px;
9295
text-decoration: none;
9396
}
94-
.rs-container.disabled .rs-scale span ins {
97+
.rs-container .rs-scale div span.rs-marker {
98+
margin-top: 20px;
99+
}
100+
.rs-container.disabled .rs-scale div span {
95101
color: #999;
96102
}
97103
.rs-tooltip {

src/range_slider.js

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export default class extends Controller {
99
labels: { type: Boolean, default: false },
1010
disabled: { type: Boolean, default: false },
1111
vertical: { type: Boolean, default: false },
12+
markers: { type: Boolean, default: false },
1213
selectedColour: String,
1314
currency: String,
1415
values: String,
@@ -57,6 +58,7 @@ export default class extends Controller {
5758
scale: "rs-scale",
5859
pointer: "rs-pointer",
5960
tip: "rs-tooltip",
61+
marker: "rs-marker",
6062
},
6163
"tailwindcss-v4": {
6264
container: "relative h-10 w-full",
@@ -67,6 +69,7 @@ export default class extends Controller {
6769
pointer: `absolute cursor-pointer z-10 inline-block size-5 transform rounded-full border border-gray-200
6870
bg-white ring-0 shadow-sm transition-transform duration-200 ease-in-out translate-x-5`,
6971
tip: "bg-gray-800 text-white text-xs px-1 rounded",
72+
marker: "absolute h-2 w-1 bg-gray-200",
7073
},
7174
};
7275

@@ -229,6 +232,8 @@ export default class extends Controller {
229232
this.slider.classList.remove("disabled");
230233
}
231234

235+
if (!this.labelsValue) this.slider.classList.add("-no-labels");
236+
232237
if (this.hasSelectedColourValue) {
233238
this.selected.style.backgroundColor = this.selectedColourValue;
234239
this.selected.style.borderColor = this.selectedColourValue;
@@ -241,19 +246,24 @@ export default class extends Controller {
241246

242247
createScale() {
243248
this.stepWidth = this.sliderWidth / (this.values.range.length - 1);
244-
this.scale.innerHTML = "";
245249

246250
for (let i = 0; i < this.values.range.length; i++) {
247-
const span = document.createElement("span");
248-
const ins = document.createElement("ins");
249-
span.appendChild(ins);
250-
this.scale.appendChild(span);
251-
span.style.width =
251+
const labelContainer = document.createElement("div");
252+
const label = document.createElement("span");
253+
254+
if (this.markersValue) {
255+
labelContainer.classList.add(this.klasses.marker);
256+
label.classList.add(this.klasses.marker);
257+
}
258+
259+
labelContainer.appendChild(label);
260+
this.scale.appendChild(labelContainer);
261+
labelContainer.style.width =
252262
i === this.values.range.length - 1 ? 0 : this.stepWidth + "px";
253-
ins.innerHTML = this.labelsValue
263+
label.innerHTML = this.labelsValue
254264
? this.formatStr(this.values.range[i])
255265
: "";
256-
ins.style.marginLeft = (ins.clientWidth / 2) * -1 + "px";
266+
label.style.marginLeft = (label.clientWidth / 2) * -1 + "px";
257267
}
258268
}
259269

@@ -338,14 +348,24 @@ export default class extends Controller {
338348

339349
addEvents() {
340350
this.slider.addEventListener("mousemove", this.move.bind(this));
341-
this.slider.addEventListener("touchmove", this.move.bind(this));
351+
this.slider.addEventListener("touchmove", this.move.bind(this), {
352+
passive: true,
353+
});
342354
this.slider.addEventListener("mouseup", this.drop.bind(this));
343-
this.slider.addEventListener("touchend", this.drop.bind(this));
344-
this.slider.addEventListener("touchcancel", this.drop.bind(this));
355+
this.slider.addEventListener("touchend", this.drop.bind(this), {
356+
passive: true,
357+
});
358+
this.slider.addEventListener("touchcancel", this.drop.bind(this), {
359+
passive: true,
360+
});
345361
this.pointerL.addEventListener("mousedown", this.drag.bind(this));
346-
this.pointerL.addEventListener("touchstart", this.drag.bind(this));
362+
this.pointerL.addEventListener("touchstart", this.drag.bind(this), {
363+
passive: true,
364+
});
347365
this.pointerR?.addEventListener("mousedown", this.drag.bind(this));
348-
this.pointerR?.addEventListener("touchstart", this.drag.bind(this));
366+
this.pointerR?.addEventListener("touchstart", this.drag.bind(this), {
367+
passive: true,
368+
});
349369
window.addEventListener("resize", this.onResize.bind(this));
350370

351371
const pieces = this.slider.querySelectorAll("span");

0 commit comments

Comments
 (0)