Зависимость шага 2го ползунка от позиции первого
Заранее извиняюсь за криворукость - совершенно не знаю яву.. но старательно учусь :)
В идеале необходимо сделать так: 2 ползунка slider -главный, slider2 - "в подчинении" 1 имеет шкалы для перемещения 30,40,50,70,80,90,100,120,150 <- задачу, по изменению линейного шага я преодолел... 2 меняет свои шкалы в зависимости от позиции 1го ползуна.. т.е.: при текущем значении 1 = 30, шкалы у 2го = 30,40, при 1 = 40 - у второго = 30,40,60 и т.д. для разных позиций разные комбинации. Впоследствии каждой из комбинаций присвоить значение числовое (цена) - которое будет выводиться клиенту. В общем калькулятор на ползунках с нелинейными делениями ползунка с присвоением констант к каждой из комбинаций Пока вышла вот такая муть... https://gist.github.com/anonymous/0e...74379b062f0648 Помогите советом - буду признателен! |
А зачем первый задает диапазон, с какой целью?
|
slider зависимый ползунок
fos,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> body { font-family: sans-serif; font-size: 12px; } #amount, #amount2 { font-size: 22px; font-weight: bold; border:none; color: #ff5555; background: none; } #slider, #slider2{ width: 300px; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"> </script> <script> $(function() { var steps = [30, 40, 50, 60, 70, 80, 90, 100, 120, 150]; function comb(a) { return steps.filter(function(b, i) { return i < a + 2 && i > a - 2 }) } var steps2 = comb(0); $("#slider2").slider({ value: 0, min: 0, max: steps2.length - 1, step: 1, slide: function(event, ui) { $("#amount2").val(steps2[ui.value]) }, change: function(event, ui) { $("#amount2").val(steps2[ui.value]) } }); $("#slider").slider({ value: 0, min: 0, max: steps.length - 1, step: 1, slide: function(event, ui) { $("#amount").val(steps[ui.value]); steps2 = comb(ui.value); $("#slider2").slider("option", "max", steps2.length - 1); $("#slider2").slider("option", "value", steps2.indexOf(steps[ui.value])) }, change: function(event, ui) { $("#amount").val(steps[ui.value]); steps2 = comb(ui.value); $("#slider2").slider("option", "max", steps2.length - 1); $("#slider2").slider("option", "value", steps2.indexOf(steps[ui.value])) } }); $("#slider").slider("option", "value", 0) }); </script> </head> <body> <p> <input type="text" id="amount" readonly> </p> <div id="slider"></div> <p> <input type="text" id="amount2" readonly> </p> <div id="slider2"></div> </body> </html> |
Цитата:
|
Цитата:
|
Цитата:
Видимо я слишком дофига хочу :( Я уже подумываю над тем, чтобы не загонятся и сделать тупо кликабельное перечисление всех размером без каких либо ползунков.. но оно даже с моей фантазией не поддается красивой визуализации, возможной с ползунками... |
Цитата:
Пользователь же выбирает, например, категорию товаров, а получить мин. и макс. значения этого параметра для категории не проблема, и подставить их в диапазон. Да в общем то и плагины диапазонов есть, где ну никак не напутать. |
Цитата:
Цитата:
|
Цитата:
Чтобы более понятно было: нужно сделать калькулятор расчета стоимости портрета. Всего около 15 различных размеров, каждый из них стоит определенную деньгу, которую не получится в формулу уместить по параметру площади и т.д., т.е. втупую нужно каждому размеру задавать отдельный ценник, а выводить 15 размеров полотенцем на экран - юзер глаза себе выколет и убежит :) в выпадающий список прятать - тоже коряво.. ползунки идеально, но дефолтом доступен только шаг и макс,мин =\ Плагинов несколько качал, прогуглил порядка 20 страниц скриптов со связанными ползунками, нелинейным шагом ползунка и т.д. и в итоге получилось то чудовисче, которое получилось... :( |
Цитата:
Чтобы прям вот конкретно понять, что я хочу попробую на X, Y, G, Z объяснить... X - текущая шкала 1, Y - шкалы ползунка 2, G = текущее значение шкалы 2, Z = ценник, присваиваемый комбе позиций X и G. Дабы не оставалось комбинаций с 1 значением в шкале убрал величину 150, где только 1 размер 100х150 былбы... - и хнер с ним :) X = 30 -> Y = 30, 40 X = 40 -> Y = 30, 40, 60 X = 50 -> Y = 50, 70 X = 60 -> Y = 40, 60, 90 X = 70 -> Y = 50, 70, 100 X = 80 -> Y = 80, 120 X = 90 -> Y = 60, 90 X = 100 -> Y = 70, 100 X = 120 -> Y = 80, 120 X=30 & G=30 -> Z = 905, X=30 & G=40 и X=40 & G=30 -> Z = 1095, X=40 & G=40 -> Z = 1305, X=40 & G=60 и X=60 & G=40 -> Z = 1730, X=50 & G=50 -> Z = 1755, X=50 & G=70 и X=70 & G=50 -> Z = 2230, X=60 & G=60 -> Z = 2255, X=60 & G=90 и X=90 & G=60 -> Z = 3045, X=70 & G=70 -> Z = 3000, X=70 & G=100 и X=100 & G=70 -> Z = 3670, X=80 & G=80 -> Z = 3500, X=80 & G=120 и X=120 & G=80 -> Z = 4655, X=80 & G=80 -> Z = 3500, X=90 & G=90 -> Z = 4200, X=100 & G=100 -> Z = 4755, X=120 & G=120 -> Z = 6305, Цитата:
|
fos,
не понял ничего. |
Цитата:
попробую дообъяснить: X = 30 -> Y = 30, 40 - означает, что при ползунке1 в позиции "30", в ползунке 2 доступны шкалы 30 и 40... И так расписал все нужные комбинации.... X=30 & G=40 и X=40 & G=30 -> Z = 1095, - означает, что при позиции ползунка 1 = "30" и позиции ползуна 2 = "40" некая переменная (которая выводится на экран в виде "Стоимость: ___ " приобретает значение = 1095, равно как и комбинация 40 и 30... И так тоже расписал все присвоения для всех комбинаций.. Если это вообще реально сделать - мнебы хотябы наметки узреть для 2х комбинаций, остальные естественно я бы сам допилил :) Чувствую, что о5 невнятно объяснил... |
fos,
а в таком виде можно? var price = { 30: { 30: 1095, 40: 5000 }, 40: { 1: 400, 5: 7000 } }; |
var cena = { 30: { 30: 905, 40: 1095 }, 40: { 30: 1095, 40: 1305, 60: 1730 } 50: { 50: 1755, 70: 2230 } 60: { 40: 1730, 60: 2255, 90: 3045 } 70: { 50: 2230, 70: 3000, 100: 3670 } 80: { 80: 3500, 120: 4655 } 90: { 60: 3045, 90: 4200 } 100: { 70: 3670, 100: 4755 } 120: { 80: 4655, 120: 6305 } }; Надеюсь так понятнее получилось? В любом случае спасибо, что объяснили каким языком объяснять, что вообще хочу сделать :))) При этом собственно еще бы не только ценник присваивался, но и деления в ползуне2 менялись... |
fos,
запятых у вас маловато :) <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> body { font-family: sans-serif; font-size: 12px; } #amount, #amount2, #amount3 { font-size: 22px; font-weight: bold; border:none; color: #ff5555; background: none; } #slider, #slider2{ width: 300px; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"> </script> <script> $(function() { var price = { 30: { 30: 905, 40: 1095 }, 40: { 30: 1095, 40: 1305, 60: 1730 }, 50: { 50: 1755, 70: 2230 }, 60: { 40: 1730, 60: 2255, 90: 3045 }, 70: { 50: 2230, 70: 3000, 100: 3670 }, 80: { 80: 3500, 120: 4655 }, 90: { 60: 3045, 90: 4200 }, 100: { 70: 3670, 100: 4755 }, 120: { 80: 4655, 120: 6305 } }; function comb(a) { return Object.keys(a) } var steps = comb(price); var num = steps[0]; var steps2 = comb(price[num]); $("#slider2").slider({ value: 0, min: 0, max: steps2.length - 1, step: 1, slide: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); $("#amount3").val(price[num][Y]); }, change: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); $("#amount3").val(price[num][Y]); } }); $("#slider").slider({ value: 0, min: 0, max: steps.length - 1, step: 1, slide: function(event, ui) { num = steps[ui.value]; $("#amount").val(num); steps2 = comb(price[num]); $("#slider2").slider("option","max", steps2.length - 1); $("#slider2").slider("option", "value", 0) }, change: function(event, ui) { num = steps[ui.value]; $("#amount").val(num); steps2 = comb(price[num]); $("#slider2").slider("option","max", steps2.length - 1); $("#slider2").slider("option", "value", 0) } }); $("#slider").slider("option", "value", 0) }); </script> </head> <body> <p> <input type="text" id="amount" readonly> </p> <div id="slider"></div> <p> <input type="text" id="amount2" readonly> </p> <div id="slider2"></div> <p> <input type="text" id="amount3" readonly> </p> </body> </html> |
Цитата:
Еще один вопрос назрел (сорри за наглость...) А ползунок 2 каким-то параметром можно заставить отображаться вертикально, а не горизонтально? |
Цитата:
|
Цитата:
Если нужно помочь с подарком по какому-либо поводу - пиши, помогу!!! |
Цитата:
|
fos,
за чёрточками лучше сюда ... http://ionden.com/a/plugins/ion.rangeSlider/ |
Цитата:
Т.е. можно подключить сию хреновину и заменив $("#slider").slider({ на $("#slider").ionRangeSlider({ можно настаивать визуализацию, добавляя расширенный функционал к запуску, не перекарячивая остальной код скрипта??? |
fos,
не понял ... по моему так код нужно новый писать. |
Цитата:
т.е. обернуть этот код в красивую оболочку ionrange-слайдера не получится и придется все вновь вообще делать, используя другие функции и переменные? :( |
fos,
да |
|
Цитата:
|
slider зависимый ползунок + создание шкалы
Цитата:
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> body { font-family: sans-serif; font-size: 12px; } #amount, #amount2, #amount3 { font-size: 22px; font-weight: bold; border:none; color: #ff5555; background: none; } #slider{ background-image:-webkit-gradient(linear,left,right,color-stop(0,#FFD700),color-stop(1,#FF4500)); background-image:-o-linear-gradient(left,#FFD700,#FF4500); background-image:-moz-linear-gradient(left,#FFD700,#FF4500); background-image:-webkit-linear-gradient(left,#FFD700,#FF4500); background-image:linear-gradient(to right,#FFD700,#FF4500); margin-bottom: 40px; height: 6px; width: 300px; } #slider2{ background-image:-webkit-gradient(linear,left,right,color-stop(0,#FFD700),color-stop(1,#FF4500)); background-image:-o-linear-gradient(left,#FFD700,#FF4500); background-image:-moz-linear-gradient(left,#FFD700,#FF4500); background-image:-webkit-linear-gradient(left,#FFD700,#FF4500); background-image:linear-gradient(to right,#FFD700,#FF4500); height: 300px; width: 6px; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> <link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/themes/smoothness/jquery-ui.css"> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.4/jquery-ui.min.js"> </script> <script> $(function() { var price = { 30: { 30: 905, 40: 1095 }, 40: { 30: 1095, 40: 1305, 60: 1730 }, 50: { 50: 1755, 70: 2230 }, 60: { 40: 1730, 60: 2255, 90: 3045 }, 70: { 50: 2230, 70: 3000, 100: 3670 }, 80: { 80: 3500, 120: 4655 }, 90: { 60: 3045, 90: 4200 }, 100: { 70: 3670, 100: 4755 }, 120: { 80: 4655, 120: 6305 } }; function comb(a) { return Object.keys(a) } var steps = comb(price); var num = steps[0]; var steps2 = comb(price[num]); $("#slider2").slider({ orientation: "vertical", value: 0, min: 0, max: steps2.length - 1, step: 1, slide: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); $("#amount3").val(price[num][Y]); }, change: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); $("#amount3").val(price[num][Y]); } }); $("#slider").slider({ value: 0, min: 0, max: steps.length - 1, step: 1, slide: function(event, ui) { num = steps[ui.value]; $("#amount").val(num); steps2 = comb(price[num]); $("#slider2").slider("option","max", steps2.length - 1); $("#slider2").slider("option", "value", 0); scale(steps2, "#slider2") }, change: function(event, ui) { num = steps[ui.value]; $("#amount").val(num); steps2 = comb(price[num]); $("#slider2").slider("option","max", steps2.length - 1); $("#slider2").slider("option", "value", 0); scale(steps2, "#slider2") } }); $("#slider").slider("option", "value", 0) ; function scale(arr, elem, width) { $(".cm", elem).remove(); var w = 100/(arr.length-1)||100; !width && (arr = arr.slice().reverse()); $.each(arr, function(i, num){ var css = width ? {left : w * i+"%", width : w} : {top : w * i+"%", height : w}; $("<div>",{"class" : "cm", "rel" : num, "css" : css}).appendTo(elem); }); } scale(steps, "#slider", true) }); </script> <style type="text/css"> #slider .cm { margin: 10px auto; position: absolute; border-left: 1px solid #555; height: 14px; } #slider .cm:after { position: absolute; bottom: -15px; font: 11px/1 sans-serif; } #slider2 .cm { margin: auto 10px; position: absolute; border-top: 1px solid #555; width: 14px; } #slider2 .cm:after { position: absolute; right: -15px; font: 11px/1 sans-serif; } .cm:after { content: attr(rel); } .ui-slider-handle{border-radius:50%; font-size: 12px;} .ui-slider-horizontal .ui-slider-handle { top: -0.5em; } .ui-slider-vertical .ui-slider-handle { left: -0.5em; } :focus{ outline:0; border:0; } </style> </head> <body> <p> <input type="text" id="amount" readonly> </p> <div id="slider"></div> <p> <input type="text" id="amount2" readonly> </p> <div id="slider2"></div> <p> <input type="text" id="amount3" readonly> </p> </body> </html> |
Цитата:
|
Все круто работает, профессор крутой! :)
Теперь добрался до следующей стадии, когда мои клешни за час 11 раз сломали работоспособность кода... залил на гитхаб текущую стадию опытного образца - там div с id="olol" как его заставить менять свой width\height согласно значениям в инпутах #amount (ширина) и #amount2 (высота) помноженное на 3? т.е. если ползунок 1 в шкале 50, а ползунок 2 в шкале 70, то ширина #olol = 150px , а высота 210px Я вот сейчас вчитался, что написал и понял, что снова объяснил туго... Нашел тут тему, где говорят использовать "style.width|height" и по гетэлементайди привинчивать, но алгаритмики в моем мозгу пока не хватает, чтобы понять куда именно, чтобы код не поломать :\ |
Цитата:
|
Ссылка на jbin
Фигово сохранилось предыдущее.. |
Цитата:
ниже строки 12 и 18 $("#slider2").slider({ orientation: "vertical", value: 0, min: 0, max: steps2.length - 1, step: 1, range: "max", animate: "slow", slide: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); $("#amount3").val(price[num][Y]); $("#olol").css({width : num * 3, height : Y*3}) }, change: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); $("#amount3").val(price[num][Y]); $("#olol").css({width : num * 3, height : Y*3}) } }); |
Цитата:
|
По сути осталась последняя стадия (ну или предпоследняя)
код расчета стоимости при смене ползунка доделал с переменной 'obra' var price = { 30: { 30: 905 + obra, 40: 1095 + obra }, 40: { 30: 1095 + obra, 40: 1305 + obra, 60: 1730 + obra },и т.д., и добавил в хтмл селектор: <select id="obra"> <option value="1250">Портрет "под масло"</option> <option value="1250">В стиле GTA</option> <option value="500">В стиле "Грандж"</option> <option value="950">Поп-арт портрет</option> </select> Как сделать правильно функцию, чтобы при смене селектора в #amount3 выводило ценник с учетом ценника обработки? :) нагуглил очередную длиннофункцию obra = document.getElementById('obra').options[document.getElementById('obra').selectedIndex].value;; и чую это бред получица.. |
fos,
obra из price убрать, заменить инициализацию slider2 и добавить change для селекта. $("#slider2").slider({ orientation: "vertical", value: 0, min: 0, max: steps2.length - 1, step: 1, range: "max", animate: "slow", slide: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); var obra = +$("#obra").val(); $("#amount3").val(price[num][Y]+obra); $("#olol").css({width : num * 3, height : Y*3}) }, change: function(event, ui) { var Y = steps2[ui.value]; $("#amount2").val(Y); var obra = +$("#obra").val(); $("#amount3").val(price[num][Y]+obra); $("#olol").css({width : num * 3, height : Y*3}) } }); $("#obra").on("change", function() { $("#slider2").slider("option", "value", 0); }) и у вас без reverse неправильно формируются чёрточки для вертикального ползунка пост 27 строка 141 |
Цитата:
По поводу obra - гигантское спасибо :) и если лс открыто - прошу ответить на сообщение, которое сейчас отправлю :) |
Вернемся к нашим баранам :)
имеется тотже селектор: <select id="obra"> <option value="1250">Портрет "под масло"</option> <option value="1250">В стиле GTA</option> <option value="500">В стиле "Грандж"</option> <option value="950">Поп-арт портрет</option> </select> И появился буттоны с id=obrpm, id=obrgta, id=obrgrng, id=obrpopart Как сделать так, чтобы по клику на буттн id=obrpm - в селекторе выбирался пункт <option value="1250">Портрет "под масло"</option> при клике на id=obrgta выбирался пункт <option value="1250">В стиле GTA</option> и т.д.? :) |
fos,
заменить $("#obra").on("change", function() { $("#slider2").slider("option", "value", 0); $(".but")[this.selectedIndex].checked = true }) добавить $(".but").on("click", function() { var i = $(".but").index(this); $("#obra")[0].selectedIndex = i; $("#obra").trigger("change") }) <label>Портрет "под масло"<input name="obr" type="radio" class="but" checked="checked"></label> <label>В стиле GTA<input name="obr" type="radio" class="but"></label> <label>В стиле "Грандж"<input name="obr" type="radio" class="but"></label> <label>Поп-арт портрет<input name="obr" type="radio" class="but"></label> по желанию label{ display: block; } |
Цитата:
|
Привет, Рони! Не могу понять, почему значение 2 ползунка сбрасываются на ноль при каждом движении 1 ползунка?
|
Часовой пояс GMT +3, время: 00:46. |