en.javascript.info/2-ui/5-widgets/6-widget-tasks/6-slider-events/solution.view/index.html
Ilya Kantor 87bf53d076 update
2014-11-16 01:40:20 +03:00

183 lines
4 KiB
HTML
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script src="http://code.jquery.com/jquery.min.js"></script>
<style>
.slider {
width: 310px;
height: 15px;
margin: 5px;
border-radius: 5px;
background: #E0E0E0;
background: -moz-linear-gradient(left top , #E0E0E0, #EEEEEE) repeat scroll 0 0 transparent;
background: -webkit-gradient(linear, left top, right bottom, from(#E0E0E0), to(#EEEEEE));
background: linear-gradient(left top, #E0E0E0, #EEEEEE);
}
.slider-thumb {
position: relative;
width: 10px;
height: 25px;
left: 10px;
top: -5px;
border-radius: 3px;
background: blue;
cursor: pointer;
}
.sliding .slider-thumb {
cursor: move;
}
</style>
</head>
<body>
<div id="slider" class="slider">
<div class="slider-thumb"></div>
</div>
Slide:<span id="slide">&nbsp;</span>
Change:<span id="change">&nbsp;</span>
<script>
function Slider(options) {
var self = this;
var elem = options.elem;
var thumbElem = elem.find('.slider-thumb');
// [<*>----------------]
// |...............|
// first last
var pixelsPerValue = (elem.width() - thumbElem.width()) / options.max;
var value = options.value || 0;
// при начале переноса фиксируются
var thumbCursorShift; // сдвиг курсора относительно бегунка
var sliderCoords; // и координаты слайдера
thumbElem.on('mousedown', onThumbMouseDown)
.on('selectstart dragstart', false);
setSlidingValue(value, true);
function onThumbMouseDown(e) {
startSlide(e.pageX, e.pageY);
return false;
}
function onDocumentMouseMove(e) {
// вычесть координату родителя, т.к. position: relative
var newLeft = e.pageX - thumbCursorShift.x - sliderCoords.left;
// курсор ушёл вне слайдера
if (newLeft < 0) {
newLeft = 0;
}
var rightEdge = elem.outerWidth() - thumbElem.outerWidth();
if (newLeft > rightEdge) {
newLeft = rightEdge;
}
setSlidingValue( Math.round( newLeft / pixelsPerValue) );
}
function onDocumentMouseUp() {
endSlide();
}
function endSlide() {
$(document).off('.slider');
$(self).triggerHandler({
type: "change",
value: value
});
elem.removeClass('sliding');
}
function startSlide(downPageX, downPageY) {
var thumbCoords = thumbElem.offset();
thumbCursorShift = {
x: downPageX - thumbCoords.left,
y: downPageY - thumbCoords.top
};
sliderCoords = elem.offset();
$(document).on({
'mousemove.slider': onDocumentMouseMove,
'mouseup.slider': onDocumentMouseUp
});
elem.addClass('sliding');
}
/**
* Установить промежуточное значение
* quiet -- означает "не генерировать событие"
*/
function setSlidingValue(newValue, quiet) {
value = newValue;
thumbElem.css('left', value * pixelsPerValue ^ 0);
if (!quiet) {
$(self).triggerHandler({
type: "slide",
value: value
});
}
}
/**
* Установить окончательное значение
* @param {number} newValue новое значение
* @param {boolean} quiet если установлен, то без события
*/
this.setValue = function(newValue, quiet) {
// установить значение БЕЗ генерации события slide
// т.е. slide в любом случае нет
setSlidingValue(newValue, true);
// ..а change будет, если не указан quiet
if (!quiet) {
$(self).triggerHandler({
type: "change",
value: value
});
}
}
}
var slider = new Slider({
elem: $('#slider'),
max: 100,
value: 10
});
$(slider).on({
slide: function(e) {
$('#slide').html(e.value);
},
change: function(e) {
$('#change').html(e.value);
}
});
slider.setValue(50);
</script>
</body>
</html>