37

私は jQuery 1.4.2 と jQuery ui 1.8.5 の使用に制限されています (これは選択によるものではありません。最新バージョンへのアップグレードを求めないでください)。スライドバーの上に現在の値を表示するスライダーを作成しましたが、今必要なのは、スライダーと同じ距離のスライドバーの下に凡例を設定する方法です (つまり、スライダーの幅が 100px で、5 つの値がある場合)スライダーは 20px ごとにスナップします (この例では、凡例の値を 20px 間隔で配置したいと思います)。

これが私が欲しいものの例です:

スライダー

これが私が持っている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.
4

5 に答える 5

63

投稿されたソリューションは完全に機能しますが、追加のプラグインを必要とせず、これを生成する別のソリューションを次に示します ( fiddleを参照)。

シンプルなラベルのスライダー

方法は次のとおりです。

  1. スライダーを開始します。

  2. 可能な値のそれぞれについて、label要素を追加しますposition: absolute(スライダーは既にposition: relativeであるため、ラベルはスライダーに対して相対的に配置されます)。

  3. ごとに、プロパティをパーセンテージlabelに設定します。left

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

    }

});
于 2013-06-01T21:58:11.513 に答える
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」というスタイルを指定する必要があります。そうしないと、各ラベルが 1 行になるか、ラベルが隣同士に積み重なって表示されます。

問題と解決策を説明する投稿を作成しました: jQuery UI Slider Legend Under Sliderには、この動作のライブ デモが含まれています。

于 2012-04-19T09:26:23.420 に答える
12

同じものを探していて、フィラメントグループの jQuery UI Sliderを使用することになりました(魅力的に機能し、安定しているように見えます)。やがて jQuery UI コンポーネントにマージされる予定だと思います...

ここに記事と例への参照+私が行った最小化されたjsfiddle

Select 要素からの jQuery UI スライダー - ARIA をサポート

これは、フィラメント グループのラボ記事の例です。

最小化された jsfiddle の例の動作 -更新され動作中

ところで、より単純なスライダー(範囲なし)を使用したい場合は、2番目のselect要素を削除するだけで済みます


仕事をする別の素晴らしいプラグイン:jslider

于 2012-08-28T09:48:58.407 に答える
8

カスタム ラベルを使用し、ラベル サイズを固定しないもう 1 つのソリューション。

JSビン

于 2013-07-18T19:28:45.460 に答える