Перетащите диапазон ползунка диапазона ввода пользовательского интерфейса

<---------[]=====================================[]-------->

0         10                                     90       100

Мне нужен ползунок диапазона ввода с двумя ручками для выбора диапазона и возможность перетаскивания диапазона (знаки равенства на диаграмме выше). Итак, в приведенном выше примере start=10 и end=90, и он перетаскивается влево, сдвигая всю строку между двумя маркерами:

<[]=====================================[]------------------>

0                                       80                 100

Теперь Start равен 0, а End равен 80, что достигается без перетаскивания манипуляторов.

Какая библиотека предлагает эту функциональность?

Спасибо.


person Rudiger    schedule 10.05.2011    source источник
comment
@ Дэйв Джарвис, я сейчас работаю над своим собственным. Нужно бежать, но если вы хотите взглянуть: jsfiddle.net/EXpse/45 Дайте мне знать, если это должен быть фреймворк или что-то вроде этого.   -  person Thomas Shields    schedule 23.05.2011
comment
@Thomas - Похоже, нужно немного поработать. Чтобы соответствовать его потребностям, я рекомендую изменить существующий слайдер пользовательского интерфейса jQuery, чтобы он соответствовал его требованиям.   -  person Justin Ethier    schedule 23.05.2011
comment
Я создал расширение для этого. см. мой ответ.   -  person Gergely Fehérvári    schedule 23.05.2011
comment
@Justin Ethier, @Dave Jarvis да, я мало над этим работал. Я просто показывал, что можно без СЛИШКОМ больших проблем свернуть свой собственный.   -  person Thomas Shields    schedule 23.05.2011


Ответы (6)


Обзор

Расширение виджета JQuery UI Slider для функции rangeDrag. Эта функция позволяет пользователю перетаскивать весь диапазон сразу, вместо того, чтобы перетаскивать маркеры для перемещения диапазона.

Код

https://gist.github.com/3758297

(function( $, undefined ) {

$.widget("ui.dragslider", $.ui.slider, {

    options: $.extend({},$.ui.slider.prototype.options,{rangeDrag:false}),

    _create: function() {
      $.ui.slider.prototype._create.apply(this,arguments);
      this._rangeCapture = false;
    },

    _mouseCapture: function( event ) { 
      var o = this.options;

      if ( o.disabled ) return false;

      if(event.target == this.range.get(0) && o.rangeDrag == true && o.range == true) {
        this._rangeCapture = true;
        this._rangeStart = null;
      }
      else {
        this._rangeCapture = false;
      }

      $.ui.slider.prototype._mouseCapture.apply(this,arguments);

      if(this._rangeCapture == true) {  
          this.handles.removeClass("ui-state-active").blur();   
      }

      return true;
    },

    _mouseStop: function( event ) {
      this._rangeStart = null;
      return $.ui.slider.prototype._mouseStop.apply(this,arguments);
    },

    _slide: function( event, index, newVal ) {
      if(!this._rangeCapture) { 
        return $.ui.slider.prototype._slide.apply(this,arguments);
      }

      if(this._rangeStart == null) {
        this._rangeStart = newVal;
      }

      var oldValLeft = this.options.values[0],
          oldValRight = this.options.values[1],
          slideDist = newVal - this._rangeStart,
          newValueLeft = oldValLeft + slideDist,
          newValueRight = oldValRight + slideDist,
          allowed;

      if ( this.options.values && this.options.values.length ) {
        if(newValueRight > this._valueMax() && slideDist > 0) {
          slideDist -= (newValueRight-this._valueMax());
          newValueLeft = oldValLeft + slideDist;
          newValueRight = oldValRight + slideDist;
        }

        if(newValueLeft < this._valueMin()) {
          slideDist += (this._valueMin()-newValueLeft);
          newValueLeft = oldValLeft + slideDist;
          newValueRight = oldValRight + slideDist;
        }

        if ( slideDist != 0 ) {
          newValues = this.values();
          newValues[ 0 ] = newValueLeft;
          newValues[ 1 ] = newValueRight;

          // A slide can be canceled by returning false from the slide callback
          allowed = this._trigger( "slide", event, {
            handle: this.handles[ index ],
            value: slideDist,
            values: newValues
          } );

          if ( allowed !== false ) {
            this.values( 0, newValueLeft, true );
            this.values( 1, newValueRight, true );
          }
          this._rangeStart = newVal;
        }
      }



    },


    /*
    //only for testing purpose
    value: function(input) {
        console.log("this is working!");
        $.ui.slider.prototype.value.apply(this,arguments);
    }
    */
});

})(jQuery);

Пример

http://jsfiddle.net/omnosis/Swd9S/

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

HTML

<script type="text/javascript" src="js/jquery-1.5.1.min.js"></script>
<script type="text/javascript" src="js/jquery-ui-1.8.13.custom.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.slider.custom.js"></script>
...
<div id="slider"></div>

JavaScript

$(function(){
// Slider
$('#slider').dragslider({
    animate: true,   // Works with animation.
    range: true,     // Must have a range to drag.
    rangeDrag: true, // Enable range dragging.
    values: [30, 70]        
});
});
person Gergely Fehérvári    schedule 23.05.2011
comment
+1 за хорошую работу! Мы должны посмотреть на создание запроса на вытягивание для этого на github.com/jquery/jquery-ui - возможно, они добавят это в будущий релиз (?) - person Justin Ethier; 23.05.2011
comment
Нет проблем, я надеюсь, что их команда будет восприимчива :) - person Justin Ethier; 25.05.2011
comment
Хорошая вещь! Тем не менее, одно небольшое замечание: для исходного кода последняя закрывающая фигурная скобка } перед конечными комментариями имеет запятую после нее, что приведет к ошибке javascript, в зависимости от используемого вами браузера. - person mg1075; 20.12.2012
comment
это потрясающе, спасибо. два бита для других пользователей: для тех, кто использует с require.js, вы можете сохранить это расширение как отдельный файл и использовать прокладку, аналогичную jquery-ui: 'jquery-ui-dragslider': { deps: ['jquery-ui'], exports: "$" }, и убедитесь, что вы вызываете методы в вашем dragslider как $('#slider').dragslider(), а не slider(), или вы получите ошибку jquery-ui о том, что компонент не инициализирован. - person ericsoco; 22.10.2013
comment
Доступен ли этот код для более новой версии (1.10.3) jquery.ui.slider.js? Можно ли перенести эти изменения в git? - person John Smith; 21.11.2013
comment
Работает отлично (спасибо!), за исключением Opera - вместо этого захватывает ближайший дескриптор и изменяет размер.. ? - person T4NK3R; 18.08.2014
comment
Я использую эту реализацию, она отлично работает с мышью. Как я могу вызвать эффект слайда, чтобы двигаться вправо или влево с помощью правой и левой клавиш соответственно? - person partizanos; 02.11.2015
comment
@ericsoco Не могли бы вы немного объяснить вторую часть, пожалуйста. Я не могу вызвать какой-либо геттер или сеттер для $('#slider').dragslider(), но у меня нет проблем с $('#slider').slider() вызовом `$( #slider ).on(slidechange, function(event, ui) {console.log(changed);} );` Заранее спасибо - person Douglas; 06.09.2019
comment
Чтобы ответить на мой вопрос для тех, кто застрял, такие события, как .on("change", function(){});, теперь будут .on("dragslider change", function(){});. Имя пользовательского плагина присоединяется к имени события. - person Douglas; 06.09.2019

noUiSlider предлагает эту функцию. Вы можете использовать его, установив behaviouroption. Он позволяет использовать как фиксированные, так и изменяемые пользователем диапазоны. Нет никаких зависимостей от jQueryUI, и если вы предпочитаете Zepto, а не jQuery: это тоже работает.

введите здесь описание изображения

Раскрытие информации: я являюсь автором плагина.

person Lg102    schedule 30.11.2013

Вы также можете попробовать jQRangeSlider, взгляните на демонстрация.

person ghusse    schedule 29.11.2011

Я рекомендую вам взглянуть на слайдер jQuery UI.

person Justin Ethier    schedule 10.05.2011
comment
Извините, я забыл упомянуть: мне нужно иметь возможность перетаскивать диапазон по ползунку. - person Rudiger; 10.05.2011
comment
Функция перетаскивания не является частью слайдера пользовательского интерфейса jQuery. - person Dave Jarvis; 23.05.2011
comment
@ Дэйв - я знаю, я ответил на его вопрос, прежде чем он добавил это требование. - person Justin Ethier; 23.05.2011
comment
Но при этом, вероятно, можно изменить ползунок для поддержки перетаскивания диапазона. И разработчики пользовательского интерфейса jQuery обсуждали добавление этой функции. - person Justin Ethier; 23.05.2011

Вы можете попробовать использовать слайдер пользовательского интерфейса jQuery.

Ссылка выше демонстрирует функцию селектора «диапазон», которую вы ищете, но есть и множество других способов ее использования.

person Thomas Shields    schedule 10.05.2011
comment
Какие есть другие способы? Насколько я могу судить, слайдер пользовательского интерфейса jQuery не поддерживает перетаскивание диапазона по слайдеру. - person Rudiger; 10.05.2011
comment
У него есть диапазон, да, но нет возможности перетащить сам диапазон. Вы должны перетащить конечные точки диапазона. - person Dave Jarvis; 23.05.2011

Вы можете попробовать добавить триггеры перетаскивания к элементу $('.ui-slider-range')
ИЛИ
добавить свое собственное событие к элементу $('.ui-slider-range'), которое просто запускает события на $('.ui-slider-handle')

person Johan Olsson    schedule 23.05.2011
comment
Это подход, который я использую, так как он немного чище, но вам нужно обеспечить некоторое управление маркерами при перетаскивании ползунка. Установка ui.values[0] и [1] является наиболее прямым способом, но ваша реализация будет определять, как вы определяете эти значения. Я использовал сравнение pageX и slider.left в сочетании с заданной шириной тика, чтобы определить, на сколько тиков перемещать значения при перетаскивании. YMMV. - person J E Carter II; 25.09.2013