范围滑块-跟​​随拇指的向下箭头

时间:2019-03-19 22:52:43

标签: javascript jquery html css slider

我有一个范围滑块,其上方有一个输出元素。输出元素下方是一个向下箭头,无论拇指在滑块上的何处都可以跟随该箭头。

我正在使用CSS放置箭头并对其进行动画处理。

不幸的是,考虑到滑块的响应能力,箭头并非始终位于拇指上方。

感谢您的帮助!

$(function() {
  var slider = document.getElementById("range-slider");
  var output = document.getElementById("range-slider-output");

  output.innerHTML = slider.value;

  slider.oninput = function() {
    output.innerHTML = this.value;
    // resets state of user icon
    $('.fa-user').removeClass("disabled");

    if (output.innerHTML == 1) {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "1");
      $('.range-slider-icons li:nth-of-type(2) span, .range-slider-icons li:nth-of-type(3) span, .range-slider-icons li:nth-of-type(4) span').addClass('disabled');

    } else if (output.innerHTML == 2) {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "2");
      $('.range-slider-icons li:nth-of-type(3) span, .range-slider-icons li:nth-of-type(4) span').addClass('disabled');

    } else if (output.innerHTML == 3) {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "3");
      $('.range-slider-icons li:nth-of-type(4) span').addClass('disabled');

    } else {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "4");
    }

  }


});
.range-slider-output {
  position: relative;
  display: inline-block;
  padding: 0.2em 0.75em 0.25em;
  color: #fff;
  text-align: center;
  background: #666;
  border-radius: 3px;
  width: 100%;
  left: calc(50%);
  flex: 0 0 5%;
  align-self: center;
  margin: 0;
  font-size: 28px;
  -webkit-transform: translateX(-50%);
  transform: translateX(-50%);
  top: -92px;
}

.range-slider-output::before {
  position: absolute;
  top: 50%;
  left: 0;
  content: "";
}

.range-slider-lg .range-slider-output::before {
  top: 48px;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 12px 12px 0 12px;
  border-color: #666 transparent transparent transparent;
  transition: all 0.7s ease-out;
}

.range-slider-wrap {
  min-width: 250px;
}

input[aria-valuenow='1']+.range-slider-output::before {
  left: 1rem;
}

input[aria-valuenow='2']+.range-slider-output::before {
  left: 32.5%;
}

input[aria-valuenow='3']+.range-slider-output::before {
  left: 64%;
}

input[aria-valuenow='4']+.range-slider-output::before {
  left: 94%;
}

input[type='range'] {
  width: 100%;
  cursor: pointer;
  padding-top: 90px;
}

input[type='range'] {
  -webkit-appearance: none;
}

input[type='range']::-webkit-slider-runnable-track {
  width: 100%;
  height: 5px;
  background: #e6e5e5;
  border: 1px solid #999;
  border-radius: 3px;
  -webkit-appearance: none;
  padding: 0 0.5rem;
}

input[type='range']::-moz-range-track {
  width: 100%;
  height: 5px;
  background: #e6e5e5;
  border: 1px solid #999;
  border-radius: 3px;
}

input[type=range]::-webkit-slider-thumb {
  width: 28px;
  height: 28px;
  margin-top: -11px;
  background: #999;
  border: 1px solid #666;
  border-radius: 50%;
  -webkit-appearance: none;
}

input[type='range']::-moz-range-thumb {
  width: 28px;
  height: 28px;
  margin-top: -11px;
  background: #999;
  border: 1px solid #666;
  border-radius: 50%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container">
  <div class="row">
    <div class="col-md-12">

      <div class="form-group">

        <div class="range-slider-wrap range-slider-lg">

          <input class="range-slider ng-valid ng-dirty ng-touched" step="1" type="range" id="range-slider" min="1" max="4" data-tooltip-top="true" aria-valuenow="3" aria-valuemin="1" aria-valuemax="4">

          <output class="range-slider-output num" id="range-slider-output" for="range-slider"></output>

        </div>

      </div>

    </div>
  </div>
</div>

1 个答案:

答案 0 :(得分:1)

问题是,缺口不是简单地按百分比定位的:

  • 第一= 0%
  • 秒= 33.3%
  • 第三名= 66.6%
  • 第四= 100%

slider-thumb的尺寸为...在您的情况下为28px。
而且在第一个刻痕和最后一个刻痕之前有间距...
箭头也有宽度!

因此对齐计算可能会变得曲折...

我没有找到与所有案例公式相似的东西。但是,将calc()“逻辑百分比” 并在px中使用偏移量,则可以正确完成工作并具有响应能力。只需几次尝试,就无法找到正确的偏移量。

这是我从您的代码段更改的仅有几行:

input[aria-valuenow='1'] + .range-slider-output::before {
   left: 11px;
}
input[aria-valuenow='2'] + .range-slider-output::before {
   left: calc(33.3% - 4px);
}
input[aria-valuenow='3'] + .range-slider-output::before {
   left: calc(66.6% - 20px);
}
input[aria-valuenow='4'] + .range-slider-output::before {
   left: calc(100% - 36px);
}

我还添加了引导文件(在您的小提琴中)。

更新了Fiddle

工作摘要

$(function() {
  var slider = document.getElementById("range-slider");
  var output = document.getElementById("range-slider-output");

  output.innerHTML = slider.value;

  slider.oninput = function() {
    output.innerHTML = this.value;
    // resets state of user icon
    $('.fa-user').removeClass("disabled");

    if (output.innerHTML == 1) {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "1");
      $('.range-slider-icons li:nth-of-type(2) span, .range-slider-icons li:nth-of-type(3) span, .range-slider-icons li:nth-of-type(4) span').addClass('disabled');

    } else if (output.innerHTML == 2) {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "2");
      $('.range-slider-icons li:nth-of-type(3) span, .range-slider-icons li:nth-of-type(4) span').addClass('disabled');

    } else if (output.innerHTML == 3) {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "3");
      $('.range-slider-icons li:nth-of-type(4) span').addClass('disabled');

    } else {
      document.getElementById("range-slider").setAttribute("aria-valuenow", "4");
    }

  }


});
.range-slider-output {
    position: relative;
    display: inline-block;
    padding: 0.2em 0.75em 0.25em;
    color: #fff;
    text-align: center;
    background: #666;
    border-radius: 3px;
    width: 100%;
    left: calc(50%);
    flex: 0 0 5%;
    align-self: center;
    margin: 0;
    font-size: 28px;
    -webkit-transform: translateX(-50%);
    transform: translateX(-50%);
    top: -92px;
}

.range-slider-output::before {
    position: absolute;
    top: 50%;
    left: 0;
    content: "";
}

.range-slider-lg .range-slider-output::before {
  top: 48px;
  width: 0;
  height: 0;
  border-style: solid;
  border-width: 12px 12px 0 12px;
  border-color: #666 transparent transparent transparent;
  transition: all 0.7s ease-out;
}


.range-slider-wrap {
  min-width: 250px;
}


input[aria-valuenow='1'] + .range-slider-output::before {
   left: 11px;
}
input[aria-valuenow='2'] + .range-slider-output::before {
   left: calc(33.3% - 4px);
}
input[aria-valuenow='3'] + .range-slider-output::before {
   left: calc(66.6% - 20px);
}
input[aria-valuenow='4'] + .range-slider-output::before {
   left: calc(100% - 36px);
}



input[type='range'] {
  width: 100%;
  cursor: pointer;
  padding-top: 90px;
}
input[type='range'] {
  -webkit-appearance: none;
}
input[type='range']::-webkit-slider-runnable-track {
  width: 100%;
  height: 5px;
  background: #e6e5e5;
  border: 1px solid #999;
  border-radius: 3px;
  -webkit-appearance: none;
  padding: 0 0.5rem;
}

input[type='range']::-moz-range-track {
  width: 100%;
  height: 5px;
  background: #e6e5e5;
  border: 1px solid #999;
  border-radius: 3px;
}

input[type=range]::-webkit-slider-thumb {
    width: 28px;
    height: 28px;
    margin-top: -11px;
    background: #999;
    border: 1px solid #666;
    border-radius: 50%;
    -webkit-appearance: none;
}

input[type='range']::-moz-range-thumb {
  width: 28px;
  height: 28px;
  margin-top: -11px;
  background: #999;
  border: 1px solid #666;
  border-radius: 50%;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"></script>

<div class="container">
  <div class="row">
    <div class="col-md-12">

      <div class="form-group">

        <div class="range-slider-wrap range-slider-lg">

          <input class="range-slider ng-valid ng-dirty ng-touched" step="1" type="range" id="range-slider" min="1" max="4" data-tooltip-top="true" aria-valuenow="3" aria-valuemin="1" aria-valuemax="4">

          <output class="range-slider-output num" id="range-slider-output" for="range-slider"></output>

        </div>

      </div>

    </div>
  </div>
</div>