Muy a menudo en los sitios web de las tiendas en línea, y no solo, puede filtrar con un control deslizante para seleccionar un rango de valores. En uno de los proyectos, también necesitaba hacer un control deslizante.
Lo primero que viene a la mente es encontrar uno listo y pegarlo en su sitio. Entonces me encontré con un problema. El complemento JqueryUI.slider que encontré se negaba a funcionar en algunos dispositivos móviles. No pude identificar el problema (pero no realmente, y quería hurgar en el código de otra persona) y decidí hacer mi propia "bicicleta".
Decidí hacer la "bicicleta" en JavaScript puro para no meterme con las bibliotecas. Como dice un amigo mío: "cuanto menos" quedan "las conexiones, más estable todo funciona".
Por lo tanto, lo primero que hice fue crear un modelo tan simple
<div class="filter"> <div> <span> 1</span> <div><number>10</number><number>50</number></div> <div class="slider"> <div class="block-min" onMouseDown="moveRange(this)" onTouchStart="moveRange(this)"></div> <div class="color-range"></div> <div class="block-max" onMouseDown="moveRange(this)" onTouchStart="moveRange(this)"></div> </div> </div> <div> <span> 2</span> <div><number>0</number><number>5</number></div> <div class="slider"> <div class="block-min" onMouseDown="moveRange(this)" onTouchStart="moveRange(this)"></div> <div class="color-range"></div> <div class="block-max" onMouseDown="moveRange(this)" onTouchStart="moveRange(this)"></div> </div> </div> </div>
En la pantalla se ve así

El control deslizante con controles deslizantes está en un bloque con la clase "control deslizante" en la que hay 2 bloques más: el control deslizante de valor mínimo y el control deslizante de valor de rango máximo.
Describen dos eventos:
- onMouseDown: se activa cuando agarramos el control deslizante con el mouse;
- onTouchStart: funciona en dispositivos móviles cuando toca su dedo en nuestro control deslizante.
Sobre el control deslizante hay un bloque con dos números: estos son nuestros valores máximos y mínimos.
<div><number>0</number><number>5</number></div>
Ahora pasemos a la función en sí, que se llama al hacer clic.
function moveRange (elem) {
La función getCoords nos permite obtener las coordenadas y tamaños de nuestros elementos.
Se ve de la siguiente manera.
function getCoords(elem) { let coords = elem.getBoundingClientRect(); return {
Ahora describimos las funciones del controlador.
La primera función es onMouseMove, que se llama cuando se mueve el mouse. Funcionará solo con movimiento horizontal.
function onMouseMove(e) { e.preventDefault();
Y, por último, la función de controlador del evento "botón de liberación" o pérdida del punto de contacto en dispositivos móviles. Elimina todos los eventos agregados previamente y deja el control deslizante en el valor establecido.
function onMouseUp() { document.removeEventListener('mouseup', onMouseUp); document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('touchend', onMouseUp); document.removeEventListener('touchmove', onMouseMove); }
Y, por supuesto, estilos CSS para nuestro control deslizante
.filter { padding: 30px; width: 500px; } .filter>div { padding-top: 20px; display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex; -webkit-flex-direction: column; -moz-flex-direction: column; -ms-flex-direction: column; -o-flex-direction: column; flex-direction: column; } .filter>div>div { display: -webkit-flex; display: -moz-flex; display: -ms-flex; display: -o-flex; display: flex; justify-content: space-between; } .filter .slider { margin-top: 10px; position: relative; height: 6px; background: #fff; border: 1px solid #000; } .filter .color-range { position: absolute; background: #a4a4a4; width: 97%; border: none; height: 6px; left: 15px; } .filter .block-min, .block-max { width: 15px; height: 25px; position: absolute; left: 0; top: -11.5px; background: #fff; border: 1px solid #000; border-radius: 4px; z-index: 1; } .filter .block-max{ left: 97%; }
Vea la versión funcional de este control deslizante aquí .
Todos los archivos se pueden descargar desde GitHub .
¡Uso agradable y trabajo fácil!