1 export class Slider
extends HTMLElement
{
2 constructor(sliderWidth
, nFrames
) {
5 <div id='slider' class='slider'>
6 <div id='slider-bar' class='slider-bar'></div>
7 <div id='slider-head' class='slider-head'></div>
10 this.sliderWidth
= sliderWidth
;
11 this.nFrames
= nFrames
;
16 const sliderHead
= this.querySelector('#slider-head');
17 sliderHead
.onpointerdown
= (e
) => {
18 this.dragSliderHead(e
);
21 const sliderBar
= this.querySelector('#slider-bar');
22 sliderBar
.onclick
= (e
) => {
26 this.querySelector('#slider').style
.width
= this.sliderWidth
+ 'px';
29 dragSliderHead(e
, originalFrame
= this.frame
, updateCallback
= null, finishedCallback
= null) {
30 const sliderHead
= this.querySelector('#slider-head');
31 const sliderBar
= this.querySelector('#slider-bar');
33 document
.body
.classList
.add('grabbing');
34 sliderHead
.style
.cursor
= 'grabbing';
35 sliderBar
.style
.cursor
= 'grabbing';
37 e
= e
|| window
.event
;
40 // get the mouse cursor position at startup
43 this.setSliderHeadDragUpdates(pos3
, originalFrame
, updateCallback
);
44 this.setEndOfSliderHeadDrag(finishedCallback
);
47 setEndOfSliderHeadDrag(finishedCallback
= null) {
48 const sliderHead
= this.querySelector('#slider-head');
49 const sliderBar
= this.querySelector('#slider-bar');
51 document
.onpointerup
= () => {
52 if (finishedCallback
) {
55 document
.body
.classList
.remove('grabbing');
56 sliderHead
.style
.cursor
= 'grab';
57 sliderBar
.style
.cursor
= 'pointer';
59 document
.onpointerup
= null;
60 document
.onpointermove
= null;
64 setSliderHeadDragUpdates(pos3
, originalFrame
, updateCallback
= null) {
65 document
.onpointermove
= (e2
) => {
66 e2
= e2
|| window
.event
;
69 // calculate the new cursor position:
70 let diff
= Math
.floor((e2
.clientX
- pos3
) / this.sliderWidth
* this.nFrames
);
72 let newFrame
= originalFrame
+ diff
;
73 newFrame
= Math
.min(newFrame
, this.nFrames
);
74 newFrame
= Math
.max(newFrame
, 0);
76 if (updateCallback
== null) {
77 this.updateHeadPosition(newFrame
);
79 updateCallback(newFrame
);
84 updateHeadPosition(newFrame
) {
85 this.frame
= newFrame
;
87 const sliderHead
= this.querySelector('#slider-head');
88 let percentage
= newFrame
/ this.nFrames
;
89 let left
= Math
.floor(percentage
* this.sliderWidth
*.95);
90 sliderHead
.style
.left
= left
+ 'px';
93 clickBar(e
, updateCallback
= null) {
94 const head
= this.querySelector('#slider-head').getBoundingClientRect();
95 let diff
= Math
.floor((e
.clientX
- head
.left
) / this.sliderWidth
* this.nFrames
);
97 let newFrame
= this.frame
+ diff
;
99 if (updateCallback
== null) {
100 this.updateHeadPosition(newFrame
);
102 updateCallback(newFrame
);
107 window
.customElements
.define('slider-bar', Slider
);