我的解决方案是修补 jQuery UI 并重新定义幻灯片行为。这是我的概念:
如果一个滑块句柄在滑动期间通过了另一个滑块句柄构成的边界:不要阻止用户进一步滑动(正常的 jQuery UI 行为),就像用户抓住另一个滑块一样。简而言之:必要时交换滑块手柄。
这是我的补丁。它没有太大变化,并且大多数行与原始 jQuery UI 代码相同。
$.widget('ui.slider', $.ui.slider, {
_start: function( event, index ) {
this.swapIndex = false;
return this._super( event, index );
},
_slide: function( event, index, newVal ) {
var otherVal,
newValues,
allowed;
if ( this.options.values && this.options.values.length ) {
if ( this.swapIndex ) {
index = index ? 0 : 1;
}
otherVal = this.values( index ? 0 : 1 );
if ( index === 0 && newVal > otherVal || index === 1 && newVal < otherVal ) {
this.swapIndex = !this.swapIndex;
index = index ? 0 : 1;
}
if ( newVal !== this.values( index ) ) {
newValues = [];
newValues[ index ] = newVal;
newValues[ index ? 0 : 1 ] = otherVal;
// A slide can be canceled by returning false from the slide callback
allowed = this._trigger( "slide", event, {
handle: this.handles[ index ],
value: newVal,
values: newValues
} );
if ( allowed !== false ) {
this.values( index, newVal );
}
}
} else {
if ( newVal !== this.value() ) {
// A slide can be canceled by returning false from the slide callback
allowed = this._trigger( "slide", event, {
handle: this.handles[ index ],
value: newVal
} );
if ( allowed !== false ) {
this.value( newVal );
}
}
}
}
});
现场演示:http: //jsfiddle.net/xykwup5a/
我更喜欢这个解决方案有两个原因:
- 如果您的值为负数,则 1.10.3 版中的 jQuery UI 修复似乎不起作用
- 更好的用户体验:当不使用补丁并且两个手柄重叠时,用户只能在一个方向移动手柄,并且必须在另一个方向上玩耍以增加范围。