滑块下的jQuery UI滑块标签

时间:2012-04-19 09:03:11

标签: jquery jquery-ui jquery-ui-slider

我仅限于使用jQuery 1.4.2和jQuery ui 1.8.5(这不是选择,请不要让我升级到最新版本)。我创建了一个滑块,显示滑动条上方的当前值,但我现在需要的是一种方法来填充滑块下方与滑块相同距离的图例(即如果滑块宽度为100px且有五个值滑块将每20px捕捉一次。在本例中,我希望图例中的值以20px的间隔放置。)

这是我想要的一个例子:

Slider

这是我的jQuery(从ui滑块演示页面吸收):

//select element with 5 - 20 options
var el = $('.select');

//add slider
var slider = $( '<div class="slider"></div>' ).insertAfter( el ).slider({
    min: 1,
    max: el.options.length,
    range: 'min',
    value: el.selectedIndex + 1,
    slide: function( event, ui ) {
      el.selectedIndex = ui.value - 1;
      slider.find("a").text(el.options[el.selectedIndex].label);
    },
    stop: function() {
      $(el).change();
    }
});

slider.find("a").text(el.options[el.selectedIndex].label); //pre-populate value into slider handle.

5 个答案:

答案 0 :(得分:63)

发布的解决方案完全可行,但这是另一个不需要额外插件的解决方案并产生此解决方案(请参阅fiddle):

a slider with simple labels

以下是如何操作:

  1. 启动滑块。

  2. 对于每个可能的值,使用label附加position: absolute元素(滑块已经为position: relative,因此标签将相对于滑块定位)。

  3. 对于每个label,请将left属性设置为百分比。

  4. CSS

    #slider label {
      position: absolute;
      width: 20px;
      margin-top: 20px;
      margin-left: -10px;
      text-align: center;
    }
    

    JS

    // A slider with a step of 1
    $("#slider").slider({
        value: 4,
        min: 1,
        max: 7,
        step: 1
    })
    .each(function() {
    
        // Add labels to slider whose values 
        // are specified by min, max
    
        // Get the options for this slider (specified above)
        var opt = $(this).data().uiSlider.options;
    
        // Get the number of possible values
        var vals = opt.max - opt.min;
    
        // Position the labels
        for (var i = 0; i <= vals; i++) {
    
            // Create a new element and position it with percentages
            var el = $('<label>' + (i + opt.min) + '</label>').css('left', (i/vals*100) + '%');
    
            // Add the element inside #slider
            $("#slider").append(el);
    
        }
    
    });
    

答案 1 :(得分:21)

要创建一个图例,我们需要知道滑块的宽度和元素的数量,然后将一个元素与另一个元素分开:

//store our select options in an array so we can call join(delimiter) on them
var options = [];
for each(var option in el.options)
{
  options.push(option.label);
}

//how far apart each option label should appear
var width = slider.width() / (options.length - 1);

//after the slider create a containing div with p tags of a set width.
slider.after('<div class="ui-slider-legend"><p style="width:' + width + 'px;">' + options.join('</p><p style="width:' + width + 'px;">') +'</p></div>');

p标签需要使用'display:inline-block'样式才能正确渲染,否则每个标签将占用一行,或者标签将叠加在一起。

我创建了一篇解释问题和解决方案的帖子:jQuery UI Slider Legend Under Slider,其中包含此工作的现场演示。

答案 2 :(得分:11)

一直在寻找相同的东西,最终使用了 jQuery UI Slider by filamentgroup (它的工作方式就像一个魅力并且看起来很稳定)我认为及时计划将它合并到jQuery中UI组件......

这里有一篇文章和例子的参考文献+最小化的jsfiddle我做了

jQuery UI Slider from a Select Element - now with ARIA Support

This is an example from the Filament Group Lab Article

Working minimized jsfiddle example - Updated and Working

b.t.w如果想要使用更简单的滑块(没有范围),则只需删除第二个select元素


完成这项工作的另一个不错的插件:jslider

答案 3 :(得分:6)

使用自定义标签并且没有固定标签尺寸的另一种解决方案。

JS Bin

答案 4 :(得分:0)

对于只有标签的带有标签的滑块,我有一个简单的解决方案。

enter image description here

您只需将div设置到希望滑块移到的位置

<div class="sliderWithLabels" id="mySlider1"></div>

然后调用setup方法,该方法会将标签添加到滑块的相关索引处。

// setupSlider(divId, labelArray, initialIndex);
setupSlider('mySlider3', ["label1", "label2", "label3", "label3"], 3);

有关完整代码,请参见下面的代码笔

https://codepen.io/larnott/pen/WNeErqE