Muitas vezes, nos sites de lojas on-line, e não apenas, você pode filtrar com um controle deslizante para selecionar um intervalo de valores. Em um dos projetos, eu também precisava fazer esse controle deslizante.
A primeira coisa que vem à mente é encontrar um já pronto e colá-lo no seu site. Então eu tive um problema. O plugin JqueryUI.slider que encontrei recusou-se a funcionar em alguns dispositivos móveis. Não consegui identificar o problema (mas não realmente, e queria mexer no código de outra pessoa) e decidi fazer minha própria "bicicleta".
Eu decidi fazer a "bicicleta" em JavaScript puro para não mexer com as bibliotecas. Como um amigo meu diz: "quanto menos conexões" esquerdas ", mais estável tudo funciona".
Portanto, a primeira coisa que fiz foi criar um modelo tão simples
<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>
Na tela, fica assim

O controle deslizante com os próprios controles deslizantes está em um bloco com a classe "controle deslizante", na qual existem mais 2 blocos: o controle deslizante de valor mínimo e o controle deslizante de valor máximo da faixa.
Eles descrevem dois eventos:
- onMouseDown - acionado quando agarramos o controle deslizante com o mouse;
- onTouchStart - funciona em dispositivos móveis quando você toca o dedo em nosso controle deslizante.
Acima do controle deslizante, há um bloco com dois números - esse é o nosso valor máximo e mínimo.
<div><number>0</number><number>5</number></div>
Agora vamos para a própria função, que é chamada ao clicar.
function moveRange (elem) {
A função getCoords nos permite obter as coordenadas e tamanhos de nossos elementos.
Parece o seguinte.
function getCoords(elem) { let coords = elem.getBoundingClientRect(); return {
Agora descrevemos as funções do manipulador.
A primeira função é onMouseMove, chamada quando o mouse se move. Só funcionará com movimento horizontal.
function onMouseMove(e) { e.preventDefault();
E, finalmente, a função do manipulador do evento "botão de liberação" ou perda do ponto de contato em dispositivos móveis. Exclui todos os eventos adicionados anteriormente e deixa o controle deslizante no valor definido.
function onMouseUp() { document.removeEventListener('mouseup', onMouseUp); document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('touchend', onMouseUp); document.removeEventListener('touchmove', onMouseMove); }
E, claro, estilos CSS para nosso controle 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%; }
Veja a versão funcional desse controle deslizante aqui .
Todos os arquivos podem ser baixados no GitHub .
Uso agradável e trabalho fácil!