Ok, a menudo he querido eso, pero nunca tuve la motivación para sentarme, y algo sobre eso. Como me lo preguntó ahora, me senté y pirateé el control deslizante de la interfaz de usuario de jQuery para agregar las opciones de relleno a medida que me pedía.
Nota: Solo lo he agregado para controles deslizantes horizontales con una sola asa. Los otros casos no son más complicados. Simplemente no tenía la motivación para escribir y las pruebas posteriores para cubrir casos que probablemente no eran necesarios en este momento.
Incluye este código después de haber incluido el control deslizante original de jQuery UI. La extensión sobrescribe un par de métodos y agrega las opciones 'paddingMin' y 'paddingMax' al widget Slider (los valores deben ser numéricos y se interpretarán como píxeles; esto también se puede extender fácilmente para tomar otras unidades, obviamente, pero de nuevo implicaría más tipeo/prueba para casos actualmente no solicitados).
simple ejemplo de uso:
$('#slider').slider({ paddingMin: 50, paddingMax: 100 });
código de truco de extensión (siempre como es, no demandarme):
(
function($, undefined)
{
$.ui.slider.prototype.options =
$.extend(
{},
$.ui.slider.prototype.options,
{
paddingMin: 0,
paddingMax: 0
}
);
$.ui.slider.prototype._refreshValue =
function() {
var
oRange = this.options.range,
o = this.options,
self = this,
animate = (!this._animateOff) ? o.animate : false,
valPercent,
_set = {},
elementWidth,
elementHeight,
paddingMinPercent,
paddingMaxPercent,
paddedBarPercent,
lastValPercent,
value,
valueMin,
valueMax;
if (self.orientation === "horizontal")
{
elementWidth = this.element.outerWidth();
paddingMinPercent = o.paddingMin * 100/elementWidth;
paddedBarPercent = (elementWidth - (o.paddingMin + o.paddingMax)) * 100/elementWidth;
}
else
{
elementHeight = this.element.outerHeight();
paddingMinPercent = o.paddingMin * 100/elementHeight;
paddedBarPercent = (elementHeight - (o.paddingMin + o.paddingMax)) * 100/elementHeight;
}
if (this.options.values && this.options.values.length) {
this.handles.each(function(i, j) {
valPercent =
((self.values(i) - self._valueMin())/(self._valueMax() - self._valueMin()) * 100)
* paddedBarPercent/100 + paddingMinPercent;
_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
$(this).stop(1, 1)[ animate ? "animate" : "css" ](_set, o.animate);
if (self.options.range === true) {
if (self.orientation === "horizontal") {
if (i === 0) {
self.range.stop(1, 1)[ animate ? "animate" : "css" ]({ left: valPercent + "%" }, o.animate);
}
if (i === 1) {
self.range[ animate ? "animate" : "css" ]({ width: (valPercent - lastValPercent) + "%" }, { queue: false, duration: o.animate });
}
} else {
if (i === 0) {
self.range.stop(1, 1)[ animate ? "animate" : "css" ]({ bottom: (valPercent) + "%" }, o.animate);
}
if (i === 1) {
self.range[ animate ? "animate" : "css" ]({ height: (valPercent - lastValPercent) + "%" }, { queue: false, duration: o.animate });
}
}
}
lastValPercent = valPercent;
});
} else {
value = this.value();
valueMin = this._valueMin();
valueMax = this._valueMax();
valPercent =
((valueMax !== valueMin)
? (value - valueMin)/(valueMax - valueMin) * 100
: 0)
* paddedBarPercent/100 + paddingMinPercent;
_set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
this.handle.stop(1, 1)[ animate ? "animate" : "css" ](_set, o.animate);
if (oRange === "min" && this.orientation === "horizontal") {
this.range.stop(1, 1)[ animate ? "animate" : "css" ]({ width: valPercent + "%" }, o.animate);
}
if (oRange === "max" && this.orientation === "horizontal") {
this.range[ animate ? "animate" : "css" ]({ width: (100 - valPercent) + "%" }, { queue: false, duration: o.animate });
}
if (oRange === "min" && this.orientation === "vertical") {
this.range.stop(1, 1)[ animate ? "animate" : "css" ]({ height: valPercent + "%" }, o.animate);
}
if (oRange === "max" && this.orientation === "vertical") {
this.range[ animate ? "animate" : "css" ]({ height: (100 - valPercent) + "%" }, { queue: false, duration: o.animate });
}
}
};
$.ui.slider.prototype._normValueFromMouse =
function(position) {
var
o = this.options,
pixelTotal,
pixelMouse,
percentMouse,
valueTotal,
valueMouse;
if (this.orientation === "horizontal") {
pixelTotal = this.elementSize.width - (o.paddingMin + o.paddingMax);
pixelMouse = position.x - this.elementOffset.left - o.paddingMin - (this._clickOffset ? this._clickOffset.left : 0);
} else {
pixelTotal = this.elementSize.height - (o.paddingMin + o.paddingMax);
pixelMouse = position.y - this.elementOffset.top - o.paddingMin - (this._clickOffset ? this._clickOffset.top : 0);
}
percentMouse = (pixelMouse/pixelTotal);
if (percentMouse > 1) {
percentMouse = 1;
}
if (percentMouse < 0) {
percentMouse = 0;
}
if (this.orientation === "vertical") {
percentMouse = 1 - percentMouse;
}
valueTotal = this._valueMax() - this._valueMin();
valueMouse = this._valueMin() + percentMouse * valueTotal;
return this._trimAlignValue(valueMouse);
};
}
)(jQuery);
tengo curiosidad de por qué le gustaría que funcione como ¿esta? A menos que la idea sea que no se pueden establecer los valores mínimos y máximos utilizando el control deslizante y no solo la apariencia. De lo contrario, parecerá que el control deslizante no funciona correctamente si no está al final de la diapositiva cuando se establece el valor mínimo o máximo. – pkauko
@pkauko: vea la adición que hice a mi pregunta. –
Ah ok, ahora puedo ver por qué querrías que funcionara como se describe. Lástima que no puedo ayudarte a lograr el comportamiento deseado. Sin embargo, podría tener una idea y la responderé en breve. – pkauko