javascript - 在 UISlider 下添加数字

标签 javascript jquery jquery-ui uislider

我有一个使用 JQuery UI 实现的 UISlider。我想在显示数字的 slider 下添加一个图例。我关注了this answer它展示了如何实现它,然后放置带有百分比值的数字。这样,当 slider 大小发生变化时(例如,浏览器调整大小),数字仍位于正确的位置。

这很好用,但是如果浏览器窗口很小,或者如果 slider 有很多数字,那么图例数字就会彼此太接近。

问题:
如果数字太接近“x”,我该如何删除数字。

这是我尝试做的:

if (i !== 0) {
    var prevLegendNum_offsetLeft = $('#legendNum' + i).closest('.sliderLegend').find('.sliderLegendNum').offset().left

    var distance = $('#legendNum' + i).offset().left - prevLegendNum_offsetLeft;
    console.log(distance); // Logs: 0

    if (distance <= 35) {
        $('#legendNum' + i).remove();
    }
}

我之所以必须用 prevLegendNum_offsetLeft 而不仅仅是 $('#legendNum' + (i - 1)) 来完成整个事情的原因是,如果有3个数字彼此之间的距离小于35,所以i后面的2个数字将被删除。然后它会尝试访问 $('#legendNum' + (i - 1),但不会在那里,所以它会返回一个错误。

当我运行上面的代码时,它会删除除第一个数字之外的所有数字。

JSFiddle

$("#slider").slider({
    value: 4,
    min: 1,
    max: 15,
    step: 1
  })
  .each(function() {
    var opt = $(this).data().uiSlider.options;
    var vals = opt.max - opt.min;

    for (var i = 0; i <= vals; i++) {
      var el = $('<div class="sliderLegend"><div class="sliderLegendMark">|</div><div class="sliderLegendNum" id="legendNum' + i + '">' + (i + 2) + '</div></div>').css('left', (i / vals * 100) + '%');
      $('#slider').append(el);

      if (i !== 0) {
        var prevLegendNum_offsetLeft = $('#legendNum' + i).closest('.sliderLegend').find('.sliderLegendNum').offset().left

        var distance = $('#legendNum' + i).offset().left - prevLegendNum_offsetLeft;
        console.log(distance);

        if (distance <= 35) {
          $('#legendNum' + i).remove();
        }
      }
    }

  });
#slider > div {
  position: absolute;
  width: 20px;
  margin-left: -10px;
  text-align: center;
  margin-top: 20px;
}
/* below is not necessary, just for style */

#slider {
  width: 50%;
  margin: 2em auto;
}
<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<link rel="stylesheet" href="http://code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css">
<div id="slider"></div>

最佳答案

您可以遍历所有 .sliderLegend元素(第一个除外),并将该元素的左侧位置与最近的前一个元素的右侧位置进行比较。

如果最近的前一个元素的右侧大于当前元素的左侧,那么您就知道它们重叠了,您可以删除当前正在迭代的元素。

在下面的例子中,条件是left < prevRight + 6 , 所以有一个 6px缓冲。只需根据您希望数字之间的间距调整该数字即可。

Updated Example

$('#slider .sliderLegend').slice(1).each(function() {
  var left = $(this).position().left,
    $prev = $(this).prevAll(':has(.sliderLegendNumber)').first(),
    prevRight = $prev.position().left + $prev.width(),
    $item = $(this).is(':last-child') ? $prev : $(this);

  if (left < prevRight + 6) {
    $item.find('.sliderLegendNumber').remove();
  }
});

此外,您遇到的部分问题是所有 child div元素的固定宽度为 20px .因此,您无法准确计算元素的左偏移位置,因为文本会溢出。为了解决这个问题,我删除了固定宽度并添加了 transform: translateX(-50%)为了使元素水平居中。

Updated Example

#slider > div {
  position: absolute;
  text-align: center;
  margin-top: 20px;
  transform: translateX(-50%);
}

1-50 的范围现在会生成以下内容:

1-50

1-100 的范围将生成以下内容:

1-100

此外,如果您还想删除这些行,请删除整个元素而不仅仅是数字:

1-100; no lines

关于javascript - 在 UISlider 下添加数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33980021/

相关文章:

jquery - float 和 jQuery UI 按钮

javascript - jQuery UI 可拖动不拖动 RTL 页面中的 X 轴

javascript - D3.js 链式过渡,用于不同形状的复合动画

javascript - 为什么 x() == window if var x = [].reverse?

javascript - 使用 javascript 获取自定义 header ?

php - 弹出窗口在 IE 6 中不显示

javascript - 如果其他打开则关闭切换框

javascript - 无法使用 Django 设置 jquery pjax(未设置 header ,但添加了 GET 参数)

javascript - 在 jQuery 中用 <p> 替换 <img>

c# - JQuery 将值设置为自定义服务器控件