snapping enabled in slider
This commit is contained in:
@@ -19,13 +19,14 @@
|
|||||||
const maxWidth = ref( window.innerWidth ); // TODO: Update to reflect slider width
|
const maxWidth = ref( window.innerWidth ); // TODO: Update to reflect slider width
|
||||||
const sliderOffset = -11;
|
const sliderOffset = -11;
|
||||||
const sliderFillPosLeft = ref( sliderOffset ); // Offset from left edge
|
const sliderFillPosLeft = ref( sliderOffset ); // Offset from left edge
|
||||||
const sliderFillPosRight = ref( 0 ); // Offset from right edge
|
const sliderFillPosRight = ref( maxWidth.value ); // Offset from right edge
|
||||||
const sliderStops: Ref<SliderStop[]> = ref( [] );
|
const sliderStops: Ref<SliderStop[]> = ref( [] );
|
||||||
|
let intervalSize = 0;
|
||||||
|
|
||||||
const setUp = ( stops: number ) => {
|
const setUp = ( stops: number ) => {
|
||||||
maxWidth.value = document.getElementById( 'slider-' + props.id )!.clientWidth;
|
maxWidth.value = document.getElementById( 'slider-' + props.id )!.clientWidth;
|
||||||
sliderStops.value = [];
|
sliderStops.value = [];
|
||||||
const intervalSize = maxWidth.value / ( stops - 1 );
|
intervalSize = maxWidth.value / ( stops - 1 );
|
||||||
for ( let i = 0; i < stops; i ++ ) {
|
for ( let i = 0; i < stops; i ++ ) {
|
||||||
sliderStops.value.push( {
|
sliderStops.value.push( {
|
||||||
x: intervalSize * i - 10,
|
x: intervalSize * i - 10,
|
||||||
@@ -55,11 +56,17 @@
|
|||||||
} else {
|
} else {
|
||||||
sliderKnobPos.value = maxWidth.value + sliderOffset;
|
sliderKnobPos.value = maxWidth.value + sliderOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calculate progress of slider background / progress bar
|
||||||
|
sliderFillPosRight.value = maxWidth.value - Math.round( sliderKnobPos.value / intervalSize ) * intervalSize + sliderOffset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const endDrag = () => {
|
const endDrag = () => {
|
||||||
isDragging.value = false;
|
isDragging.value = false;
|
||||||
|
|
||||||
|
// snapping
|
||||||
|
sliderKnobPos.value = Math.round( sliderKnobPos.value / intervalSize ) * intervalSize + sliderOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
const props = defineProps( {
|
const props = defineProps( {
|
||||||
@@ -83,7 +90,7 @@
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="slider-container">
|
<div class="slider-container">
|
||||||
<div class="slider-knob" :style="'left: ' + sliderKnobPos + 'px;'">
|
<div :class="'slider-knob' + ( isDragging ? ' dragging' : '' )" :style="'left: ' + sliderKnobPos + 'px;'">
|
||||||
<div :class="'slider-drag-support' + ( isDragging ? ' dragging' : '' )" @mousemove="( e ) => handleDrag( e.clientX )"
|
<div :class="'slider-drag-support' + ( isDragging ? ' dragging' : '' )" @mousemove="( e ) => handleDrag( e.clientX )"
|
||||||
@mouseup="() => endDrag()" @mousedown="( e ) => startDrag( e.clientX )"></div>
|
@mouseup="() => endDrag()" @mousedown="( e ) => startDrag( e.clientX )"></div>
|
||||||
</div>
|
</div>
|
||||||
@@ -104,13 +111,18 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.slider-knob {
|
.slider-knob {
|
||||||
background-color: var( --slider-color );
|
background-color: var( --hover-color );
|
||||||
width: 25px;
|
width: 25px;
|
||||||
height: 25px;
|
height: 25px;
|
||||||
border-radius: 15px;
|
border-radius: 15px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
z-index: 5;
|
z-index: 5;
|
||||||
top: -7px;
|
top: -7px;
|
||||||
|
transition: left 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slider-knob.dragging {
|
||||||
|
transition: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.slider-drag-support {
|
.slider-drag-support {
|
||||||
@@ -142,8 +154,10 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.slider-fill {
|
.slider-fill {
|
||||||
height: 5px;
|
height: 10px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
background-color: var( --slider-color );
|
||||||
|
transition: width 0.5s;
|
||||||
}
|
}
|
||||||
|
|
||||||
.slider-stop {
|
.slider-stop {
|
||||||
|
|||||||
Reference in New Issue
Block a user