【问题标题】:Jquery UI slider how to make a box follow the handler?Jquery UI滑块如何使一个框跟随处理程序?
【发布时间】:2012-01-24 20:04:44
【问题描述】:

我正在尝试创建一个应该遵循处理程序的 div,如下所示: http://m1.dk/Priser/#tab:#calc,#abb

我的 JSfiddle:http://jsfiddle.net/z3xV3/2/

我还想计算应该出现在框中的 UI 值。

这是我想要实现的插图:

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" ) );


});

【问题讨论】:

    标签: javascript jquery-ui jquery jquery-plugins


    【解决方案1】:

    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/

    【讨论】:

    • +1 这正是我会做的,也是最简单的解决方案
    【解决方案2】:

    这是一个带有两个手柄的滑块的工作示例

       $('#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;
        }
    }
    

    【讨论】:

      【解决方案3】:

      我希望这就是你想要的效果: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;
      }
      

      最好的问候!

      【讨论】:

      • 这对“点击”不起作用,它被认为是滑块中的“滑动”。
      【解决方案4】:

      你可以: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" ) 是您的输入。

      【讨论】:

        【解决方案5】:

        拿着你的 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" ));
        
        
        });
        

        【讨论】:

          【解决方案6】:
          【解决方案7】:

          把它变成一个简单的 jQuery 插件实际上很容易(而且非常有用)。像这样:

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

          请注意,我通过在#sliderValue 中输入值来添加对移动滑块的支持。

          [删除代码示例]

          您也可以选择从 HTML 中删除 #sliderValue 并让插件为您创建它。在这种情况下,您将重写插件,以便在滑块上调用它,而不是在 #sliderValue 上调用。在我看来,这将是一个更简洁的解决方案。

          更新

          根据您的 cmets(并重新阅读您的问题),我重写了插件示例。

          如果我理解正确,您想根据滑块的值进行一些计算,并将这些计算的结果显示在滑块句柄下方的标签中。以下内容应该让这变得非常容易。

          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 传递给回调并附加'%'

          【讨论】:

          • 我想跟随滑块的不是输入,而是与输入字段具有相同值的div。 jsfiddle.net/VnAXZ/3
          • jsfiddle.net/VnAXZ/4 - 奇怪的是,使用时先将手柄向右拖动,然后向左拖动宽度改变..
          • @Railsbeginner:是的,我也注意到了这种奇怪的行为。出于某种原因,handle.offset() 在向左移动手柄时和向右移动手柄时返回不同的值。 5px 关闭。稍后我会尝试查看滑块插件的源代码,当我有更多时间时。
          【解决方案8】:

          我修改了你的 jsfiddle 示例:http://jsfiddle.net/Dr5UR/

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

          我利用slider的幻灯片事件。

          幻灯片事件有两个参数:

          1. 事件

            此对象包含有关事件本身的若干信息。触发时间、被按下的按键或触发时鼠标的坐标。 clientX 属性包含我们需要为移动对象设置的位置。

          2. 用户界面

            ui 对象来自 jQuery UI 本身。它基本上只包含值。此外,它还包含用于拖动的锚。但是你不能使用它的位置,因为滑动事件在锚点占据新位置之前生效。


          #slideValue 输入需要有position: absolute;,因为我在 CSS 中使用左侧位置属性。您也可以设置margin-left 的值,而无需将position 设置为absolute

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-19
            相关资源
            最近更新 更多