HTML5: слайдер с двумя входами возможно?
можно ли сделать HTML5 слайдер с двумя входными значениями, например, чтобы выбрать ценовой диапазон? Если да, то как это можно сделать?
4 ответа:
нет, HTML5 диапазон ввода принимает только один вход. Я бы рекомендовал вам использовать что-то вроде jQuery UI range slider для этой задачи.
Я искал легкий, свободный от зависимостей двойной слайдер в течение некоторого времени (казалось сумасшедшим импортировать jQuery только для этого), и там, похоже, не так много. Я закончил тем, что изменил @Wildhoney код немного и очень нравится.
function getVals(){ // Get slider values var parent = this.parentNode; var slides = parent.getElementsByTagName("input"); var slide1 = parseFloat( slides[0].value ); var slide2 = parseFloat( slides[1].value ); // Neither slider will clip the other, so make sure we determine which is larger if( slide1 > slide2 ){ var tmp = slide2; slide2 = slide1; slide1 = tmp; } var displayElement = parent.getElementsByClassName("rangeValues")[0]; displayElement.innerHTML = slide1 + " - " + slide2; } window.onload = function(){ // Initialize Sliders var sliderSections = document.getElementsByClassName("range-slider"); for( var x = 0; x < sliderSections.length; x++ ){ var sliders = sliderSections[x].getElementsByTagName("input"); for( var y = 0; y < sliders.length; y++ ){ if( sliders[y].type ==="range" ){ sliders[y].oninput = getVals; // Manually trigger event first time to display values sliders[y].oninput(); } } } }
section.range-slider { position: relative; width: 200px; height: 35px; text-align: center; } section.range-slider input { pointer-events: none; position: absolute; overflow: hidden; left: 0; top: 15px; width: 200px; outline: none; height: 18px; margin: 0; padding: 0; } section.range-slider input::-webkit-slider-thumb { pointer-events: all; position: relative; z-index: 1; outline: 0; } section.range-slider input::-moz-range-thumb { pointer-events: all; position: relative; z-index: 10; -moz-appearance: none; width: 9px; } section.range-slider input::-moz-range-track { position: relative; z-index: -1; background-color: rgba(0, 0, 0, 1); border: 0; } section.range-slider input:last-of-type::-moz-range-track { -moz-appearance: none; background: none transparent; border: 0; } section.range-slider input[type=range]::-moz-focus-outer { border: 0; }
<!-- This block can be reused as many times as needed --> <section class="range-slider"> <span class="rangeValues"></span> <input value="5" min="0" max="15" step="0.5" type="range"> <input value="10" min="0" max="15" step="0.5" type="range"> </section>
опаздывает, но noUiSlider позволяет избежать зависимости jQuery-ui, которой нет в принятом ответе. Его единственное "предостережение" - это поддержка IE для IE9 и новее, если legacy IE является для вас прерывателем сделки.
Он также бесплатный, с открытым исходным кодом и может быть использован в коммерческих проектах без ограничений.
установка: загрузите noUiSlider, извлеките файл CSS и JS где-нибудь в файловой системе вашего сайта, а затем перейдите по ссылке на CSS из head и JS из тело:
<!-- In <head> --> <link href="nouislider.min.css" rel="stylesheet"> <!-- In <body> --> <script src="nouislider.min.js"></script>
пример использования: создает ползунок, который идет от 0 до 100, и начинает устанавливать 20-80.
HTML:
<div id="slider"> </div>
JS:
var slider = document.getElementById('slider'); noUiSlider.create(slider, { start: [20, 80], connect: true, range: { 'min': 0, 'max': 100 } });
конечно, вы можете просто использовать два ползунка, накладывая друг на друга, и добавить немного javascript (на самом деле не более 5 строк), чтобы селекторы не превышали значения min/max (например, в решении @Garys).
В приложении вы найдете короткий фрагмент, адаптированный из текущего проекта, включая некоторые стили CSS3, чтобы показать, что вы можете сделать (только webkit). Я также добавил некоторые метки для отображения выбранных значений.
Он использует JQuery, но версия vanillajs не является волшебной.
(function() { function addSeperator(nStr) { nStr += ''; var x = nStr.split('.'); var x1 = x[0]; var x2 = x.length > 1 ? '.' + x[1] : ''; var rgx = /(\d+)(\d{3})/; while (rgx.test(x1)) { x1 = x1.replace(rgx, '' + '.' + ''); } return x1 + x2; } function rangeInputChangeEventHandler(e){ var rangeGroup = $(this).attr('name'), minBtn = $(this).parent().children('.min'), maxBtn = $(this).parent().children('.max'), range_min = $(this).parent().children('.range_min'), range_max = $(this).parent().children('.range_max'), minVal = parseInt($(minBtn).val()), maxVal = parseInt($(maxBtn).val()), origin = $(this).context.className; if(origin === 'min' && minVal > maxVal-5){ $(minBtn).val(maxVal-5); } var minVal = parseInt($(minBtn).val()); $(range_min).html(addSeperator(minVal*1000) + ' €'); if(origin === 'max' && maxVal-5 < minVal){ $(maxBtn).val(5+ minVal); } var maxVal = parseInt($(maxBtn).val()); $(range_max).html(addSeperator(maxVal*1000) + ' €'); } $('input[type="range"]').on( 'input', rangeInputChangeEventHandler); })();
body{ font-family: sans-serif; font-size:14px; } input[type='range'] { width: 210px; height: 30px; overflow: hidden; cursor: pointer; outline: none; } input[type='range'], input[type='range']::-webkit-slider-runnable-track, input[type='range']::-webkit-slider-thumb { -webkit-appearance: none; background: none; } input[type='range']::-webkit-slider-runnable-track { width: 200px; height: 1px; background: #003D7C; } input[type='range']:nth-child(2)::-webkit-slider-runnable-track{ background: none; } input[type='range']::-webkit-slider-thumb { position: relative; height: 15px; width: 15px; margin-top: -7px; background: #fff; border: 1px solid #003D7C; border-radius: 25px; z-index: 1; } input[type='range']:nth-child(1)::-webkit-slider-thumb{ z-index: 2; } .rangeslider{ position: relative; height: 60px; width: 210px; display: inline-block; margin-top: -5px; margin-left: 20px; } .rangeslider input{ position: absolute; } .rangeslider{ position: absolute; } .rangeslider span{ position: absolute; margin-top: 30px; left: 0; } .rangeslider .right{ position: relative; float: right; margin-right: -5px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <div class="rangeslider"> <input class="min" name="range_1" type="range" min="1" max="100" value="10" /> <input class="max" name="range_1" type="range" min="1" max="100" value="90" /> <span class="range_min light left">10.000 €</span> <span class="range_max light right">90.000 €</span> </div>