Слайдер JQuery UI, как заставить окно следовать за обработчиком? - PullRequest
16 голосов
/ 21 декабря 2011

Я пытаюсь создать div, который должен следовать за обработчиком, как показано здесь: http://m1.dk/Priser/#tab:#calc,#abb

Мой JSfiddle: http://jsfiddle.net/z3xV3/2/

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

Вот иллюстрация, которую я хочу достичь: enter image description here

HTML:

<div id="slider"></div>
<input id="sliderValue" />

Jquery:

$(document).ready(function() {


 // Pris slider
$("#slider").slider({value:'',min: 0,max: 150,step: 1, range: 'min',
    slide: function( event, ui ) {
        $( "#amount" ).html( ui.value + ' timer');
    }
});

    $( "#amount" ).val( "$" + $( "#slider" ).slider( "value" ) );


});

Ответы [ 8 ]

16 голосов
/ 29 декабря 2011

Я надеюсь, что вы ищете тот эффект: http://jsfiddle.net/z3xV3/11/

JS

$(document).ready(function() {

    $("#slider").slider({value:'', min: 0, max: 150, step: 1, range: 'min'});

    var thumb = $($('#slider').children('.ui-slider-handle'));   
    setLabelPosition();    

    $('#slider').bind('slide', function () {        
        $('#sliderValue').val($('#slider').slider('value'));
        setLabelPosition();
    });

    function setLabelPosition() {
        var label = $('#sliderValue');
        label.css('top', thumb.offset().top + label.outerHeight(true));
        label.css('left', thumb.offset().left - (label.width() - thumb.width())/ 2);  
    }

});

HTML

<div id="slider"></div>
<input id="sliderValue" />

CSS

#sliderValue {
    position:absolute;
    width: 50px;
}

С наилучшими пожеланиями!

6 голосов
/ 29 декабря 2011

Я изменил ваш пример jsfiddle: http://jsfiddle.net/Dr5UR/

$("#amount").val("$" + $("#slider").slider({
    slide: function(event, ui) {
        $('#sliderValue').css('left', event.clientX).val(ui.value);
    }
}));

Я использую событие слайдера слайдер .

Событие слайда получило двааргументы:

  1. событие

    Этот объект содержит несколько сведений о самом событии.Время срабатывания, нажатая клавиша или координаты мыши в момент срабатывания.Свойство clientX содержит позицию, которую нам нужно установить для движущегося объекта.

  2. ui

    Объект пользовательского интерфейса приходитиз самого jQuery UI.В основном это просто содержит значение.Кроме того, он содержит якорь, который также используется для перетаскивания.Но вы не можете использовать его положение, потому что событие слайда вступает в силу до того, как якорь займет свое новое положение.


Вход #slideValue должен иметь position: absolute;,потому что я работаю с левым атрибутом позиции в CSS.Вы также можете установить значение margin-left без необходимости устанавливать position на absolute.

4 голосов
/ 29 декабря 2011

На самом деле довольно легко (и очень полезно) превратить это в простой плагин jQuery.Вот так:

JSFiddle: http://jsfiddle.net/PPvG/huYRL/

Обратите внимание, что я добавил поддержку для перемещения ползунка, введя значение в #sliderValue.

[Пример кода удален]

Вы также можете удалить #sliderValue из HTML и позволить плагину создать его для вас.В этом случае вы переписали бы плагин так, чтобы он вызывался на слайдере, а не на #sliderValue.На мой взгляд, это было бы гораздо более удачным решением.

Обновление

На основе ваших комментариев (и перечитывания вашего вопроса) я переписал пример плагина.

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

JSFiddle: http://jsfiddle.net/PPvG/q5qg7/

HTML

<div id="slider"></div>

Плагин

(function($) {

    $.fn.sliderLabel = function(options) {

        var settings = $.extend({
            marginTop: 2,
            // Margin between the slider handle and the label (in pixels)
            callback: function(value) {
                return 'Value: ' + value;
            }
        }, options);

        return this.each(function() { // <- maintains chainability
            var slider = $(this);
            var handle = slider.children('.ui-slider-handle');
            var data = slider.data('sliderLabel');

            if (handle.length === 0) {
                // $(this) isn't a slider (it has no handle)
                console.log('[SliderLabel] Error: sliderLabel() can only be called on a slider.');
                return;
            }

            if (data === undefined) {
                // First time sliderLabel() is called on this slider
                data = {
                    label: $('<div class="ui-slider-label" />').css('position', 'absolute'),
                    callback: settings.callback
                };

                data.label.insertAfter(slider);

                function updateLabel() {
                    var value = slider.slider('value');
                    var labelText = data.callback(value);

                    data.label.html(labelText);
                    data.label.css('top', handle.offset().top + handle.outerHeight() + settings.marginTop);
                    data.label.css('left', handle.offset().left - ((data.label.width() - handle.width()) / 2));
                }

                updateLabel();
                slider.bind('slide', updateLabel);

            } else {
                // sliderLabel() was called before; just update the callback:
                data.callback = settings.callback;
                updateLabel();
            }

            // Save (or update) the data inside the slider:
            slider.data('sliderLabel', data);
        });
    }
})(jQuery);

Использование

$("#slider").slider();

$("#slider").sliderLabel({
    callback: function(value) {
        return value + '%';
    }
});

Как видите, плагин теперь вызывается на самом слайдере.Теперь вы можете снабдить плагин обратным вызовом, который позволяет выполнять некоторые вычисления и возвращать правильно отформатированную метку (допустим HTML).

В приведенном выше примере обратный вызов просто принимает value, то естьпередается обратному вызову и добавляет '%'.

2 голосов
/ 09 июля 2013

Вот рабочий пример слайдера с двумя ручками

enter image description here

   $('#slider').slider({
        range: true,
        min: 500,
        max: 10000,
        step: 100,
        values: [1000, 2000],
        slide: function( event, ui ) {
            $('#min-price').html('$' + ui.values[0]);
            $('#min_budget').val(ui.values[0]);
            $('#max-price').html('$' + ui.values[1]);
            $('#max_budget').val(ui.values[1]);
            }

            //move labels when handles are moved
            moveValueLabels();
        }
    });

    //move the value labels directly under the handles
    function moveValueLabels() {
        var pos_first_handle = $('.ui-slider-handle:first').position();
        var pos_last_handle = $('.ui-slider-handle:last').position();
        $('#min-price').css('left', (pos_first_handle.left - ($('#min-price').width()/2)));
        $('#max-price').css('left', (pos_last_handle.left - ($('#max-price').width()/2)));
    }

    //set initial positioning of labels when page is loaded
    moveValueLabels();

CSS:

#slider {
    overflow: visible;
    #min-price {
        position:absolute;
        top:20px;
        font-weight: bold;
        padding:0;
    }
    #max-price {
        position:absolute;
        top:20px;
        font-weight: bold;
        padding:0;
    }
}
1 голос
/ 02 сентября 2013

HTML:

<div id="slider"></div>

CSS:

#slider {
    width: 200px;
}
#sliderValue {
    position: absolute;
    left: 0;
    bottom: -30px;
    width: 40px;
}

JQuery:

$("#slider").slider({
    value: '',
    min: 0,
    max: 100,
    range: 'min',
    create: function (event, ui) {
        $('.ui-slider-handle').append('<input id="sliderValue" />');
    },
    slide: function (event, ui) {
        $("#sliderValue").val(ui.value);
    }
});

http://jsfiddle.net/yBfTy/4/

0 голосов
/ 05 января 2012

Вы можете просто: http://jsfiddle.net/z3xV3/21/

$(document).ready(function() {
    $("#slider").slider({
        value:0,
        min: 0,
        max: 150,
        step: 1,
        range: 'min',
        slide: function( event, ui ) {
            var offsetLeft = $(this).find(".ui-slider-handle").offset().left;
            $( "#sliderValue" )
                .val( ui.value + ' timer')
                .css({
                    "position": "absolute",
                    "left": offsetLeft
                });
        }
    });
});

Обратный вызов слайда вызывается каждый раз, когда вы перемещаете ручку:

offsetLeft - это смещение ручки.

$( "#sliderValue" ) ваш ввод.

0 голосов
/ 05 января 2012

Принимая jsfiddle.

HTML:

<div id="slider"></div>
<input id="sliderValue" />

CSS:

#sliderValue{width:50px;}

Jquery:

$(document).ready(function() {


 // Pris slider
$("#slider").slider({value:'',min: 0,max: 150,step: 1, range: 'min',
    slide: function( event, ui ) {
        $( "#sliderValue" ).val( ui.value + ' timer');
        var offset = $(this).find('a').css("left");
        $("#sliderValue").css("margin-left", offset);
    }
});

    $( "#sliderValue" ).val($( "#slider" ).slider( "value" ));


});
0 голосов
/ 05 января 2012

Было бы неплохо взглянуть на альтернативные решения с плагинами jQuery, такие как:

...