【问题标题】:Range Slider - Down Arrow to Follow Thumb范围滑块 - 向下箭头跟随拇指
【发布时间】:2019-03-19 22:52:42
【问题描述】:

我有一个范围滑块,上面有一个输出元素。输出元素下方是一个向下箭头,它会跟随滑块上拇指所在的位置。

我正在使用 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>

【问题讨论】:

    标签: javascript jquery html css slider


    【解决方案1】:

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

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

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

    所以对齐计算会变得曲折...

    我没有找到任何接近所有案例公式的东西。但是使用calc()“逻辑百分比”px 中的偏移量,它可以正确地完成工作并且响应迅速。只是几次尝试都找不到正确的偏移量。

    这是我从您的 sn-p 中更改的唯一几行:

    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

    工作sn-p

    $(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>

    【讨论】:

    • 感谢 Louys 更新 CSS!我之前确实尝试过 calc,但我没有使用像素,而是使用了 em 和 rem。感谢您的帮助!
    猜你喜欢
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多