【问题标题】:Slider with Multiple Handle and Background Color for content具有多个句柄和背景颜色的内容滑块
【发布时间】:2012-05-07 15:48:29
【问题描述】:

我正在尝试使用可以有多个句柄的 Jquery UI 滑块:

$(function () {
        var handlers = [25, 50, 75];
        $("#slider").slider({
            min: 0,
            max: 100,
            values: handlers,
            slide: function (evt, ui) {
                for (var i = 0, l = ui.values.length; i < l; i++) {
                    if (i !== l - 1 && ui.values[i] > ui.values[i + 1]) {
                        return false;
                    }
                    else if (i === 0 && ui.values[i] < ui.values[i - 1]) {
                        return false;
                    }
                }
            }
        });
    });

请注意,一个处理程序不能重叠,我需要在加载时动态设置处理程序,并在更改时保存处理程序位置。

我想要完成的事情是将处理程序之间的 ui 内容着色为不同的颜色。我附上了一张图片。

如果可能,请告知。

【问题讨论】:

  • 在加载时动态设置处理程序由 jQuery UI 处理,您在上面提供的代码将使用动态值。它还注意不让处理程序重叠。处理程序之间的内容着色不是 jQuery UI 内置的,但可以做到。目前我能想到的最好的想法是使用适当的background-color 创建绝对定位的 div,并在手柄移动时动态放置它们。我会看看我以后能不能想出一个具体的实现。这是一个起点 - jsfiddle.net/LLfWd
  • 谢谢。我很想看到具体的实施!非常感谢您的帮助。

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


【解决方案1】:

一种可能性是将滑块背景设置为 CSS 渐变,并在滑块值更改时更新代码中的渐变色块:

$(function () {
    // the code belows assume the colors array is exactly one element bigger 
    // than the handlers array.
    var handlers = [25, 50, 75];
    var colors = ["#ff0000", "#00ff00", "#0000ff", "#00ffff"];
    updateColors(handlers);

    $("#slider").slider({
        min: 0,
        max: 100,
        values: handlers,
        slide: function (evt, ui) {
            updateColors(ui.values);
        }
    });

    function updateColors(values) {
        var colorstops = colors[0] + ", "; // start left with the first color
            for (var i=0; i< values.length; i++) {
                colorstops += colors[i] + " " + values[i] + "%,";
                colorstops += colors[i+1] + " " + values[i] + "%,";
            }
            // end with the last color to the right
            colorstops += colors[colors.length-1];

            /* Safari 5.1, Chrome 10+ */
            var css = '-webkit-linear-gradient(left,' + colorstops + ')';
            $('#slider').css('background-image', css);
    }
});​

http://jsfiddle.net/LLfWd/60/

此代码适用于 chrome 和 safari。我的猜测是你只需要生成多个渐变字符串(用于 -moz-linear-gradient、-ms-linear-gradient 等),就像我在这里为 -webkit-linear-gradient 所做的那样。

【讨论】:

    【解决方案2】:

    (⌐■_■) 你好,我下面附加的代码实现了 (i) 3 个 JQuery UI Slider 句柄,这意味着 4 个范围,(ii) 范围值不冲突,(iii) 范围着色,(iv)手柄上的标题工具提示和 (v) 范围值的显示。请注意,我使用的是旧的 JQuery 版本。此外,它有一个模式,这意味着它很可能被重新编码以优雅地支持 >=4 句柄。

    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Test Slider</title>
    
        <link type="text/css" href="css/jquery-ui-1.7.2.custom.css" rel="stylesheet" />
        <script src="js/jquery-1.3.2.min.js" type="text/javascript"></script>
        <script src="js/jquery-ui-1.7.2.custom.min.js" type="text/javascript"></script>
    </head>
    
    <body>
        <style>
        div.demo { padding: 10px !important; };
        </style>
        <div class="demo">
    
            <p>
                <label>% Style:</label>
                <input type="text" id="weightage_style" style="border:0; color:#f6931f; font-weight:bold;" />
                <br />
                <label>% Design:</label>
                <input type="text" id="weightage_design" style="border:0; color:#f6931f; font-weight:bold;" />
                <br />
                <label>% Correctness:</label>
                <input type="text" id="weightage_correctness" style="border:0; color:#f6931f; font-weight:bold;" />
                <br />
                <label>% Others:</label>
                <input type="text" id="weightage_others" style="border:0; color:#f6931f; font-weight:bold;" />
                <br />
            </p>
    
            <div id="weightage_slider" style="font-size:12px;width:300px;"></div>
    
        </div>
    
        <script>
            $( "#weightage_slider" ).slider({ 
                min: 0,
                max: 100,
                orientation: "horizontal", 
                step: 1, 
                values: [ 10, 40, 90 ], // set three handles
                slide: function( event, ui ) {
                    // NOTE: during slide, the following sequence occurs: (i) change ui.value (ii) call this function (iii) move the slider handle
    
                    // these four lines update the display of handle ranges
                    $( "#weightage_style" ).val( "0" + " - " + $( "#weightage_slider" ).slider('values', 0) );
                    $( "#weightage_design" ).val( $( "#weightage_slider" ).slider('values', 0) + " - " + $( "#weightage_slider" ).slider('values', 1) );
                    $( "#weightage_correctness" ).val( $( "#weightage_slider" ).slider('values', 1) + " - " + $( "#weightage_slider" ).slider('values', 2) );
                    $( "#weightage_others" ).val( $( "#weightage_slider" ).slider('values', 2) + " - " + "100" );
    
                    if ( ui.handle == $( "#weightage_slider_0" ).get(0) ) {
                        if(ui.values[ 0 ] >= ui.values[ 1 ]){
                            $( "#weightage_slider" ).slider('values', 0, ui.values[ 1 ]); // triggers change event
                            return false;
                        } else {
                            // handle-0 will move
                            // update display of colored handle ranges
                            $( "#weightage_slider_a" ).css('left', '0%');
                            $( "#weightage_slider_a" ).css('width', (ui.values[ 0 ] + '%'));
                            $( "#weightage_slider_b" ).css('left', (ui.values[ 0 ] + '%'));
                            $( "#weightage_slider_b" ).css('width', ((ui.values[1] - ui.values[0]) + '%'));
                        }
                    }
    
                    if ( ui.handle == $( "#weightage_slider_1" ).get(0) ) {
                        if(ui.values[ 1 ] <= ui.values[ 0 ]){
                            $( "#weightage_slider" ).slider('values', 1, ui.values[ 0 ]); // triggers change event
                            return false;
                        }else if(ui.values[ 1 ] >= ui.values[ 2 ]){
                            $( "#weightage_slider" ).slider('values', 1, ui.values[ 2 ]); // triggers change event
                            return false;
                        }else{
                            // handle-1 will move
                            // update display of colored handle ranges
                            $( "#weightage_slider_b" ).css('left', (ui.values[ 0 ] + '%'));
                            $( "#weightage_slider_b" ).css('width', ((ui.values[1] - ui.values[0]) + '%'));
                            $( "#weightage_slider_c" ).css('left', (ui.values[ 1 ] + '%'));
                            $( "#weightage_slider_c" ).css('width', ((ui.values[2] - ui.values[1]) + '%'));
                        }
                    }
    
                    if ( ui.handle == $( "#weightage_slider_2" ).get(0) ) {
                        if(ui.values[ 2 ] <= ui.values[ 1 ]){
                            $( "#weightage_slider" ).slider('values', 2, ui.values[ 1 ]); // triggers change event
                            return false;
                        } else{
                            // handle-2 will move
                            // update display of colored handle ranges
                            $( "#weightage_slider_c" ).css('left', (ui.values[ 1 ] + '%'));
                            $( "#weightage_slider_c" ).css('width', ((ui.values[2] - ui.values[1]) + '%'));
                            $( "#weightage_slider_d" ).css('left', (ui.values[ 2 ] + '%'));
                            $( "#weightage_slider_d" ).css('width', ((100 - ui.values[2]) + '%'));
                        }
                    }
                }, 
                change: function( event, ui ) {
                    // because slide event has function that changes handles' value programmatically, the following is necessary
    
                    // these four lines update the display of handle ranges
                    $( "#weightage_style" ).val( "0" + " - " + $( "#weightage_slider" ).slider('values', 0) );
                    $( "#weightage_design" ).val( $( "#weightage_slider" ).slider('values', 0) + " - " + $( "#weightage_slider" ).slider('values', 1) );
                    $( "#weightage_correctness" ).val( $( "#weightage_slider" ).slider('values', 1) + " - " + $( "#weightage_slider" ).slider('values', 2) );
                    $( "#weightage_others" ).val( $( "#weightage_slider" ).slider('values', 2) + " - " + "100" );
    
                    // update display of colored handle ranges
                    $( "#weightage_slider_a" ).css('left', '0%');
                    $( "#weightage_slider_a" ).css('width', (ui.values[ 0 ] + '%'));
                    $( "#weightage_slider_b" ).css('left', (ui.values[ 0 ] + '%'));
                    $( "#weightage_slider_b" ).css('width', ((ui.values[1] - ui.values[0]) + '%'));
                    $( "#weightage_slider_c" ).css('left', (ui.values[ 1 ] + '%'));
                    $( "#weightage_slider_c" ).css('width', ((ui.values[2] - ui.values[1]) + '%'));
                    $( "#weightage_slider_d" ).css('left', (ui.values[ 2 ] + '%'));
                    $( "#weightage_slider_d" ).css('width', ((100 - ui.values[2]) + '%'));
                }
            });
    
            // label each slider handle
            $( "#weightage_slider > a" ).each(function(index){
                $(this).attr('id', 'weightage_slider_' + index);
                $(this).attr('title', 'slider handle ' + index);    
            });
    
            // the following four div tags result in the display of colored handle ranges
            // the following left attributes and width attributes should be consistent with slider initialization - values array
            $('#weightage_slider').append("<div id='weightage_slider_a' class='ui-slider-range' style='left:0%;width:10%;background-color:#41d862;'></div>");
            $('#weightage_slider').append("<div id='weightage_slider_b' class='ui-slider-range' style='left:10%;width:30%;background-color:#41b7d8;'></div>");
            $('#weightage_slider').append("<div id='weightage_slider_c' class='ui-slider-range' style='left:40%;width:50%;background-color:#d841b7;'></div>");
            $('#weightage_slider').append("<div id='weightage_slider_d' class='ui-slider-range' style='left:90%;width:10%;background-color:#d86241;'></div>");
    
            // these four lines display the initial handle ranges
            $( "#weightage_style" ).val( "0" + " - " + $( "#weightage_slider" ).slider('values', 0) );
            $( "#weightage_design" ).val( $( "#weightage_slider" ).slider('values', 0) + " - " + $( "#weightage_slider" ).slider('values', 1) );
            $( "#weightage_correctness" ).val( $( "#weightage_slider" ).slider('values', 1) + " - " + $( "#weightage_slider" ).slider('values', 2) );
            $( "#weightage_others" ).val( $( "#weightage_slider" ).slider('values', 2) + " - " + "100" );
        </script>
    
    </body>
    

    错误:如果手柄被拖到最左边,它们会“卡住”,因此您可能需要一个重置按钮来恢复手柄的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2010-09-16
      相关资源
      最近更新 更多