Ограничить range slider

317
07 июня 2017, 05:25

Не совсем получается ограничить движение маркера по слайдеру.

const mark = document.getElementById('marker'); 
const slider = document.getElementById('slider'); 
 
 
mark.onmousedown = function(e) { 
		let value = e.pageX - slider.offsetLeft - (mark.offsetWidth / 2); 
	function moveAt(e) { 
		mark.style.left = e.pageX - slider.offsetLeft - (mark.offsetWidth / 2) + 'px'; 
  } 
	 
	document.onmousemove = function (e) {	 
		if(value > 0 && value < 380 ){ // value сравнивается сначала с left: 0px , потом с left: 380px, сам маркер задан абсолютным позиционированием 
			moveAt(e); 
			console.log(value); 
		} 
		else{ 
			console.log("Что-то сделать"); // проблема в том что else срабатывает после отпускания маркера 
		}	 
	} 
	 
	document.onmouseup = function () { 
		document.onmousemove = null; 
    mark.onmouseup = null; 
	} 
}
#slider{ 
	position: relative; 
	width: 400px; 
	height: 40px; 
	background: #d5dbe5; 
	margin: 30px auto; 
} 
#marker{ 
	position: absolute; 
	width: 20px; 
	height: 40px; 
	background: gray; 
}
<div id="slider"> 
	<div id="marker"></div> 
</div>

Answer 1

Вы один раз вычисляете

let value = e.pageX - slider.offsetLeft - (mark.offsetWidth / 2); и потом сравниваете это значение с ограничителями. Его надо рассчитывать каждый раз, чтоб оно было актуальным.

const mark = document.getElementById('marker'); 
const slider = document.getElementById('slider'); 
 
mark.onmousedown = e => { 
    let value = e.pageX - slider.offsetLeft - (mark.offsetWidth / 2); 
    const moveAt = value => { 
        mark.style.left = value + 'px'; 
    } 
    document.onmousemove = e => {     
        value = e.pageX - slider.offsetLeft - (mark.offsetWidth / 2); 
        if(value > 0 && value < 380 ){ 
            moveAt(value); 
        }else{ 
            moveAt(value>0?380:0); 
        }     
    } 
    document.onmouseup = () => { 
        document.onmousemove = null; 
        mark.onmouseup = null; 
    } 
}
#slider{ 
	position: relative; 
	width: 400px; 
	height: 40px; 
	background: #d5dbe5; 
	margin: 30px auto; 
} 
#marker{ 
	position: absolute; 
	width: 20px; 
	height: 40px; 
	background: gray; 
}
<div id="slider"> 
	<div id="marker"></div> 
</div>

READ ALSO
Почему не удается выкачать сайт целиком?

Почему не удается выкачать сайт целиком?

Мне нужно выкачать этот сайт wwwrestoransmaja

365
Angular. Как отформатировать денежную сумму?

Angular. Как отформатировать денежную сумму?

Исходное число 1000(значение value[4]), на выходе должно быть $1,00000 Прошу совета

475
Ускорение работы приложения

Ускорение работы приложения

Есть приложение на js + jquery + php, которые считает большие таблицы данных , с поиском совпадений и прочим, что в свою очередь приводит к большой...

320