首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止范围滑块中的可拖动手柄重叠?

问如何防止范围滑块中的可拖动手柄重叠?
EN

Stack Overflow用户
提问于 2018-04-04 08:30:02
回答 1查看 118关注 0票数 0

我必须防止范围滑块中的可拖动手柄重叠。这是一个普通的js插件。

如果两个句柄位置之间的差异小于20px,我尝试禁用更新偏移量。它有时是有效的,但障碍并不精确。当控制柄靠近每个other.The控制柄时,移动是断断续续的,无法立即拖动,但需要经过几次移动。

以下是插件代码的片段:

代码语言:javascript
复制
// HELPERS
// map slider range to value range
Number.prototype.map = function(in_min, in_max, out_min, out_max) {
    return (this - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
// round to nearest multiple
Number.prototype.roundTo = function(num) {
    var resto = this % num;
    if (resto <= (num / 2)) {
        return this - resto;
    } else {
        return this + num - resto;
    }
}


//EVENTS
var EVmove = ('ontouchstart' in document.documentElement) ? 'touchmove' : 'mousemove',
    EVmove = ('ontouchstart' in document.documentElement) ? 'touchmove' : 'mousemove',
    EVend = ('ontouchstart' in document.documentElement) ? 'touchend' : 'mouseup';


document.addEventListener(EVmove, actions.move, false);
document.addEventListener(EVend, function() {
    return movebar = false;
}, false);
document.addEventListener(EVstart, function() {
    return movebar = true;
}, false);

var movebar = true;

// MOVE HANDLE
actions.move = function(event) {
    var clientX = ('ontouchstart' in document.documentElement) ? event.touches[0].clientX : event.clientX;
    leftOffset = clientX - posX;

    // move handle bar
    if (movebar) {

        element.style.left = leftOffset + "px";
        var v = leftOffset.map(0, elWidth, 0, window.range); // 0

        var value = v.roundTo(step);
        output.innerHTML = value.toFixed(2);

        // prevent handles ovelaping
        if (vsOpts.range) {

            var diff = Math.abs(parseInt(handle1.offsetLeft) - parseInt(handle2.offsetLeft));

            if (diff < 20) {
                movebar = false;

            }

        }


    }

}
EN

回答 1

Stack Overflow用户

发布于 2018-04-04 22:11:55

我通过将相对句柄的位置指定为当前句柄的限制位置来解决此问题。

代码语言:javascript
复制
document.addEventListener(EVstart, function(event) {

    if (event.target.id == "vslider-handle1") {
        useHandle1 = true
    } else {
        useHandle1 = false
    }
    return movebar = true;
}, false);

}

handle1Limit=parseInt(handle2.offsetLeft);
handle2Limit=parseInt(handle1.offsetLeft);
handle1Pos=  parseInt(handle1.offsetLeft);
handle2Pos=  parseInt(handle2.offsetLeft);


if(useHandle1){ 

  if(handle1Pos>=handle1Limit){

   handle1.style.left = handle1Limit + "px";
   handle2.style.left = handle1Limit + "px";

  }

}
else{ 

  if(handle2Pos<=handle2Limit){

   handle2.style.left = handle2Limit + "px";
   handle1.style.left = handle2Limit + "px";

  }

}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49640953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档