滑块光标以增量方式移动

时间:2016-07-01 22:37:55

标签: javascript html css

我正在尝试创建一个范围滑块。当您拖动sliderCursor时,我希望它以10为增量移动。

以下是相关代码:

var cursorPosition = clamp01((sliderDimention - (e.clientX - startPoint.left)) / sliderDimention);
sliderCursor.style.transform = 'translateX(' + (((1 - cursorPosition) * sliderDimention) - cursorRadius) + 'px)';

我尝试将10添加到cursorPosition,但它仍然没有以增量方式移动。如何让sliderCursor以增量方式移动?

JSFiddle

function RangeSlider( /** DOM Elem */ parentElem) {
  var wrapperElem = document.getElementsByClassName('wrapperElem')[0],
    slider = document.getElementsByClassName('slider')[0],
    sliderCursor = document.getElementsByClassName('sliderCursor')[0];

  var sliderDimention = slider.offsetWidth,
    cursorRadius = sliderCursor.offsetHeight / 2,
    startPoint,
    currentTarget;


  function sliderDown(e) {
    e.preventDefault();

    currentTarget = null;
    var sliderWithDescendents = wrapperElem.querySelectorAll('*');
    for (var i = 0; i < sliderWithDescendents.length; i++) {
      sliderWithDescendents[i]
      if (sliderWithDescendents[i] === e.target || wrapperElem === e.target) {
        currentTarget = wrapperElem.children[0];
        break;
      }
    }
    if (currentTarget === null) return;

    startPoint = getOrigin(currentTarget);
    sliderDimention = slider.offsetWidth;

    window.addEventListener('mousemove', sliderMove);
    sliderMove(e);
  }

  function sliderMove(e) {
    var cursorPosition = clamp01((sliderDimention - (e.clientX - startPoint.left)) / sliderDimention);
    sliderCursor.style.transform = 'translateX(' + (((1 - cursorPosition) * sliderDimention) - cursorRadius) + 'px)';
  }

  function mouseUpEvents() {
    window.removeEventListener('mousemove', sliderMove);
  }
  wrapperElem.addEventListener('mousedown', sliderDown);
  window.addEventListener('mouseup', mouseUpEvents);
}

var sliderTest = document.getElementById('sliderTest');
var test = new RangeSlider(sliderTest);






function clamp01(val) {
  return Math.min(1, Math.max(0, val));
}

function getOrigin(elm) {
  var box = (elm.getBoundingClientRect) ? elm.getBoundingClientRect() : {
      top: 0,
      left: 0
    },
    doc = elm && elm.ownerDocument,
    body = doc.body,
    win = doc.defaultView || doc.parentWindow || window,
    docElem = doc.documentElement || body.parentNode,
    clientTop = docElem.clientTop || body.clientTop || 0, // border on html or body or both
    clientLeft = docElem.clientLeft || body.clientLeft || 0;

  return {
    left: box.left + (win.pageXOffset || docElem.scrollLeft) - clientLeft,
    top: box.top + (win.pageYOffset || docElem.scrollTop) - clientTop
  };
}
.wrapperElem {
  height: 18px;
  width: 100%;
  cursor: pointer;
  display: flex;
}
.slider {
  height: 100%;
  width: calc(100% - 62px);
  border: 1px solid black;
}
.sliderCursor {
  width: 14px;
  height: 14px;
  border-radius: 50%;
  border: 2px solid black;
}
<div class="wrapperElem">
  <div class="slider">
    <div class="sliderCursor"></div>
  </div>
</div>

2 个答案:

答案 0 :(得分:0)

您可以使用JQueryUI真正简化所有内容,请参阅此处https://jqueryui.com/slider/#steps

参见示例:https://jsfiddle.net/7ku7qvfx/18/

<p>
  <label for="amount">increments of 10:</label>
  <input type="text" id="amount" readonly style="border:0; color:#f6931f; font-weight:bold;">
</p>

<div id="slider"></div>
<script>
  $(function() {
    $( "#slider" ).slider({
      value:0,
      min: 0,
      max: 100,
      step: 10,
      slide: function( event, ui ) {
        $( "#amount" ).val(ui.value );
      }
    });
    $( "#amount" ).val( $( "#slider" ).slider( "value" ) );
  });
  </script>

答案 1 :(得分:0)

所有这些都可以用模数增量10来完成。

(我不太了解你的变量,所以我只是使用随机变量。抱歉。)

if(cursorPosition % 10 == 0){sliderPosition = cursorPosition};

因此,每当cursorPosition为10的倍数时,sliderPosition将递增。