代码之家  ›  专栏  ›  技术社区  ›  Decent Dabbler

向jqueryui滑块添加填充

  •  6
  • Decent Dabbler  · 技术社区  · 15 年前

    no padding
    \/
    []------------------
    

    我希望它的左(右)端有衬垫:

    padding of 10px for instance
    \/
    --[]----------------
    

    .ui-slider-horizontal { height: .8em; padding: 0 10px; }

    outerWidth() 外径() 具有 width()

    有什么建议吗?

       not                      very
    important    important    important
    ----[]-----------[]----------[]----
    

    上图显示了我希望控制柄出现的位置,位于标签下方的中心。但从视觉上看,吧台需要延伸到边缘。

    2 回复  |  直到 15 年前
        1
  •  8
  •   Thomas    15 年前

    既然你现在问了,我就坐下来黑了jqueryui的滑块,按你的要求添加了填充选项。

    注意:我只为带有一个手柄的水平滑块添加了它。其他的案子并不复杂。我只是没有动力去做打字和随后的测试来覆盖那些现在可能不需要的案例。

    在包含jqueryui中的原始滑动条之后包含此代码。扩展覆盖了几个方法,并将选项“paddingMin”和“paddingMax”添加到Slider小部件中(值必须是数字,并且将被解释为像素;显然,这也可以很容易地扩展到使用其他单位,但同样意味着对当前未请求的情况进行更多的键入/测试)。

    简单示例用法:

    $('#slider').slider({ paddingMin: 50, paddingMax: 100 });
    

    扩展黑客代码(按原样提供,不要起诉我):

    (
        function($, undefined)
        {
            $.ui.slider.prototype.options =
                $.extend(
                    {},
                    $.ui.slider.prototype.options,
                    {
                        paddingMin: 0,
                        paddingMax: 0
                    }
                );
    
            $.ui.slider.prototype._refreshValue =
                function() {
                    var
                        oRange = this.options.range,
                        o = this.options,
                        self = this,
                        animate = ( !this._animateOff ) ? o.animate : false,
                        valPercent,
                        _set = {},
                        elementWidth,
                        elementHeight,
                        paddingMinPercent,
                        paddingMaxPercent,
                        paddedBarPercent,
                        lastValPercent,
                        value,
                        valueMin,
                        valueMax;
    
                    if (self.orientation === "horizontal")
                    {
                        elementWidth = this.element.outerWidth();
                        paddingMinPercent = o.paddingMin * 100 / elementWidth;
                        paddedBarPercent = ( elementWidth - ( o.paddingMin + o.paddingMax) ) * 100 / elementWidth;
                    }
                    else
                    {
                        elementHeight = this.element.outerHeight();
                        paddingMinPercent = o.paddingMin * 100 / elementHeight;
                        paddedBarPercent = ( elementHeight - ( o.paddingMin + o.paddingMax) ) * 100 / elementHeight;
                    }
    
                    if ( this.options.values && this.options.values.length ) {
                        this.handles.each(function( i, j ) {
                            valPercent =
                                ( ( self.values(i) - self._valueMin() ) / ( self._valueMax() - self._valueMin() ) * 100 )
                                * paddedBarPercent / 100 + paddingMinPercent;
                            _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
                            $( this ).stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
                            if ( self.options.range === true ) {
                                if ( self.orientation === "horizontal" ) {
                                    if ( i === 0 ) {
                                        self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { left: valPercent + "%" }, o.animate );
                                    }
                                    if ( i === 1 ) {
                                        self.range[ animate ? "animate" : "css" ]( { width: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
                                    }
                                } else {
                                    if ( i === 0 ) {
                                        self.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { bottom: ( valPercent ) + "%" }, o.animate );
                                    }
                                    if ( i === 1 ) {
                                        self.range[ animate ? "animate" : "css" ]( { height: ( valPercent - lastValPercent ) + "%" }, { queue: false, duration: o.animate } );
                                    }
                                }
                            }
                            lastValPercent = valPercent;
                        });
                    } else {
                        value = this.value();
                        valueMin = this._valueMin();
                        valueMax = this._valueMax();
                        valPercent =
                            ( ( valueMax !== valueMin )
                            ? ( value - valueMin ) / ( valueMax - valueMin ) * 100
                            : 0 )
                            * paddedBarPercent / 100 + paddingMinPercent;
    
                        _set[ self.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
    
                        this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
    
                        if ( oRange === "min" && this.orientation === "horizontal" ) {
                            this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { width: valPercent + "%" }, o.animate );
                        }
                        if ( oRange === "max" && this.orientation === "horizontal" ) {
                            this.range[ animate ? "animate" : "css" ]( { width: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
                        }
                        if ( oRange === "min" && this.orientation === "vertical" ) {
                            this.range.stop( 1, 1 )[ animate ? "animate" : "css" ]( { height: valPercent + "%" }, o.animate );
                        }
                        if ( oRange === "max" && this.orientation === "vertical" ) {
                            this.range[ animate ? "animate" : "css" ]( { height: ( 100 - valPercent ) + "%" }, { queue: false, duration: o.animate } );
                        }
                    }
                };
    
            $.ui.slider.prototype._normValueFromMouse =
                function( position ) {
                    var
                        o = this.options,
                        pixelTotal,
                        pixelMouse,
                        percentMouse,
                        valueTotal,
                        valueMouse;
    
                    if ( this.orientation === "horizontal" ) {
                        pixelTotal = this.elementSize.width - (o.paddingMin + o.paddingMax);
                        pixelMouse = position.x - this.elementOffset.left - o.paddingMin - ( this._clickOffset ? this._clickOffset.left : 0 );
                    } else {
                        pixelTotal = this.elementSize.height - (o.paddingMin + o.paddingMax);
                        pixelMouse = position.y - this.elementOffset.top - o.paddingMin - ( this._clickOffset ? this._clickOffset.top : 0 );
                    }
    
                    percentMouse = ( pixelMouse / pixelTotal );
                    if ( percentMouse > 1 ) {
                        percentMouse = 1;
                    }
                    if ( percentMouse < 0 ) {
                        percentMouse = 0;
                    }
                    if ( this.orientation === "vertical" ) {
                        percentMouse = 1 - percentMouse;
                    }
    
                    valueTotal = this._valueMax() - this._valueMin();
                    valueMouse = this._valueMin() + percentMouse * valueTotal;
    
                    return this._trimAlignValue( valueMouse );
                };
        }
    )(jQuery);
    
        2
  •  3
  •   pkauko    15 年前

    “捕捉到增量”加上“不兼容”(捕捉值不均匀)最小值和最大值是否会产生预期效果?我知道这很可能会导致应用程序端的值转换,因为这可能无法使用现在使用的值来获得,但这里有一个“hack and slash”解决方案,如果它有效的话。

    我的建议是把最小值设为,比如说,750。将“值”捕捉为1200,“最大值”捕捉为4050。这样,最低捕捉比最小值高450,滑块永远不会到达最左边的边。与最大值相同,即3x1200+450=4050。此处使用的值是任意的,仅限于示例。

    我还没有测试过这个,也不知道它是否有效,我知道这不是你想要的,只是我在查看jqueryuislider如何工作的示例时想到的一个想法jqueryui.com.

    编辑:不能放弃这一点,现在我知道这是在工作的方式,它防止滑块到达幻灯片的结束。您只需要相应地设置初始值,以防止页面加载时滑块位于一端或另一端。