First pass at a simple slider plugin. Can be called on an input element with data-role="slider". Controls communicate both ways during use.

This commit is contained in:
scottjehl 2010-09-21 15:25:23 -04:00
parent d35881628c
commit 4992d7b168
4 changed files with 81 additions and 1 deletions

View file

@ -0,0 +1,8 @@
/*
* jQuery Mobile Framework
* Copyright (c) jQuery Project
* Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.
*/
input.ui-slider-input { display: inline-block; width: 50px; }
.ui-slider { position: relative; display: inline-block; overflow: visible; height: 15px; padding: 0; margin: 0 2% 0 20px; top: 4px; width: 45%; }
.ui-slider-handle { position: absolute; top: 50%; width: 22px; height: 22px; margin-top: -11px; margin-left: -11px; }

View file

@ -14,7 +14,8 @@ $elements = array(
'jQuery.mobile.forms.fieldcontain.css',
'jQuery.mobile.forms.select.css',
'jQuery.mobile.forms.textinput.css',
'jQuery.mobile.listview.css'
'jQuery.mobile.listview.css',
'jQuery.mobile.forms.slider.css'
);
?>

View file

@ -0,0 +1,70 @@
/*
* jQuery Mobile Framework : "slider" plugin (based on code from Filament Group,Inc)
* Copyright (c) jQuery Project
* Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
* Note: Code is in draft form and is subject to change
*/
(function($){
$.fn.slider = function(options){
return $(this).each(function(){
var input = $(this),
slider = $('<div class="ui-slider ui-bar-c ui-btn-corner-all"></div>'),
handle = $('<a href="#" class="ui-slider-handle" data-theme="a"></a>').appendTo(slider).buttonMarkup({corners: true}),
dragging = false,
supportTouch = $.support.touch,
touchStartEvent = supportTouch ? "touchstart" : "mousedown",
touchStopEvent = supportTouch ? "touchend" : "mouseup",
touchMoveEvent = supportTouch ? "touchmove" : "mousemove",
val = input.val(),
min = input.attr('min'),
max = input.attr('max'),
percent = val / (max - min) * 100;
function slideUpdate(event, val){
if(!val){
var data = event.originalEvent.touches ? event.originalEvent.touches[ 0 ] : event,
tol = 4; //a slight tolerance helped get to the ends of the slider
if( !dragging
|| data.pageX < slider.offset().left - tol
|| data.pageX > slider.offset().left + slider.width() + tol ){
return;
}
percent = Math.round(((data.pageX - slider.offset().left) / slider.width() ) * 100);
if( percent < 0 ){ percent = 0; }
if( percent > 100 ){ percent = 100; }
}
else{
percent = parseFloat(val) / (max - min) * 100;
}
var newval = Math.round( (percent/100) * max );
if( newval < min ){ newval = min; }
handle.css('left', percent + '%');
input.val(newval);
}
input
.addClass('ui-slider-input')
.keyup(function(e){
slideUpdate(e, $(this).val() );
});
slider
.css('left', percent + '%')
.bind(touchStartEvent, function(){
dragging = true;
slideUpdate(event);
return false;
})
.bind(touchMoveEvent, function(event){
slideUpdate(event);
return false;
})
.bind(touchStopEvent, function(){
dragging = false;
return false;
})
.insertAfter(input);
});
};
})(jQuery);

View file

@ -13,6 +13,7 @@ $elements = array(
'jQuery.mobile.forms.ajaxform.js',
'jQuery.mobile.buttonMarkup.js',
'jQuery.mobile.forms.button.js',
'jQuery.mobile.forms.slider.js',
'jQuery.mobile.collapsible.js',
'jQuery.mobile.controlGroup.js',
'jQuery.mobile.fieldContain.js',