Установка плагина
- подключаем библиотеку jQuery версии 1.7+
- подключаем библиотеку jQuery UI с виджетом Slider
- подключаем плагин jQuery UI Touch Punch для корректной работы ползунков на тачпадах
Более подробно об этом плагине можно узнать в статье: Ползунок диапазонов jQuery UI Slider
Вариант 1
Данный пример не привязан к начальному и конечному значению слайдера, но подходит только для небольшого диапазона
1 2 3 |
<div class="polzunok-container-1"> <div class="polzunok-1"></div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$(".polzunok-1").slider({ min: 1, max: 7, value: 4, range: "min", animate: "fast", }); var opt = $(".polzunok-1").data().uiSlider.options, min = opt.min, raz = opt.max - min; for (var i = 0; i <= raz; i++) { $(".polzunok-1").append($('<b>'+(min++)+'</b>').css('left',(i/raz*100)+'%')); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
.polzunok-container-1 * { box-sizing: border-box; outline: none; } .polzunok-container-1 { padding: 10px 21px; } .polzunok-container-1 .ui-slider { position: relative; background: #BFE2FF; height: 16px; box-shadow: 0 2px 5px rgba(0,0,0,0.2), 0 4px 6px rgba(0,0,0,0.2); } .polzunok-container-1 .ui-slider .ui-slider-handle, .polzunok-container-1 .polzunok-1 b { position: absolute; margin-left: -21px; text-align: center; width: 42px; height: 42px; font-size: 18px; padding-top: 7px; cursor: pointer; border-radius: 100%; border: 4px solid #BFE2FF; top: -14px; background: #FFF; z-index: 2; color: #000; box-shadow: 0 2px 5px rgba(0,0,0,0.2), 0 4px 6px rgba(0,0,0,0.2); } .polzunok-container-1 .ui-slider .ui-slider-handle { z-index: 3; border: 4px solid #337AB7; box-shadow: none; background: transparent; } .polzunok-container-1 .ui-slider .ui-slider-range { position: absolute; z-index: 1; height: 16px; display: block; border: 0; background: #337AB7; } .polzunok-container-1 .ui-slider-horizontal .ui-slider-range-min { left: 0; } .polzunok-container-1 .ui-slider-horizontal .ui-slider-range-max { right: 0; } |
Вариант 2
Данный пример подходит к большим значениям вводимых данных
1 2 3 |
<div class="polzunok-container-2"> <div class="polzunok-2"></div> </div> |
1 2 3 4 5 6 7 8 9 10 11 |
$(".polzunok-2").slider({ min: 0, max: 500, value: 200, range: "min", animate: "fast", slide : function(event, ui) { $(".polzunok-2 span").html("<b><</b>" + ui.value + "<b>></b>"); } }); $(".polzunok-2 span").html("<b><</b>" + $(".polzunok-2").slider("value") + "<b>></b>"); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
.polzunok-container-2 * { box-sizing: border-box; outline: none; } .polzunok-container-2 { padding: 10px 50px; } .polzunok-container-2 .ui-slider { position: relative; background: #BFE2FF; height: 12px; border-radius:10px; box-shadow: inset 2px 2px 5px rgba(0, 0, 0, 0.3), 1px 1px 5px rgba(255, 255, 255, 1); } .polzunok-container-2 .ui-slider .ui-slider-handle { position: absolute; margin-left: -50px; text-align: center; width: 100px; height: 36px; font-size: 18px; line-height: 18px; padding-top: 4px; cursor: pointer; border-radius: 10px; border: 4px solid #BFE2FF; top: -13px; background: #FFF; z-index: 2; color: #000; box-shadow: 0 2px 5px rgba(0,0,0,0.2), 0 4px 6px rgba(0,0,0,0.2); } .polzunok-container-2 .ui-slider .ui-slider-handle b { padding: 0 8px; font-family: Courier, monospace; color: #BFE2FF; } .polzunok-container-2 .ui-slider .ui-slider-handle:hover b { color: #337AB7; } .polzunok-container-2 .ui-slider .ui-slider-range { position: absolute; z-index: 1; height: 12px; display: block; border: 0; background: #337AB7; border-radius:10px; box-shadow: inset 2px 2px 5px rgba(0, 0, 0, 0.3), 1px 1px 5px rgba(255, 255, 255, 1); } .polzunok-container-2 .ui-slider-horizontal .ui-slider-range-min { left: 0; } .polzunok-container-2 .ui-slider-horizontal .ui-slider-range-max { right: 0; } |
Вариант 3
Для того чтобы рукоятка не выползала за рамки дорожки, можно добавить дополнительную. Дорожка ползунка в данном случае беcцветная, а рукоятка двигается по альтернативной дорожке, которая подкладывается под сладйер
Т.к. дорожка в данном примере получилась широкая, добавим на нее название слайдера или другой текст, который будет менять свое положение в зависимости от положения рукоятки
1 2 3 |
<div class="polzunok-container-3"> <div class="polzunok-3"><b>Вариант 3</b></div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
$(".polzunok-3").slider({ min: 0, max: 1000, value: 600, range: "min", animate: "fast", slide : function(event, ui) { var opt = $(".polzunok-3").data().uiSlider.options; if ((ui.value - opt.min) > (opt.max - opt.min)/2) { $(".polzunok-3 b").addClass("polzunok-text-left-3").removeClass("polzunok-text-right-3"); } else { $(".polzunok-3 b").addClass("polzunok-text-right-3").removeClass("polzunok-text-left-3"); } $(".polzunok-3 span").text(ui.value); } }); $(".polzunok-3 b").addClass("polzunok-text-left-3"); $(".polzunok-3").before("<div class='polzunok-bg-3'></div>"); $(".polzunok-3 span").text($(".polzunok-3").slider("value")); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
.polzunok-container-3 * { box-sizing: border-box; outline: none; } .polzunok-container-3 { padding: 10px 0; position: relative; } .polzunok-container-3 .polzunok-bg-3 { position: absolute; background: #BFE2FF; height: 32px; width:100%; box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3); } .polzunok-container-3 .ui-slider { position: relative; height: 32px; width: calc(100% - 80px); left: 40px; } .polzunok-container-3 .ui-slider b { position: absolute; font-size:18px; padding: 7px 20px; z-index:5; } .polzunok-container-3 .ui-slider .ui-slider-handle { position: absolute; margin-left:-40px; border: 1px solid #ccc; cursor: pointer; width: 80px; height: 32px; padding-top: 7px; z-index: 3; background: #FFF; font-size: 18px; text-align: center; background-image: linear-gradient(rgba(255, 255, 255, 0), rgba(0, 0, 0, 0.1)); } .polzunok-container-3 .ui-slider .ui-slider-range { position: absolute; z-index: 1; height: 32px; display: block; border: 0; background: #337AB7; box-shadow: inset 0px 1px 3px rgba(0, 0, 0, 0.3); } .polzunok-container-3 .ui-slider-horizontal .ui-slider-range-min, .polzunok-text-left-3 { left: -40px; color: #FFF; } .polzunok-container-3 .ui-slider-horizontal .ui-slider-range-max, .polzunok-text-right-3 { right: -40px; color: #000; } |
Вариант 4
В данном примере со стрелками используется шрифт FontAwesome. Если он не подключен на сайте, нужно в JS заменить стрелки <i class='fa fa-chevron-left'></i> и <i class='fa fa-chevron-right'></i> на другие.
1 2 3 |
<div class="polzunok-container-4"> <div class="polzunok-4"></div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$(".polzunok-4").slider({ min: 0, max: 10, value: 5, range: "min", animate: "fast", slide : function(event, ui) { $(".polzunok-4 span").text(ui.value); }, change : function(event, ui) { $(".polzunok-4 span").text(ui.value); } }); $(".polzunok-4 span").text($(".polzunok-4").slider("value")); $(".polzunok-4") .before("<div class='polzunok-4-left'><i class='fa fa-chevron-left'></i></div>") .before("<div class='polzunok-bg-4'></div>") .after("<div class='polzunok-4-right'><i class='fa fa-chevron-right'></i></div>"); $(".polzunok-4-left").click(function() { $(".polzunok-4").slider( "value", $(".polzunok-4").slider( "value" ) - 1 ); }); $(".polzunok-4-right").click(function() { $(".polzunok-4").slider( "value", $(".polzunok-4").slider( "value" ) + 1 ); }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
.polzunok-container-4 { margin: 30px; position: relative; } .polzunok-container-4:after { content: ""; clear: both; display: table; } .polzunok-4-left, .polzunok-4-right { width:60px; height:60px; font-size: 60px; line-height: 60px; text-align:center; color: #337AB7; cursor: pointer; float: left; position: relative; z-index: 6; transition: color 0.3s ease-in-out; } .polzunok-4-left:hover, .polzunok-4-right:hover { color: #000; } .polzunok-container-4 .polzunok-bg-4 { position: relative; top: 16px; background: #BFE2FF; height: 28px; width: calc(100% - 120px); float: left; } .polzunok-container-4 .polzunok-bg-4:after, .polzunok-container-4 .polzunok-bg-4:before { content: ""; height: 0; width: 0; border: 14px solid transparent; border-left-color: #BFE2FF; right: -28px; position: absolute; } .polzunok-container-4 .polzunok-bg-4:before { border-right-color: #337AB7; border-left-color: transparent; left: -28px; } .polzunok-container-4 .ui-slider { position: absolute; top: 16px; height: 28px; width: calc(100% - 180px); left: 90px; } .polzunok-container-4 .ui-slider .ui-slider-handle { position: absolute; margin-left:-30px; cursor: pointer; width: 60px; height: 28px; line-height: 28px; z-index: 3; background: #FFF; background: #337AB7; font-size: 18px; text-align:center; color: #FFF; } .polzunok-container-4 .ui-slider .ui-slider-handle:after, .polzunok-container-4 .ui-slider .ui-slider-handle:before { content: ""; height: 0; width: 0; border: 14px solid transparent; border-left-color: #337AB7; right: -28px; position: absolute; z-index: 4; } .polzunok-container-4 .ui-slider .ui-slider-handle:before { border-right-color: #337AB7; border-left-color: transparent; left: -28px; } .polzunok-container-4 .ui-slider .ui-slider-range { position: absolute; z-index: 1; height: 28px; display: block; border: 0; background: #337AB7; } .polzunok-container-4 .ui-slider-horizontal .ui-slider-range-min { left: -30px; } .polzunok-container-4 .ui-slider-horizontal .ui-slider-range-max { right: -30px; } |
Вариант 5
Последний пример с двумя рукояткамии и полями для ввода данных.
Слайдер сделан таким образом, чтобы нельзя было ввести невозможные значения данных, а именно:
- Значение первого поля для ввода не может быть больше, чем значение второго и меньше, чем задано настройками
- Значение второго поля для ввода не может быть меньше, чем значение первого и больше, чем задано настройками
- Из полей ввода удаляются все символы кроме цифр
Обработка введенных данных и расстановка рукояток происходит, когда форма не в фокусе.
1 2 3 4 5 |
<div class="polzunok-container-5"> <input type="text" class="polzunok-input-5-left" /> <input type="text" class="polzunok-input-5-right "/> <div class="polzunok-5"></div> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
$(".polzunok-5").slider({ min: 0, max: 5000, values: [2000, 3000], range: true, animate: "fast", slide : function(event, ui) { $(".polzunok-input-5-left").val(ui.values[ 0 ]); $(".polzunok-input-5-right").val(ui.values[ 1 ]); } }); $(".polzunok-input-5-left").val($(".polzunok-5").slider("values", 0)); $(".polzunok-input-5-right").val($(".polzunok-5").slider("values", 1)); $(".polzunok-container-5 input").change(function() { var input_left = $(".polzunok-input-5-left").val().replace(/[^0-9]/g, ''), opt_left = $(".polzunok-5").slider("option", "min"), where_right = $(".polzunok-5").slider("values", 1), input_right = $(".polzunok-input-5-right").val().replace(/[^0-9]/g, ''), opt_right = $(".polzunok-5").slider("option", "max"), where_left = $(".polzunok-5").slider("values", 0); if (input_left > where_right) { input_left = where_right; } if (input_left < opt_left) { input_left = opt_left; } if (input_left == "") { input_left = 0; } if (input_right < where_left) { input_right = where_left; } if (input_right > opt_right) { input_right = opt_right; } if (input_right == "") { input_right = 0; } $(".polzunok-input-5-left").val(input_left); $(".polzunok-input-5-right").val(input_right); if (input_left != where_left) { $(".polzunok-5").slider("values", 0, input_left); } if (input_right != where_right) { $(".polzunok-5").slider("values", 1, input_right); } }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
.polzunok-container-5 * { box-sizing: border-box; outline: none; } .polzunok-container-5 { padding: 10px 16px; margin: 30px; } .polzunok-container-5:after { content: ""; clear: both; display: table; } .polzunok-container-5 .ui-slider { position: relative; background: #BFE2FF; height: 10px; border-radius:10px; box-shadow: inset 2px 2px 5px rgba(0, 0, 0, 0.2), 1px 1px 5px rgba(255, 255, 255, 1); } .polzunok-container-5 .ui-slider .ui-slider-handle { position: absolute; margin-left: -16px; width: 32px; height: 32px; cursor: pointer; border-radius: 50%; border: 4px solid #BFE2FF; top: -11px; background: #FFF; z-index: 2; box-shadow: 0 2px 5px rgba(0,0,0,0.2), 0 4px 6px rgba(0,0,0,0.2); transition: transform 0.2s, border 0.4s; } .polzunok-container-5 .ui-slider .ui-slider-handle:hover, .polzunok-container-5 .ui-slider .ui-slider-handle:focus { transform: scale(1.2); border: 4px solid #337AB7; } .polzunok-input-5-left, .polzunok-input-5-right { height: 32px; background: #FFF; border-radius: 28px; border: 4px solid #BFE2FF; text-align:center; font-size: 18px; padding: 16px; width: 140px; margin-top:30px; box-shadow: 0 2px 5px rgba(0,0,0,0.2), 0 4px 6px rgba(0,0,0,0.2); } .polzunok-input-5-left { float: left; } .polzunok-input-5-right { float: right; } .polzunok-container-5 .ui-slider .ui-slider-range { position: absolute; z-index: 1; height: 10px; border: 0; background: #337AB7; border-radius:10px; box-shadow: inset 2px 2px 5px rgba(0, 0, 0, 0.3), 1px 1px 5px rgba(255, 255, 255, 1); } |
Я не стал описывать как работают те или иные строчки в коде. Поэтому если у вас возникнут какие-нибудь вопросы, или вы найдете ошибки - напишите об этом в комментариях.
Прошу помогите пожалуйста, вылазит ошибка "Uncaught ReferenceError: $ is not defined" js работает, я проверил, это проблема в коде наверное
Проблема в jQuery, она или не правильно подключена или, например, если WP, подключать нужно так:
Александр, спасибо огромное за ваши труды и примеры)
Спасибо огромное
Как можно в 5 варианте установить ограничения для ползунков? Например: левый - не больше 3000, правый - не меньше 2000.
И огромное спасибо за классный сайт!
Примерно так
А если я в 5 примере хочу своё значение в инпуты, но хочу чтоб ползунки всё равно перемещались. Грубо какой код отвечает за само перемещение ползунков
Не понял вообще, что значит "свое значение"
За перемещение ползунка при вводе данных вручную отвечает
и
А вообще, напишите лучше в ВК мне, думаю проще будет 🙂
Если в вариант 5 в окнах ввода проставить значения 5000 то ползунок после этого не передвинуть
Исправил
Спасибо большое!
Александр, еще хотел уточнить: как сделать сброс выбранных значений в начальные кнопкой без перезагрузки страницы? Заранее спасибо за ответы.
Это сюда: jQuery UI Slider - Методы (Установка значений для рукояток)
И привязать это на клик по какой нибудь кнопки
Просто начинаю изучать, знаний минимум, поэтому интересуют "живые примеры".
со сбросом по кнопке разобрался
Интересный слайдер, но при переходе по страницам категории /page/ /page/2/ /page/3/ и т.д. выбранные данные теряются и выставляются начальные значения.
Как возможно запомнить выставленные данные при переходе по сайту в пределах одной категории?
А для чего нужно такую форму гнать по всем страницам, если не секрет?
А вообще, можно писать куки при каждом изменении ползунка и при их наличии на другой странице выставлять в начальные.
Или строить ссылку на страницу в зависимости от выбранных данных и потом по ней выставлять слайдер этот.
Фильтр такой нужен для фильтрации пользователем определенного диапазона, например цены (в моем случае километража). Если в выборке получается на несколько десятков позиций, просто неудобно их все просмотреть на странице и приходится делать пагинацию, например по 10 или 20 позиций.
Насчет куков можно поподробнее? За живой пример дополнительное спасибо
Ну это я думаю не просто так делается...
Человек фильтрует, далее идет запрос, по нему выводятся соотв. позиции и вместе с ними должны выводиться страницы. Если по фильтрам нашлось, например, 30 позиций, то мы выводим 20, показываем 2 страницы, и ссылка на вторую соотв. получается не /page/2/, а что-то вида /page/2/?cat-1&filter1=10&filter2=20&filter3=30 и т.д.
И на основе этих данных будет строится вторая страница и соотв. этот фильтр.
Или каким то другим образом движок строит систему фильтров... Надо от этого отталкиваться думаю, а не просто придумать как ползунок сохранить на месте.
я в ручном порядке добавляю переменные в запрос - все выводится как надо. у меня проблема как вытащить значения ползунков и передать их в php-переменные...
Если это сделать, то остальное все будет работать как надо.
Ну так сложно судить...
Если параметрыпередаются и все выводится, то на их основе можно выводить новый скрипт, в котором начальное значение уже другое.
Параметры вывожу в инпутах, но передать их не могу . В этом сложности. Не могу понять как это сделать.
Так если параметры не передаются, как на их основе что то выводится?
Или "В ручном порядке" - это просто от руки в урл их вписать?
да, я вписываю вручную переменные и тогда все работает, но как их вытащить из скрипта я не знаю. в этом прошу помощи - как можно это сделать?
Напишите завтра в ВК
Посмотрим что есть и что надо.
Так проще будет рассказать что куда.
я не пользуюсь соцсетями... если возможно через почту, то мой адрес должны видеть
Первый вариант отображается с пустотой внутри кружков(ни нумерации, ни белого фона), может что-то не так со стилями?
Подключил всё правильно
Скорее всего со стилями, а можно ссылку на результат этот?
https://codepen.io/codeine98/pen/JjYxMpw?editors=1100
Вопрос снят, нужна была более свежая версия JQuery. Я использовал 2.1.3, а после подключения последней на данный момент (3.5.1) всё отобразилось как на примере.
Чувак, просто СПАСИБО!
Не за что 🙂
Рад что многим пригодилось
Спасибо за статью. Хочу узнать как к примеру в пятый пример добавить знак ₽ после значения стоимости, как я понимаю его нужно в js добавить?
Попробуйте:
https://atuin.ru/test/slderRUB.js
Пример:
https://atuin.ru/test/slderRUB.html
Спасибо! Классно и быстро прикрутил, но вот вопрос - По варианту 5, как доработать чтобы пробелы между тысячами вставлялось?
15 000 000
Попробуйте:
https://atuin.ru/test/toLocaleString.js
У вас написано:
Обработка введенных данных и расстановка рукояток происходит по клику на любом месте страницы.
а как сделать чтобы данные и рукоятки обрабатывались мгновенно при вводе?
Я так понял это про 5 вариант?
Я вначале так и сделал, чтобы мгновенно данные менялись, но тут есть 1 проблема.
Если первая рукоятка стоит, например на 600 и вы начинаете вводить данные во вторую (хотите ввести 1000), то написав 1, рукоятка сразу улетает на 600 (т.к. 1 быть не может).
И соотв, вписать 1000 во вторую рукоятку вы не сможете.
Спасибо за примеры, очень часто возникает потребность в 5 варианте, при создании фильтров.