Добавить заполнение в jQuery UI Slider - PullRequest
6 голосов
/ 01 октября 2010

Есть ли простой способ добавить отступы на ползунок jQuery UI Slider? Я бы хотел, чтобы ручка-слайдер не доходила до концов бара. Так что, если это обычный левый конец:

no padding
\/
[]------------------

Мне бы хотелось, чтобы на левом (и правом) конце имелся отступ:

padding of 10px for instance
\/
--[]----------------

Я попробовал это в файле CSS:

.ui-slider-horizontal { height: .8em; padding: 0 10px; }

Но, похоже, jQuery UI Slider использует полную (outerWidth()) ширину для определения диапазона скольжения ручки вместо ширины без заполнения. Я также попытался взломать код, заменив outerWidth() на width(), но ничего не получилось.

Я явно не хочу прибегать к взлому установки минимальных и максимальных значений. Значения всегда должны работать как положено.

Есть предложения?

Edit:

После комментария pkauko; Я использую ползунок как элемент с тремя надписями над ним:

   not                      very
important    important    important
----[]-----------[]----------[]----

На приведенном выше рисунке показаны места, где я хочу, чтобы ручка находилась в центре под метками. Но штангу визуально нужно растянуть до краев.

Ответы [ 2 ]

8 голосов
/ 01 октября 2010

Хорошо, я сам часто этого хотел, но на самом деле у меня никогда не было мотивации сесть и что-то в этом роде.Поскольку вы спросили сейчас, я сел и взломал ползунок jQuery UI, чтобы добавить параметры заполнения по вашему запросу.

Примечание: я добавил его только для горизонтальных ползунков с одной ручкой.Другие случаи не более сложны.У меня просто не было мотивации выполнять набор текста и последующее тестирование, чтобы охватить случаи, которые, вероятно, не были нужны прямо сейчас.

Включите этот код после того, как вы включили оригинальный Slider из jQuery UI.Расширение перезаписывает несколько методов и добавляет опции «paddingMin» и «paddingMax» в виджет «Слайдер» (значения должны быть числовыми и будут интерпретироваться как пиксели; это тоже может быть легко расширено, чтобы брать другие единицы, очевидно, но сновабудет означать больше ввода / тестирования для незапрошенных в настоящее время дел).

Простой пример использования:

$('#slider').slider({ paddingMin: 50, paddingMax: 100 });

Код взлома расширения (предоставляется как есть, не судитесь со мной):

(
    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);
3 голосов
/ 01 октября 2010

Даст ли желаемый эффект «привязка к приращениям» в сочетании с «несовместимыми» (неравномерными по значениям привязки) минимальными и максимальными значениями?Я знаю, что это, скорее всего, приведет к преобразованию значений на стороне приложения, поскольку этого, вероятно, нельзя получить с использованием значений, используемых сейчас, но вот «решение», если оно работает.

Что я 'm предлагает установить минимальное значение, скажем, 750. Например, значение привязки равно 1200, а максимальное значение - 4050. Таким образом, минимальное значение привязки на 450 больше минимального значения, и ползунок никогда не должен достигать крайнего левого края.То же самое для максимального значения, это 3 x 1200 + 450 = 4050. Используемые здесь значения являются произвольными и только для примера.

Не проверял это и не знаю, работает ли он, и я знаю, что это не такто, что вы искали, но просто идея, которая пришла мне в голову, когда я проверил примеры того, как работает jQuery UI Slider на jqueryui.com.

Редактировать: не мог отпустить это, и теперь я знаю,это работает так, что не позволяет слайдеру достичь концов слайда.Вам просто нужно установить начальное значение соответствующим образом, чтобы ползунок не находился на одном конце или другом, когда страница загружается.

...