在 UISlider 下添加数字
Add Numbers under UISlider
我有一个用 JQuery UI
实现的 UISlider。我想在显示数字的滑块下添加一个图例。我跟着 this answer 展示了如何实现它,然后放置带有百分比值的数字。这样,当滑块大小发生变化时(例如,浏览器调整大小),数字仍位于正确的位置。
效果很好,但是如果浏览器 window 很小,或者如果滑块有很多数字,那么图例数字就会彼此太接近。
问题:
如果号码 '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)
,但不会在那里,所以它会 return 一个错误。
当我运行上面的代码时,它会删除除第一个之外的所有数字。
$("#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
缓冲区。只需根据您想要的数字之间的多少 space 相应地调整该数字。
$('#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();
}
});
此外,您遇到的部分问题是所有子 div
元素的宽度固定为 20px
。因此,您无法准确计算元素的左偏移位置,因为文本会溢出。为了解决这个问题,我删除了固定宽度并添加了 transform: translateX(-50%)
以使元素水平居中。
#slider > div {
position: absolute;
text-align: center;
margin-top: 20px;
transform: translateX(-50%);
}
1-50 的范围现在会生成以下内容:
1-100 的范围将生成以下内容:
此外,如果您还想删除这些行,请删除整个元素而不仅仅是数字:
我有一个用 JQuery UI
实现的 UISlider。我想在显示数字的滑块下添加一个图例。我跟着 this answer 展示了如何实现它,然后放置带有百分比值的数字。这样,当滑块大小发生变化时(例如,浏览器调整大小),数字仍位于正确的位置。
效果很好,但是如果浏览器 window 很小,或者如果滑块有很多数字,那么图例数字就会彼此太接近。
问题:
如果号码 '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)
,但不会在那里,所以它会 return 一个错误。
当我运行上面的代码时,它会删除除第一个之外的所有数字。
$("#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
缓冲区。只需根据您想要的数字之间的多少 space 相应地调整该数字。
$('#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();
}
});
此外,您遇到的部分问题是所有子 div
元素的宽度固定为 20px
。因此,您无法准确计算元素的左偏移位置,因为文本会溢出。为了解决这个问题,我删除了固定宽度并添加了 transform: translateX(-50%)
以使元素水平居中。
#slider > div {
position: absolute;
text-align: center;
margin-top: 20px;
transform: translateX(-50%);
}
1-50 的范围现在会生成以下内容:
1-100 的范围将生成以下内容:
此外,如果您还想删除这些行,请删除整个元素而不仅仅是数字: