JQuery UI 范围滑块值

Posted

技术标签:

【中文标题】JQuery UI 范围滑块值【英文标题】:JQuery UI Range Slider values 【发布时间】:2021-10-06 05:07:02 【问题描述】:

我正在使用 JQuery UI Range 滑块。我有自定义 css,我为我的范围从 89 到 98 编写了一些 JS,并在我的滑块的句柄上显示新值。如果我将左手柄移动到 91,我想在左手柄上设置“91”文本。右手柄也是如此。

问题是文本值最初不在正确的位置,当我移动一个手柄时,另一个手柄的值消失了。

这里是代码

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<script
  src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"
  integrity="sha256-T0Vest3yCU7pafRw9r+settMBX6JkKN06dqBnpQ8d30="
  crossorigin="anonymous"></script>

<style>
.ui-slider 

    height: 5px;
    width: 205px;
    position: relative;
    border: none;
    background: #F5A000;
    margin-left: 20px;
    margin: 100px;



.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default 
    background: #3A3A3A;
    /* border-radius: 25px;*/
    outline: none;
    border: 1px solid #3A3A3A;
    position: absolute;
    margin-left: -5px;
    top: -7px;
    width: 4px;
    height: 15px;
    border-radius: 0;


.ui-slider-horizontal .ui-slider-range 
    background: #F5A000;


#labelHolder 
    height: 7px;
    position: relative;
    border: none;


#min,
#max 
    position: absolute;
    margin-left: -.6em;
    text-align: center;
    font-family: Lato, sans serif;
    font-size: 15px;
    font-weight: 600;
    color: #3A3A3A;


</style>


<div id="labelHolder">
    <div id="min"></div>
    <div id="max"></div>
</div>
<div id="slider"></div>

<script>
$("#slider").slider(
    range: true,
    min: 89,
    max: 98,
    step: 1,
    values: [89, 98],
    slide: function(event, ui) 
     if ((ui.values[1] - ui.values[0]) < 1) 
              return false;
          
        var delay = function() 
            var handleIndex = $(ui.handle).data('index.uiSliderHandle');
            var label = handleIndex == 0 ? '#min' : '#max';
            $(label).html(ui.value).position(
                my: 'center top',
                at: 'center bottom',
                of: ui.handle,
                offset: "0, 10"
            );
        ;
        
        // wait for the ui.handle to set its position
        setTimeout(delay, 5);
    
);

$('#min').html($('#slider').slider('values', 0)).position(
    my: 'center top',
    at: 'center bottom',
    of: $('#slider a:eq(0)'),
    offset: "0, 10"
);

$('#max').html($('#slider').slider('values', 1)).position(
    my: 'center top',
    at: 'center bottom',
    of: $('#slider a:eq(1)'),
    offset: "0, 10"
);
</script>

有什么想法吗?

【问题讨论】:

【参考方案1】:

您可以使用each 循环来遍历您在slider 内的span 标签。然后,使用index 的值将是0,1 获取您的处理程序 的值,即: ui.values[index] 然后使用$(this) 获取迭代的当前跨度并将其传递给您的位置。

演示代码

$(document).ready(function() 
  $("#slider").slider(
    range: true,
    min: 89,
    max: 98,
    step: 1,
    values: [89, 98],
    slide: function(event, ui) 
      if ((ui.values[1] - ui.values[0]) < 1) 
        return false;
      
      var delay = function() 
        //loop through the span...
        $("#slider").find(".ui-slider-handle").each(function(index) 
          var label = index == 0 ? '#min' : '#max'; //change selector
          //assign value
          $(label).html(ui.values[index]).position(
            my: 'center top',
            at: 'center bottom',
            of: $(this), // current span which is iterated..
            offset: "0, 10"
          );
        );

      ;

      // wait for the ui.handle to set its position
      setTimeout(delay, 5);
    
  );


  $('#min').html($('#slider').slider('values', 0)).position(
    my: 'center top',
    at: 'center bottom',
    of: $('#slider .ui-slider-handle:eq(0)'),
    offset: "0, 10"
  );

  $('#max').html($('#slider').slider('values', 1)).position(
    my: 'center top',
    at: 'center bottom',
    of: $('#slider .ui-slider-handle:eq(1)'),
    offset: "0, 10"
  );
)
.ui-slider 
  height: 5px;
  width: 205px;
  position: relative;
  border: none;
  background: #F5A000;
  margin-left: 20px;
  margin: 100px;


.ui-state-default,
.ui-widget-content .ui-state-default,
.ui-widget-header .ui-state-default 
  background: #3A3A3A;
  /* border-radius: 25px;*/
  outline: none;
  border: 1px solid #3A3A3A;
  position: absolute;
  margin-left: -5px;
  top: -7px;
  width: 4px;
  height: 15px;
  border-radius: 0;


.ui-slider-horizontal .ui-slider-range 
  background: #F5A000;


#labelHolder 
  height: 7px;
  position: relative;
  border: none;


#min,
#max 
  position: absolute;
  margin-left: -.6em;
  text-align: center;
  font-family: Lato, sans serif;
  font-size: 15px;
  font-weight: 600;
  color: #3A3A3A;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js" integrity="sha256-T0Vest3yCU7pafRw9r+settMBX6JkKN06dqBnpQ8d30=" crossorigin="anonymous"></script>



<div id="labelHolder">
  <div id="min"></div>
  <div id="max"></div>
</div>
<div id="slider"></div>

【讨论】:

感谢您的宝贵建议。但有一个问题。在开始移动手柄之前,我们看不到初始值。如何解决这个问题?谢谢

以上是关于JQuery UI 范围滑块值的主要内容,如果未能解决你的问题,请参考以下文章

单击滑块轨道时获取 Jquery-UI 滑块值?

更改 jQuery UI 滑块值选项时动画滑块句柄?

jQuery UI 滑块值更改时如何运行代码隐藏函数

使用带有 Fontawesome 的 jQuery UI 滑块更改星级

非线性 ui 滑块值/占位符

SwiftUI 滑块值不尊重范围